Docker 资源(cpu、memory)限制实践篇

写这篇的目的是为了搞清楚,在docker中的一些设置项,对容器资源(cpu、memory)产生的影响和对比,从网络中了解到docker容器的资源限制是通过cgroup来实现的。cgroup是control group的简称,是Linux内核2.6.24引入的一个新特性 ,用来限制、分离和报告一个进程组的资源(CPU、内存、磁盘输入输出等)。常用的ulimit只能基于用户或者用户组来进行资源限制,不能够针对某一进程作出详细限制,缺乏灵活度。

一、安装 sysstat 工具

下载:sysstat-7.0.2-3.el5.x86_64.rpm

rpm -ivh sysstat-7.0.2-3.el5.x86_64.rpm

二、使用工具 mpstat

命令:mpstat -P ALL 3 10 :表示每3秒对所有的cpu采样10次.

04时54分27秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
04时54分32秒  all   17.77    0.00    0.05    0.00    0.00    0.00    0.00   82.17   1113.60
04时54分32秒    0    0.00    0.00    0.20    0.00    0.00    0.00    0.00   99.80      0.00
04时54分32秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.62      0.60
04时54分32秒    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
04时54分32秒    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      2.20
04时54分32秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00        0.00

  • user:在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程,值为 (usr/total)*100;
  • nice:在internal时间段里,nice值为负进程的CPU时间(%),值为(nice/total)*100;
  • system:在internal时间段里,核心时间(%),值为(system/total)*100;
  • iowait:在internal时间段里,硬盘IO等待时间(%),值为(iowait/total)*100;
  • irq:在internal时间段里,硬中断时间(%),值为(irq/total)*100;
  • soft:在internal时间段里,软中断时间(%),值为(softirq/total)*100;
  • idle:在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%),值为(idle/total)*100;
  • intr/s:在internal时间段里,每秒CPU接收的中断的次数,值为(intr/total)*100;

三、Docker中关于容器cpu的设置项

  • –cpuset-cpus:指定允许容器使用的CPU序号,从0开始,默认使用主机的所有CPU
--cpuset-cpus=0-2 // 允许使用0,1,2号cpu
--cpuset-cpus=0-1,3 // 允许使用0,1,3号cpu

例如:

docker run -it --rm --cpuset-cpus=0-1,3 agileek/cpuset-test
# agileek/cpuset-test给出了一种用于测试CPU的image,功能就是将指定的CPU资源用满

运行结果:

# mpstat -P ALL 2 1000

05时08分40秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
05时08分43秒  all   70.16    0.00    0.00    0.00    0.00    1.06    0.00   28.78   4443.03
05时08分43秒    0   98.36    0.00    0.00    0.00    0.00    1.64    0.00    0.00      0.00
05时08分43秒    1   99.20    0.00    0.00    0.00    0.00    0.80    0.00    0.00      0.82
05时08分43秒    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
05时08分43秒    3   97.98    0.00    0.00    0.00    0.00    2.02    0.00    0.00      1.64
05时08分43秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
  • –cpu-shares 是相对权重, 设置为一个正整数,代表所分配的相对CPU资源比,需要注意的是,这种情况只发生在CPU资源紧张的情况下。

启动2个容器:

docker run -it --rm --cpu-shares=10 --cpuset-cpus=0 agileek/cpuset-test
docker run -it --rm --cpu-shares=20 --cpuset-cpus=0 agileek/cpuset-test

分表查看2个容器的top信息:

# docker top 4067dfb90eeb 
UID     PID      PPID     C      STIME        TTY        TIME          CMD
root     5428    5412     66     05:23          pts/2       00:00:32     /cpuburn

# docker top 11d8f3076db1
UID     PID      PPID     C      STIME        TTY         TIME          CMD
root     5330    5314     34     05:22          pts/4        00:00:59     /cpuburn
注:容器运行的时间越长,比例越接近.

默认情况下所有容器的share(简单理解成是权重吧)是相同的,也就是所有容器有相同的权重,在所有容器一起竞争资源时,最终得到的资源是相同的。这个share是一个相对的值,那么这个值的意义就不能单纯的通过一个容器的share值来看,而是多个在一起对比,比如A和B两个容器,A配置的是1024,B配置的是512,那么A最大可以使用的CPU资源是B的两倍。还有一点要注意的是这种配置是有弹性的,如果A容器一直闲着,那B容器是可以使用空闲资源的。

  •  –cpus 容器CPU占用主机的CPU的比例,占用的比例关系暂时未找到相关的资料。

例如 –cpus=1 ,宿主机cpu个数为4,占用比例并非1/4 .现在使用–cpus能够确认2点

  1. –cpus=2比–cpus=1,占用比例要大。
  2. 在 docker inspect 3ef363848eb8 | grep Cpu 中有个 NanoCpus 会随其规律性变化。
  • –cpu-period 和 –cpu-quota

这两个设置项是成对出现的,在理解这2个概念之前需要清楚,linux系统中进程的CPU占比是如何计算的,简单可以理解为:在单位的时间内(也称刷新时间),进程占用CPU的时间比,这里只是单个CPU的比值(进程CPU使用比例),如果是多核CPU,即 进程CPU使用占比/CPU核数=系统CPU占比。

cpu-period:指刷新时间,单位是微秒(us),默认值是0.1秒,即100,000us
cpu-quota:容器占用时间,单位是微秒(us),默认是-1,即不限制

#注意:只是单个CPU的百分比(进程CPU使用比例).系统cpu使用比=进程CPU使用比例/核数

通过例子说明(本人使用4核CPU),例子1:

docker run -it --rm --cpu-quota=50000 --name=test agileek/cpuset-test
// 容器cpu占用50%,因为本人用的4核CPU,top中进程CPU比例50%,系统CPU使用比例12.5%
# top
Tasks: 128 total,   1 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.8 us,  0.1 sy,  0.0 ni, 89.0 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  1016488 total,   663352 free,   119692 used,   233444 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   736284 avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22734 root      20   0   36732    972    584 S  49.5  0.1   0:12.02 cpuburn

例子2:

docker run -it --rm --cpu-quota=300000 --name=test agileek/cpuset-test
// 进程cpu占比 300%,系统cpu占比75%
# top
Tasks: 129 total,   2 running, 127 sleeping,   0 stopped,   0 zombie
%Cpu(s): 55.7 us,  0.0 sy,  0.0 ni, 43.2 id,  0.0 wa,  0.0 hi,  1.1 si,  0.0 st
KiB Mem :  1016488 total,   663336 free,   119708 used,   233444 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   736264 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22828 root      20   0   36732    972    584 S 300.7  0.1   2:31.44 cpuburn

例子3:

docker run -it --rm --cpu-quota=500000 --name=test agileek/cpuset-test
// 进程cpu占比 400%,系统cpu占比100%
注:此时超过4核cpu的最大占比,所以使用最大占比
# top
Tasks: 127 total,   3 running, 124 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.4 us,  0.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  2.5 si,  0.0 st
KiB Mem :  1016488 total,   662932 free,   120116 used,   233440 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   735884 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
22915 root      20   0   36732    712    396 R 398.0  0.1  19:41.62 cpuburn

例子4:

# docker run -it --rm --cpu-quota=500000 --cpu-period=1000000 --name=test 
agileek/cpuset-test
// 容器进程占比 50%,系统cpu占比12.5
#top
Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.0 us,  0.0 sy,  0.0 ni, 89.9 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem :  1016488 total,   665960 free,   117144 used,   233384 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   738964 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
23006 root      20   0   36732    972    584 S  50.0  0.1   0:33.50 cpuburn

例子5:

docker run -it --rm --cpu-quota=3000000 --cpu-period=1000000 --cpuset-cpus=0-1 
 --name=test  agileek/cpuset-test
# 进程cpu占比 200%(因限制使用0和1好CPU,最大值是300%),系统cpu占比50%
#top
Tasks: 124 total,   1 running, 123 sleeping,   0 stopped,   0 zombie
%Cpu(s): 43.3 us,  0.1 sy,  0.0 ni, 56.3 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  1016488 total,   665464 free,   117560 used,   233464 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.   738496 avail Mem 

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
23143 root      20   0   36732    712    396 R 199.3  0.1   4:14.25 cpuburn

Docker 资源(cpu、memory)限制实践篇》上有1条评论

  1. Pingback引用通告: Docker create / Docker run 的选项详解 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>