控制 cpu 资源,需要使用 requests 和 limits 属性
简而言之
Requests 表现出来的是 Cgroups 中的进程在 CFS 调度器上的 cpu.shares,而 Limit 则是 CFS 上的带宽限制
requests 和 limits 实际上使用的是不同的算法来控制 cpu 资源
先说 requests
在 docker run 中 使用 –cpu-shares 可以按照比例来分配 cpu 资源
例如 两个容器
docker run --name c1 -itd --rm -c 1024 progrium/stress --cpu 6
docker run --name c2 -itd --rm -c 2048 progrium/stress --cpu 6
–cpu-shares 只能提供 按照一定比例的 竞争关系,所以当只有一个容器时,该容器仍然可以获得全部的cpu资源
docker run --name c1 -itd --rm -c 1024 progrium/stress --cpu 6
在kubernetes上
使用 agileek/cpuset-test 镜像来进行压测,在 节点 slave2 上一共有6个内核16G内存
当只存在一个 requests 100m 的 s1 ,且 只有一个 replica 的时候,因为没有竞争,它仍然可以吃掉 100%的cpu
name: s1
resources:
requests:
cpu: 100m
可惜的是这个镜像好像对多核cpu支持的不是特别号,我在这个节点上有6个内核,这里我需要把 replica 调整到6,才能将这个节点上的6个内核都吃光
我们加入一个竞争者,克隆 s1 到 s2 ,在s2上调整 requests 到50m
最终在 slave2 节点上有
s1 (100m)* 6
s2 (50m) * 6
可以看到 s1 和 s2 的 cpu 占用比逐渐向 4:2 靠近
Limits 表现出来的是 cpu.cfs_period_us和cpu.cfs_quota_us属性
cpu.cfs_period_us: 设定时间周期(单位为微秒(μs)), 必须与 cfs_quota_us 配合使用。
cpu.cfs_quota_us : 设定周期内最多可使用的时间(单位为微秒(μs))。 这里的配置指 task对单个 cpu 的使用上限。
例如要设置成限制为 50%
将 cpu.cfs_quota_us 设为 50000,相对于 cpu.cfs_period_us 的 100000 是 50%
设置
s1 requests 100m limits 100m
s2 requests 50m limits 50m
会得到
这种情况下总cpu使用率直接下降到 6%,内核应用曲线几乎都降到了0