我正在使用 centos6/7 并使用 cgroup 来管理 cpu 资源。我已通读RHEL 文档,但没有回答以下问题:
如果我同时设置 cfs_quota_us 和 cgroups 之间的共享,那么会发生什么?
(例如 cfs_quota_us 会优先于共享吗?)
谢谢你的期待!
我的理解是,对于同一级别的两个 cgroup(仅),例如:
foo
|
+- bar
|
+- baz
那么bar和baz会首先根据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也会因为同样的原因而消耗 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 超过上限。