I am trying to put a hard limit in CPU usage for a dd command . I have created the following unit file
[Unit]
Description=Virtual Distributed Ethernet
[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%
[Install]
WantedBy=multi-user.target
which call the following simple script
#!/bin/sh
dd if=/dev/zero of=/dev/null bs=1024k
As I have seen in this guide, the CPU usage for my dd
service should not exceed the 10%. But when I run the system-cgtop
command the usage is about 70-75% .
Any ideas of what am I doing wrong and how can I fix it?
When I execute systemctl show dd
I get the following results regarding CPU
CPUShares=18446744073709551615
StartupCPUShares=18446744073709551615
CPUQuotaPerSecUSec=100ms
LimitCPU=18446744073709551615
Best Answer
The Good
Your solution is the correct and should actually be quite future-proof; by using systemd to control the services cgroup settings, eg. CPUQota.
See the
man systemd.resource-control
for more useful cgroup settings in systemd.The Bad
There are two caveats to this though, which I (and possibly a few others) stumpled upon. Those caveats are really difficult to track down as there does not seem to be much easily findable information about this, which is the main reason for this answer.
Caveat 1:
The
CPUQuota
setting is only available since systemd 213, see https://github.com/systemd/systemd/blob/master/NEWSThis is for example an issue with Debian Jessie which only comes with systemd 208. As an alternative one could configure
cpu.cfs_period_us
andcpu.cfs_quota_us
manually usingcgcreate
andcgset
from the cgroup-bin package, eg.Caveat 2
For the settings
cpu.cfs_period_us
andcpu.cfs_quota_us
to be available the Kernel needs to be compiled with config-flagCONFIG_CFS_BANDWIDTH
. Sadly the 3.16.x Kernel for Debian Jessie is not compiled with this flag by default, see this feature request.This will be available in Debian Stretch though. One could also use the kernel from jessie-backports, which should have the flag enabled.
I hope this answer helps a few people with the same issue as me...
PS: An easy way to test wether CPUquota is working in your environment is:
and watch with
top
orhtop
, the load should be spread (evenly) accross all cpus/cores, summing up to 25%.Alternative
As an alternative tool one could use cpu-limit which should be available in most distros, eg.
It works by sending
SIGSTOP
andSIGCONT
to the attached command to pause and resume its operation.AFAIK it was difficult to control multiple separate/stand-alone processes simultaneously with this, in like group them together, but there might also be solution for this...