4

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

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

(例如 cfs_quota_us 会优先于共享吗?)

谢谢你的期待!

4

1 回答 1

4

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

foo
 |
 +- bar
 |
 +- baz

那么barbaz首先根据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也会因为同样的原因而消耗 25ms 作为bar吗?如果是,那么我们如何把剩下的 50 毫秒?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并将他们的配额保留为他们的cpu.cfs_quota_us,并将超出的部分收集为未使用的cpu池。再次将这些未使用的 cpu 池分配给其他 cgroup cpu.share,并如上迭代,直到没有 cgroup 超过上限。

于 2019-04-30T05:55:03.607 回答