Kubernetes CPU 资源控制

控制 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

Send a Message