Docker的CPU资源限制
Docker使用Linux cgroup来实现资源的限制(Linux Note – cgroup),对于CPU的限制有两种方法: 1.cpuset CPU Set限定容器使用某个固定的CPU核。使用默认的libcontainer引擎时,可以通过 --cpuset 来指定进程/docker容器在执行时使用某几个固定的CPU。比如0-
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资源用满。
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"
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
|