cgroups 中定义的 cpu.cfs_ period_us 和 kernel.sched_cfs_bandwidth_slice_us 有何关系?

cgroups 中定义的 cpu.cfs_ period_us 和 kernel.sched_cfs_bandwidth_slice_us 有何关系?

我一直在尝试了解 Linux 内核中的 Completely Fair Scheduler 如何进行 CPU 带宽控制。

经过多次阅读后,我仍然无法理解 CFS 如何允许每个 cgroup 定义自己的 CFS 周期以及它如何与kernel.sched_cfs_bandwidth_slice_ussysctl 设置联系起来。

示例 A:在单 CPU 计算机上,有两个定义了不同 CFS 周期的 cgroup。每个cgroup的配额代表CPU时间的50%,总计100%。

cgroup-A: cpu.cfs_period_us=100ms
          cpu.cfs_quota_us=50ms
cgroup-B: cpu.cfs_period_us=1000ms
          cpu.cfs_quota_us=500ms

如果每个 cgroup 都有一个正在运行的进程,那么在给定 CFS 周期的情况下如何调度这些进程(假设两个进程始终需要 CPU 时间)?

示例 B:当 cgroup-B 的配额高于实际物理上可能满足的配额时,会发生什么情况,即。 cgroup-B 设置了 90% 的 CPU 时间,cgroup-A 继续将配额设置为 50% 的 CPU 时间。

cgroup-A: cpu.cfs_period_us=100ms
          cpu.cfs_quota_us=50ms
cgroup-B: cpu.cfs_period_us=1000ms
          cpu.cfs_quota_us=900ms

在配额超额的情况下,CFS将如何调度进程?

答案1

如果每个 cgroup 都有一个正在运行的进程,那么在给定 CFS 周期的情况下如何调度这些进程(假设两个进程始终需要 CPU 时间)?

您所配置的意味着 cpu 核心/HT 的 50%,并不意味着整个系统的 50%。

在配额超额的情况下,CFS将如何调度进程?

与上面相同,没有任何超额订阅,它只是意味着两个进程可以分别使用 0.5 个 cpu 和 0.9 个 cpu 时间。为了理解这一点,请考虑一下您的系统中有 20 个 cpu 核心/HT 的情况。

相关内容