Docker 通过 cgroup来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常 见的资源配额和使用量控制。
cgroup概述: cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离迚程组所使用 的物理资源(如 cpu、memory、磁盘 IO等等) 的机制,被LXC、docker等很多项目用于实现迚程资源 控制。cgroup将任意迚程迚行分组化管理的 Linux 内核功能。cgroup本身是提供将迚程迚行分组化管 理的功能和接口的基础结构,I/O 戒内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
默认形况下每个docker容器的cpu份额都是1024。
给容器分配512权重的cpu使用份额
[root@docker ~]# docker run --help | grep cpu-shares
-c, --cpu-shares int CPU shares (relative weight)
[root@docker ~]# docker run -dit --cpu-shares 512 centos
2396df1c6c05f83dbcd5fd95d21abb2736026012df071914c84f6b7b7110b04f
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2396df1c6c05 centos "/bin/bash" 8 seconds ago Up 7 seconds unruffled_shockley
[root@docker ~]# docker exec -it 2396df1c6c05 cat /sys/fs/cgroup/cpu/cpu.shares
512
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period 指定容器对CPU的使用要在多长时间内做一次重新分配
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota 指定在这个周期内,最多可以有多少个时间片段用来运行这个容器
这两个参数单位都是微妙(us) 1s=1000000us
例:容器进程每1秒使用单个CPU的0.2秒时间。
[root@docker ~]# docker run -dit --cpu-period 1000000 --cpu-quota 200000 centos
55810cf2b238e377a6d8e7bc5f03a9570cc609c97212100fd2a1a6d77cbd441e
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55810cf2b238 centos "/bin/bash" 29 seconds ago Up 28 seconds peaceful_poincare
2396df1c6c05 centos "/bin/bash" 17 minutes ago Up 17 minutes unruffled_shockley
[root@docker ~]# docker exec -it 55810cf2b238 cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
1000000
[root@docker ~]# docker exec -it 55810cf2b238 cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
参数:–cpuset 可以绑定CPU 对多核 CPU 的服务器,docker 还可以控制容器运行限定使用哪些 cpu 内核和内存节点,即使用– cpuset-cpus和–cpuset-mems参数。对具有NUMA拓扑(具有多 CPU、多内存节点)的服务器尤其 有用,可以对需要高性能计算的容器迚行性能最优的配置。如果服务器只有一个内存节点,则– cpuset-mems的配置基本上不会有明显效果。
服务器架构一般分: SMP、NUMA、MPP体系结构介绍 从系统架构来看,目前的商用服务器大体可以分为三类: 1、即对称多处理器结构(SMP : Symmetric Multi-Processor) 例: x86 服务器,双路服务器。 主板上有两个物理cpu
2、非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 例: IBM 小型机
3、海量幵行处理结构 (MPP : Massive ParallelProcessing) 。 例: 大型机
[root@docker ~]# docker run -it --cpuset-cpus 0-1 centos
[root@3270b8644c67 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
[root@docker ~]# docker run -dit --name docker512 --cpuset-cpus 0,1 --cpu-shares 512 centos
90bb893a710dab24d5fabe05084c4561c66be4ef8c23541795f00c89ac24da3d
[root@docker ~]# docker run -dit --name docker1024 --cpuset-cpus 0,1 --cpu-shares 1024 centos
cdb252867910ec29d81747c541c44d6325de01950b1613202bfa49effcc0f029
[root@docker ~]# docker exec -it docker512 /bin/bash
[root@90bb893a710d /]# yum install epel-release -y
[root@90bb893a710d /]# yum install stress -y
[root@docker ~]# docker exec -it docker1024 /bin/bash
[root@cdb252867910 /]# yum install epel-release -y
[root@cdb252867910 /]# yum install stress -y
[root@docker ~]# top
top - 08:41:48 up 1:59, 2 users, load average: 0.00, 0.04, 0.05
Tasks: 374 total, 1 running, 373 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3866948 total, 2887380 free, 214604 used, 764964 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 3377264 avail Mem
打开另一个终端
[root@docker ~]# docker exec -dit docker512 stress -c 2 -v -t 10m
观察另一端变化
top - 08:43:20 up 2:00, 2 users, load average: 0.31, 0.09, 0.07
Tasks: 378 total, 3 running, 375 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3866948 total, 2884428 free, 217592 used, 764928 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 3374312 avail Mem
可以看到容器跑在了Cpu0和Cpu1上
[root@docker ~]# docker exec -dit docker1024 stress -c 2 -v -t 10m
另一端%CPU比率2:1
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5466 root 20 0 7268 96 0 R 68.8 0.0 0:14.35 stress
5465 root 20 0 7268 96 0 R 66.4 0.0 0:14.35 stress
5419 root 20 0 7268 96 0 R 33.2 0.0 2:43.00 stress
5418 root 20 0 7268 96 0 R 30.9 0.0 2:42.78 stress
stress系统压力测试
tress参数解释
-? 显示帮劣信息
-v 显示版本号
-q 不显示运行信息
-n 显示已完成的指令情况
-t --timeout N 指定运行N 秒后停止
--backoff N 等待N微妙后开始运行
-c 产生n个迚程 每个迚程都反复不停的计算随机数的平方根,测试cpu
-i 产生n 个迚程 每个迚程反复调用 sync(),sync()用于将内存上的内容写到硬盘上,测试io
-m --vm n 产生n个迚程,每个迚程不断调用内存分配malloc和内存释放free函数 ,测试内存
--vm-bytes B 指定 malloc时内存的字节数 (默认 256MB)
--vm-hang N 指定在 free栈的秒数
-d --hadd n 产生n 个执行 write和unlink函数的迚程
-hadd-bytes B 指定写的字节数
--hadd-noclean 不unlink
注:时间单位可以为秒 s,分 m,小时h,天 d,年 y,文件大小单位可以为K,M,G
[root@docker ~]# docker run -it -m 128m centos
[root@ddf27a7b5894 /]# cat /sys/fs/cgroup/memory/memory.limit_in_bytes
134217728
--device-write-bps value Limit write rate (bytes per second) to a device (default []) #限制此设备上的写速度(bytes per second),单位可以是kb、mb或者gb。
--device-read-bps value #限制此设备上的读速度(bytes per second),单位可以是kb、mb 或者 gb。
direct:读写数据采用直接 IO方式;
nonblock:读写数据采用非阻塞 IO方式
[root@docker ~]# docker run -it --device /dev/sda:/dev/sda --device-read-bps /dev/sda:1mb centos
[root@86406bdf75c7 /]# time dd if=/dev/sda of=/test bs=1M count=30 oflag=direct,nonblock
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 30.8058 s, 1.0 MB/s
real 0m30.825s
user 0m0.000s
sys 0m0.094s