Setting absolute limits on CPU for Docker containers
I believe I've gotten this working. I had to restart my Docker daemon with --exec-driver=lxc
as I
could not find a way to pass cgroup arguments to libcontainer
. This approach worked for me:
# Run with absolute limit
sudo docker run --lxc-conf="lxc.cgroup.cpu.cfs_quota_us=50000" -it ubuntu bash
The necessary CFS docs on bandwidth limiting are here.
I briefly confirmed with sysbench that this does seem to introduce an absolute limit, as shown below:
$ sudo docker run --lxc-conf="lxc.cgroup.cpu.cfs_quota_us=10000" --lxc-conf="lxc.cgroup.cpu.cfs_period_us=50000" -it ubuntu bash
root@302e651c0686:/# sysbench --test=cpu --num-threads=1 run
<snip>
total time: 90.5450s
$ sudo docker run --lxc-conf="lxc.cgroup.cpu.cfs_quota_us=20000" --lxc-conf="lxc.cgroup.cpu.cfs_period_us=50000" -it ubuntu bash
root@302e651c0686:/# sysbench --test=cpu --num-threads=1 run
<snip>
total time: 45.0423s
Hamy
Updated on July 18, 2022Comments
-
Hamy almost 2 years
I'm trying to set absolute limits on Docker container CPU usage. The CPU shares concept (
docker run -c <shares>
) is relative, but I would like to say something like "let this container use at most 20ms of CPU time every 100ms. The closest answer I can find is a hint from the mailing list on usingcpu.cfs_quota_us
andcpu.cfs_period_us
. How does one use these settings when usingdocker run
?I don't have a strict requirement for either LXC-backed Docker (e.g. pre0.9) or later versions, just need to see an example of these settings being used--any links to relevant documentation or helpful blogs are very welcome too. I am currently using Ubuntu 12.04, and under
/sys/fs/cgroup/cpu/docker
I see these options:$ ls /sys/fs/cgroup/cpu/docker cgroup.clone_children cpu.cfs_quota_us cpu.stat cgroup.event_control cpu.rt_period_us notify_on_release cgroup.procs cpu.rt_runtime_us tasks cpu.cfs_period_us cpu.shares