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?