Docker容器资源配额

Docker容器资源配额

启动时指定cpu,内存,硬盘等资源使用份额

Docker 通过 cgroup来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常 见的资源配额和使用量控制。

cgroup概述: cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离迚程组所使用 的物理资源(如 cpu、memory、磁盘 IO等等) 的机制,被LXC、docker等很多项目用于实现迚程资源 控制。cgroup将任意迚程迚行分组化管理的 Linux 内核功能。cgroup本身是提供将迚程迚行分组化管 理的功能和接口的基础结构,I/O 戒内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

默认形况下每个docker容器的cpu份额都是1024。

cpu使用份额控制

给容器分配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周期控制

      --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

CPU core控制

参数:–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

cpuset-cpus和cpu-shares混合使用

[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

I/O控制

  --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
发布了65 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/DoloresOOO/article/details/100229669