在 cpu.cfs_period_us 中使用更长/更短的周期有什么好处?

在 cpu.cfs_period_us 中使用更长/更短的周期有什么好处?

当您想限制每个进程的 CPU 时间时,可以通过cgroups.有两个参数可以完成这项工作:cpu.cfs_period_uscpu.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

正如引文所说,数字越低,延迟越短。进程在被调度之前不必等待很长时间:每个进程很快都会轮到。然而,重新调度的开销更大:每次时间用完,并且有其他进程准备运行时,就会重新调度。

重新调度涉及保存堆栈上的所有寄存器,将堆栈指针保存到任务控制块中,切换任务控制块,禁用/启用虚拟页表的部分,重新​​加载堆栈指针,以及恢复寄存器。它还可能导致更多缓存未命中。简而言之,事情运行得更慢。

对于长时间运行的非交互式任务,调度程序周期越长越好。批处理调度程序的调度周期较长,并且比标准交互式调度程序以较低的优先级运行。

相关内容