What are the benefits of using longer/shorter periods in cpu.cfs_period_us

cgroupscpukernel

When you want to limit CPU time per process, you can do it via cgroups. There are two parameters that can do the job: cpu.cfs_period_us and cpu.cfs_quota_us.

There's some info on the parameters here:

  • cpu.cfs_period_us: The duration in microseconds of each scheduler period, for bandwidth decisions. This defaults to 100000us or 100ms.
    Larger periods will improve throughput at the expense of latency,
    since the scheduler will be able to sustain a cpu-bound workload for
    longer. The opposite of true for smaller periods. Note that this only
    affects non-RT tasks that are scheduled by the CFS scheduler.
  • cpu.cfs_quota_us: The maximum time in microseconds during each cfs_period_us in for the current group will be allowed to run. For
    instance, if it is set to half of cpu_period_us, the cgroup will
    only be able to peak run for 50 % of the time. One should note that
    this represents aggregate time over all CPUs in the system.
    Therefore, in order to allow full usage of two CPUs, for instance,
    one should set this value to twice the value of cfs_period_us.

Let's say I want to limit a process to 1 CPU core. This can be done in the following ways:

cpu.cfs_quota_us   1.000.000
cpu.cfs_period_us  1.000.000

vs.

cpu.cfs_quota_us   100.000
cpu.cfs_period_us  100.000

vs.

cpu.cfs_quota_us   10.000
cpu.cfs_period_us  10.000

What's the difference between the three options? Let's say I have a Firefox process, what cpu.cfs_period_us is better for it — longer or shorter and why?

Best Answer

As the quote says lower number give lower latency. A process does not have to wait long before it is scheduled: Every process gets a turn, soon. However there is more re-scheduling overhead: Every time the time runs out, and there are other processes ready to run, there is a re-schedule.

Re-scheduling involves saving all registers on the stack, saving the stack-pointer into the task-control-block, switching task-control-block, disabling/enabling parts of the virtual-page-table, reloading the stack-pointer, and restoring the registers. It can also cause more cache misses. So in short things run slower.

For long-running non-interactive tasks a longer scheduler period is better. The batch scheduler has a longer scheduler period, and runs at a lower priority than the standard interactive scheduler.

Related Question