1

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?

1
+100

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.

  • So basically, for internet browsers it's better to use 1s period? – Mikhail Morfikov Dec 26 '18 at 19:02
  • If you want it to be laggy, then yes. The higher the number the longer the latency. With 1s, you will wait on average ½ a second, for a process. There are some caveats thought. If there are fewer processes than processor cores, then there is no preemption (this number has no effect). If an event comes in, then it will most likely trigger a preemption, because of dynamic priority (so number has no effect). Anything with animation may become stutterey. You may see other effects. – ctrl-alt-delor Dec 26 '18 at 20:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.