cgroup上下文中cpu.shares和cpu.cfs_quota_us之间有什么关系?

mag*_*odo 5 cpu cgroups cfs

我使用的是centos6/7并使用cgroup来管理cpu资源。我已阅读RHEL 文档,但没有回答我的以下问题:

如果我同时设置了 cfs_quota_us 和 cgroup 之间的共享,那么会发生什么?

(例如,cfs_quota_us 会优先于份额吗?)

谢谢期待!

mag*_*odo 6

我的理解是,对于同一级别的两个cgroup(仅),例如:

foo
 |
 +- bar
 |
 +- baz
Run Code Online (Sandbox Code Playgroud)

那么barbaz会首先根据共享foo上占用的cpu cpu.share

假设整个 cpu 是 1 个核心,cpu.cfs_period_us设置为100msbarcpu.share设置为1024 baz设置1024

  1. 如果barbaz设置cpu.cfs_quota_us超过50ms,例如75ms。然后两个 cgroup 将共享一半的 cpu,精确值为50ms

  2. 如果两者都cpu.cfs_quota_us设置小于50ms,例如25ms。他们仍然会以 1:1 的比例共享 cpu,但精确值为25ms

  3. 如果bar将配额设置为25ms,而baz将配额设置为75ms会怎么样(这正是我想知道的)。由于barbaz具有相同的功能cpu.share,并且bar 的上限设置为25ms,这意味着bar永远不能超过25ms。因此,给定 100ms 的周期,bar将消耗25msbaz也会因为同样的原因而像bar一样消耗 25ms吗?如果是的话,那么我们如何剩下50ms呢?cpu.share

    根据RHEL6的文档

    由于 CFS 不要求平等使用 CPU,因此很难预测一个 cgroup 将允许使用多少 CPU 时间。当一个 cgroup 中的任务空闲且未使用任何 CPU 时间时,剩余时间将收集在未使用 CPU 周期的全局池中。允许其他 cgroup 从此池借用 CPU 周期。

    我们可以看到baz消耗unsed的CPU周期是合法的,即baz在一个周期内会消耗75ms

结论

cpu.sharecpu.cfs_quota_us正在共同努力。

给定总的cpu配额,我们应该首先分配cpu.share每个cgroup的配额。然后找到确切配额超出其配额的cgroup cpu.cfs_quota_us,找到所有此类cgroup并将其配额保留为their cpu.cfs_quota_us,并将超出的部分收集为未使用的cpu池。再次将这些未使用的cpu池分配给其他cgroup cpu.share,并如上迭代,直到没有cgroup超过上限。