Docker使用Linux cgroup来实现资源的限制(Linux Note – cgroup),对于CPU的限制有两种方法:
1.cpuset
CPU Set限定容器使用某个固定的CPU核。使用默认的libcontainer引擎时,可以通过--cpuset
来指定进程/docker容器在执行时使用某几个固定的CPU。比如0-3或以逗号分割如0,3,4(0是第一个CPU)。如果使用lxc引擎,可以指定--lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
agileek/cpuset-test给出了一种用于测试CPU的image,功能就是将指定的CPU资源用满。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
docker pull agileek/cpuset-test #使个第5个CPU docker run -it --rm --cpuset=4 agileek/cpuset-test #another terminal mpstat -P ALL 5 10 19:00:23 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 19:00:28 all 2.09 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 97.90 19:00:28 0 0.00 0.00 0.00 0.00 0.00 0.20 0.00 0.00 0.00 99.80 19:00:28 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 19:00:28 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 19:00:28 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 19:00:28 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ...... #使用0-4个CPU docker run -it --rm --cpuset=0-4 agileek/cpuset-test /cpus 5 #another terminal mpstat -P ALL 5 10 19:05:14 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 19:05:19 all 10.42 0.00 0.00 0.01 0.00 0.01 0.00 0.00 0.00 89.56 19:05:19 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19:05:19 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19:05:19 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19:05:19 3 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19:05:19 4 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19:05:19 5 0.20 0.00 0.00 0.00 0.00 0.40 0.00 0.00 0.00 99.40 ...... |
2.cpu.shares
CPU shares是相对权重, 设置为一个正整数,代表所分配的相对CPU资源比。
在Docker中,使用默认的libcontainer引擎时,可以指定在docker run时指定-c
或--cpu-shares=0
;
如果使用lxc引擎,可以使用--lxc-conf="lxc.cgroup.cpu.shares = 1234"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apt-get install mpstata #同时启动两个container docker run -it --rm -c 512 --cpuset=0 agileek/cpuset-test docker run -it --rm -c 1024 --cpuset=0 agileek/cpuset-test #another terminal docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 220eeeb9cf8a agileek/cpuset-test:latest "/bin/sh -c burnP6" 9 seconds ago Up 9 seconds jovial_darwin e07d8e06f48b agileek/cpuset-test:latest "/bin/sh -c burnP6" 16 seconds ago Up 15 seconds sharp_nobel ...... # 查看容器的进程资源信息,第四列(C)为CPU的信息,可以看到根据512:1024的cpu.share,CPU严格按照1:2的资源比例分配。 docker top 220eeeb9cf8a UID PID PPID C STIME TTY TIME CMD root 25771 3710 0 19:17 pts/11 00:00:00 /bin/sh -c burnP6 root 25823 25771 33 19:17 pts/11 00:00:21 burnP6 ...... docker top e07d8e06f48b UID PID PPID C STIME TTY TIME CMD root 25644 3710 0 19:17 pts/9 00:00:00 /bin/sh -c burnP6 root 25696 25644 67 19:17 pts/9 00:01:36 burnP6 ...... |
^^
参考:
Container Resource Allocation Options in docker-run
Limiting a Docker Container to a single cpu core
Use Cases for cgroups
没硬币怎么坐摇摇车啊~~