Setting absolute limits on CPU for Docker containers

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 using cpu.cfs_quota_us and cpu.cfs_period_us. How does one use these settings when using docker 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:

  • Figure out cgroup cpu reservation based historical data
  • Error 50007 when creating cgroup with cgroup_new_cgroup
  • How to install an application in Hadoop Cluster using YARN?
  • Distributed CPU-intensive processes in Kubernetes/Docker
  • Cgroups report weird cpu and memory usage
  • google/cadvisor:latest image monitor container run error
  • $ 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
    

  • Requested JSON data encrypted arbitrarily depending on host
  • Is there an easy way to run an ipynb against an already running kernel non-interactively?
  • Emails not working in Linux Containers
  • Can I transport just the image changes/layers i'm concerned with?
  • How do I update Gemfile.lock on my Docker host?
  • How to setup xdebug and PhpStorm with docker for Windows (beta)
  • One Solution collect form web for “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
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.