我一直在尝试了解 Linux 内核中的 Completely Fair Scheduler 如何进行 CPU 带宽控制。
经过多次阅读后,我仍然无法理解 CFS 如何允许每个 cgroup 定义自己的 CFS 周期以及它如何与kernel.sched_cfs_bandwidth_slice_us
sysctl 设置联系起来。
示例 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 的情况。