写这篇的目的是为了搞清楚,在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点
- –cpus=2比–cpus=1,占用比例要大。
- 在 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
Pingback引用通告: Docker create / Docker run 的选项详解 | 精彩每一天