Ceiling enforcement can be used for cases when a hard limit on the amount of CPU that a cgroup can utilize is required
当一个资源组里,同时设置了 cfs_quote_us 和 shares,会怎样呢?
下面通过场景来回答这个问题。
假设系统有3 个 CPU 核,有2个资源组 A、B,配置如下:
A.shares : B.shares = 2:1
A 用 2 个 CPU、B 用 1 个 CPU,把系统压满了。这是,增加如下设置:
A.cfs_quote_us = 100ms
A.cfs_period_us = 100ms
这时,A 只能用 1 个 CPU 了。而 B 呢?因为还有空闲 CPU,B 会用满 2 个 CPU。
假设系统有 4 个 CPU 核,有 3 个资源组 A、B、C,配置如下:
A.shares : B.shares : C.shares = 2:1:1
A 用 2 个 CPU、B 用 1 个 CPU、C 用 1 个 CPU,把系统压满了。这是,增加如下设置:
A.cfs_quote_us = 100ms
A.cfs_period_us = 100ms
这时,A 只能用 1 个 CPU 了。而 B、C 呢?B 会用 1.5 个 CPU、C 会用 1.5 个 CPU。
所以说,当资源组的资源被 quota 限制住后,它就不再参与 share 竞争了,剩下的资源由其它 share 之间瓜分。
从 CPU 调度的角度看,这个很好理解。CPU 有一个时间片,它会去决策调度 A、B、C,那么它发现 A 无法被调度,那么它就要从 B、C 里面选,而考虑到 shares 的规范,B 和 C 有相同的概率被选中,于是就相当于 B、C 会平分资源。假设 B 上面已经没有更多任务了,那么就只剩下 C 可以参与调度,那么这时候 C 实际能拿到的 CPU 就比 1.5 还多。
CPU 的原则: