![在 cpu.cfs_period_us 中使用更长/更短的周期有什么好处?](https://linux22.com/image/144783/%E5%9C%A8%20cpu.cfs_period_us%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%9B%B4%E9%95%BF%2F%E6%9B%B4%E7%9F%AD%E7%9A%84%E5%91%A8%E6%9C%9F%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%A4%84%EF%BC%9F.png)
当您想限制每个进程的 CPU 时间时,可以通过cgroups
.有两个参数可以完成这项工作:cpu.cfs_period_us
和cpu.cfs_quota_us
。
- cpu.cfs_period_us:每个调度程序周期的持续时间(以微秒为单位),用于带宽决策。默认为 100000us 或 100ms。较大的周期将提高吞吐量,但会增加延迟,因为调度程序将能够更长时间地维持 CPU 密集型工作负载。对于较小的时期,情况正好相反。请注意,这仅影响由 CFS 调度程序调度的非 RT 任务。
- cpu.cfs_quota_us:当前组的每个 cfs_period_us 期间允许运行的最长时间(以微秒为单位)。例如,如果将其设置为 cpu_period_us 的一半,则 cgroup 将只能在 50% 的时间内达到峰值运行。应该注意的是,这代表系统中所有 CPU 的总时间。因此,例如,为了允许充分利用两个 CPU,应将该值设置为 cfs_period_us 值的两倍。
假设我想将一个进程限制为 1 个 CPU 核心。这可以通过以下方式完成:
cpu.cfs_quota_us 1.000.000
cpu.cfs_period_us 1.000.000
与
cpu.cfs_quota_us 100.000
cpu.cfs_period_us 100.000
与
cpu.cfs_quota_us 10.000
cpu.cfs_period_us 10.000
这三个选项有什么区别?假设我有一个 Firefox 进程,什么cpu.cfs_period_us
对它更好——更长还是更短,为什么?
答案1
正如引文所说,数字越低,延迟越短。进程在被调度之前不必等待很长时间:每个进程很快都会轮到。然而,重新调度的开销更大:每次时间用完,并且有其他进程准备运行时,就会重新调度。
重新调度涉及保存堆栈上的所有寄存器,将堆栈指针保存到任务控制块中,切换任务控制块,禁用/启用虚拟页表的部分,重新加载堆栈指针,以及恢复寄存器。它还可能导致更多缓存未命中。简而言之,事情运行得更慢。
对于长时间运行的非交互式任务,调度程序周期越长越好。批处理调度程序的调度周期较长,并且比标准交互式调度程序以较低的优先级运行。