我的理解是,对于同一级别的两个cgroup(仅),例如:
foo
|
+- bar
|
+- baz
Run Code Online (Sandbox Code Playgroud)
那么bar和baz会首先根据共享foo上占用的cpu cpu.share。
假设整个 cpu 是 1 个核心,cpu.cfs_period_us设置为100ms。barcpu.share设置为1024 , baz设置为1024。
如果bar和baz设置cpu.cfs_quota_us超过50ms,例如75ms。然后两个 cgroup 将共享一半的 cpu,精确值为50ms。
如果两者都cpu.cfs_quota_us设置小于50ms,例如25ms。他们仍然会以 1:1 的比例共享 cpu,但精确值为25ms。
如果bar将配额设置为25ms,而baz将配额设置为75ms会怎么样(这正是我想知道的)。由于bar和baz具有相同的功能cpu.share,并且bar 的上限设置为25ms,这意味着bar永远不能超过25ms。因此,给定 100ms 的周期,bar将消耗25ms。baz也会因为同样的原因而像bar一样消耗 25ms吗?如果是的话,那么我们如何剩下50ms呢?cpu.share
根据RHEL6的文档:
由于 CFS 不要求平等使用 CPU,因此很难预测一个 cgroup 将允许使用多少 CPU 时间。当一个 cgroup 中的任务空闲且未使用任何 CPU 时间时,剩余时间将收集在未使用 CPU 周期的全局池中。允许其他 cgroup 从此池借用 CPU 周期。
我们可以看到baz消耗unsed的CPU周期是合法的,即baz在一个周期内会消耗75ms。
结论
cpu.share并cpu.cfs_quota_us正在共同努力。
给定总的cpu配额,我们应该首先分配cpu.share每个cgroup的配额。然后找到确切配额超出其配额的cgroup cpu.cfs_quota_us,找到所有此类cgroup并将其配额保留为their cpu.cfs_quota_us,并将超出的部分收集为未使用的cpu池。再次将这些未使用的cpu池分配给其他cgroup cpu.share,并如上迭代,直到没有cgroup超过上限。