应用启动时 CPU 突增

最近更新时间:2023-10-24 10:31:21

我的收藏

简介

在通常情况下,应用程序在发布或重启过程中可能会出现 CPU 使用率波动增高,甚至可以消耗掉集群所有资源的现象。这主要是因为在应用程序启动时,Java虚拟机(JVM)需要重新进行类加载和对象初始化操作,导致 CPU 在整个过程中承担更多的编译任务。
在 Kubernetes 的场景中,应用程序都是通过 Pod 中的容器部署,每个容器都可以设置 Request 和 Limit 来控制资源使用的下限和上限。如果 Limit 设置的过低,就容易导致上述应用启动缓慢,甚至因为资源不够无法启动;如果 Limit 设置得过高,那后续在应用的运行过程中,又容易使用过量资源,与其他应用形成资源竞争关系。

功能说明

使用方式

设置应用的启动时间,以及 Limit 扩大的倍数,在应用启动的初始阶段增加应用使用资源的上限。

注意事项

业务启动时资源突增的能力依赖原生节点的内核,该功能仅支持在 原生节点 中使用。
在使用该功能之前,需要提前安装 QoS Agent。确保 QoS Agent 组件版本在1.1.4及以上。

功能原理

在 Kubernetes 中,资源限制(Limit)是通过 CPU cgroup 控制模块中的 cpu.cfs_period_us 和 cpu.cfs_quota_us 两个配置来实现的。Kubernetes 会为容器的 cgroup 配置这两个信息。通过调整 Pod 所在节点的 cgroup 中 cpu.cfs_quota_us 的数值,实现临时资源突增,从而增加应用在启动阶段的资源使用上限。

使用方式

安装组件

1. 登录 容器服务控制台,在左侧导航栏中选择集群
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建
4. 新建组件管理页面中勾选 QoS Agent
5. 单击完成即可安装组件。

开启应用启动时资源突增能力

1. 组件管理页面,查看 QoS Agent 组件版本。确保 QoS Agent 组件版本在1.1.4及以上。如果版本低于此要求,请单击组件右侧的升级进行升级。如下图所示:



2. 通过 kubectl 创建 PodQoS CRD 对象,将其应用到需要启动突增的工作负载上。示例代码如下:
apiVersion: ensurance.crane.io/v1alpha1
kind: PodQOS
metadata:
name: exceed
spec:
labelSelector:
matchLabels:
app: 0kusa3 # 匹配到需要启动突增的工作负载上的标签
resourceQOS:
cpuQOS:
limitExceed:
time: 5 # 应用启动多长时间需要突增 Limit。单位:mins
value: "1.2" # Limit 突增的倍数

3. 创建工作负载。示例代码如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: 0kusa3 # 和 PodQoS 对象中的 matchLabels 要保持一致
spec:
replicas: 3
selector:
matchLabels:
app: 0kusa3
template:
metadata:
labels:
app: 0kusa3
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

4. 登录 Pod 所在节点,在节点上查看容器对应的 cfs_quota 数值。
路径:
/sys/fs/cgroup/cpu/kubepods/burstble/pod<id>/<containerid>/cpu.cfs_quota_us
示例:
/sys/fs/cgroup/cpu/kubepods/burstable/pod44ad741a-cbe6-48a2-a5b7-b6920df2fe40/645a0a88f23c2aca4b207ec2c3d83bbe760a5f2a4db812938042df5cb5054e18/cpu.cfs_quota_us
其中:
 pod<id>:<id>来自 Pod YAML 中的 UID 字段。
<containerid>:来自 Pod YAML 中的 containerID 字段。
在创建 PodQoS 之前,cpu.cfs_quota_us 的值为 cpu.cfs_period_us * Limit,例如:100000 * 0.5核 = 50000。



在创建 PodQoS 之后,当 Pod 重建后的前 5 分钟内,新的 cpu.cfs_quota_us 值为旧值乘以 1.2,即 Limit 被放大了。
注意:
Pod 重建后 Pod ID 会变化。