docker容器资源配额控制之cpu
taskset命令
taskset设定cpu亲和⼒,task能够将⼀个或多个进程绑定到⼀个或多个处理器上运⾏。
参数:
-c,--cpu-list 以列表格式显⽰和指定 cpu
docker重启容器命令
-p,--pid 在已经存在的 pid 上操作
设置只在1和2号cpu运⾏sshd进程程序
[root@apenglinux-002 ~]# taskset -cp 1,2 914
pid 914's current affinity list: 0-3
pid 914's new affinity list: 1,2
查看id为1的进程在哪个cpu上运⾏
[root@apenglinux-002 ~]# taskset -cp 1
pid 1's current affinity list: 0-3
设置 nginx cpu亲和⼒
在 f 中,有如下⼀⾏:
worker_processes 1;
这⾥⽤来配置nginx启动⼏个⼯作进程,默认为1.⽽nginx还⽀持⼀个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个⼯作进程绑定cpu。如下配置:
worker_processes 3;
worker_cpu_affinity 0010 0100 1000
这⾥0010 0100 1000是掩码,分别代表第2、3、4颗cpu核⼼。
重启nginx后,3个⼯作进程就可以各⾃⽤各⾃的cpu了。
物理机⼀共⽤16个核⼼,创建的容器只能⽤0、1、2这三个内核
[root@apenglinux-002 ~]# docker run -itd --name cpu1 --cpuset-cpus 0-2 centos
eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406
[root@apenglinux-002 ~]# cat /sys/fs/cgroup/cpuset/docker/eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406/cpuset.cpu cpuset.cpu_exclusive  cpuset.cpus
[root@apenglinux-002 ~]# cat /sys/fs/cgroup/cpuset/docker/eefe1ff3e567082c2d2d888911b239cfdc3407230f6c727ead05dfcf13368406/cpuset.cpus
0-2
进⼊容器测试
通过docker exec <;容器id或名字> taskset -c -p 1(容器内部第⼀个进程编号⼀般为1),可以看到容器中进程与cpu内核的绑定关系,可以认为达到了绑定cpu内核的⽬的。
[root@apenglinux-002 ~]# docker exec cpu1 taskset -cp 1
pid 1's current affinity list: 0-2
cpu配额控制参数的混合使⽤
在上⾯这些参数中,cpu-shares控制只发⽣在容器竞争同⼀个内核的时间⽚时,如果通过cpuset-cpus指定容器A使⽤内核0,容器B只是⽤内核1,在主机上只有这两个容器使⽤对应内核的情况,它们各⾃⽤全部的内核资源,cpu-shares没有明显效果。
cpu-period、cpu-quota这两个参数⼀般联合使⽤,在单核情况或者通过cpuset-cpus强制容器使⽤⼀个cpu内核的情况下,即使cpu-quota超过cpu-period,也不会使⽤容器⽤更多的cpu资源。
cpuset-cpus、cpuset-mems只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也⽆法达到资源控制的⽬的。
测试 cpuset-cpus 和 cpu-shares 混合使⽤运⾏效果,就需要⼀个压缩⼒测试⼯具 stress 来让容器实例把cpu跑满。
stress命令
概述:linux系统压⼒测试软件 Stress。stress 可以测试Linux系统 cpu/memory/IO/disk的负载。
注:也可以使⽤epel源中的stress-xxx.rpm
下载页:
源码编译安装 stress
[root@apenglinux-002 ~]# curl -O people.seas.harvard.edu/~apw/stress/stress-1.0.
[root@apenglinux-002 ~]# tar zxvf stress-1.0.
[root@apenglinux-002 stress-1.0.4]# ./configure --prefix=/usr/local/stree && make -j 4 && make -j 4 install
stress参数解释
-? 显⽰帮助信息
-v 显⽰版本号
-q 不显⽰运⾏信息
-n 显⽰已完成的指令情况
-t --timeout N 指定运⾏N秒后停⽌
-t --backoff N 等待N微秒后开始运⾏
-c 产⽣n个进程 每个进程都反复不停的计算随机数的平⽅根
-i 产⽣n个进程 每个进程反复调⽤ sync(),sync()⽤于将内存上的内容写到硬盘上
-m --vm n 产⽣n个进程,每个进程不断调⽤内存分配 malloc 和内存释放 free函数
-m --vm-bytes B 指定malloc时内存的字节数(默认256MB)
-m --vm-hang N 指定在free栈的秒数
-d --hadd n 产⽣n个执⾏ write 和 unlink 函数的进程
-
d --hadd-bytes B 指定写的字节数
-d --hadd-noclean 不unlink
产⽣1个cpu进程,1个io进程,20秒后停⽌运⾏
[root@apenglinux-002 stress-1.0.4]# cd /usr/local/stree/
[root@apenglinux-002 stree]# ./bin/stress -c 1 -i 1 --verbose --timeout 20s
查看
测试 cpuset-cpus 和 cpu-shares 混合使⽤运⾏效果
需要⼀个压缩⼒测试⼯具 stress 来让容器实例把cpu跑满。当跑满后,会不会去其他cpu上运⾏。如果没有在其他cpu上运⾏,说明cgroup 资源限制成功。
创建两个容器实例
[root@apenglinux-002 stree]# docker run -itd --name cpu2 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash
52f6079b005cffb29623bc279ea1f831efae1d620fdfb499757b2fbdb1103780
[root@apenglinux-002 stree]# docker run -itd --name cpu3 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash
11a738511c2b9df5b3fbb803d03935d681db390dddda13119da0f34cf942b0b3
进⼊ cpu2,使⽤stress测试进程是不是只在cpu 0,1上运⾏
[root@apenglinux-002 stree]# docker exec -it cpu2 /bin/bash
[root@52f6079b005c /]# yum install openssh-clients -y
[root@52f6079b005c /]# scp -r root@192.168.221.20:/usr/local/stree ./
[root@52f6079b005c /]# /stree/bin/stress -c 2 --verbose --timeout 10m
在物理机上使⽤ top 按 1 查看,每个cpu使⽤情况
进⼊ cpu3,使⽤stress测试进程是不是只在cpu 0,1上运⾏
[root@apenglinux-002 ~]# docker exec -it cpu3 /bin/bash
[root@11a738511c2b /]# yum install openssh-clients -y
[root@11a738511c2b /]# scp -r root@192.168.221.20:/usr/local/stree ./
[root@11a738511c2b /]#  /stree/bin/stress -c 2 --verbose --timeout 10m
容器cpu2,cpu3同时开启两个进程,看看cpu使⽤情况
注:两个容器只在cpu0,1上运⾏,cpu3是cpu2使⽤cpu的2倍。说明 --cpu-shares限制资源成功。动态修改,将cpu3的--cpu-shares改为512

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。