设为首页 收藏本站
查看: 1271|回复: 0

[经验分享] docker容器资源配额控制之cpu

[复制链接]

尚未签到

发表于 2019-2-22 06:58:52 | 显示全部楼层 |阅读模式
  taskset命令
taskset设定cpu亲和力,task能够将一个或多个进程绑定到一个或多个处理器上运行。
参数:
-c,--cpu-list  以列表格式显示和指定 cpu
-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亲和力
  在 conf/nginx.conf 中,有如下一行:
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  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
  下载页:

  http://people.seas.harvard.edu/~apw/stress/


  源码编译安装 stress

[root@apenglinux-002 ~]# curl -O http://people.seas.harvard.edu/~apw/stress/stress-1.0.4.tar.gz
[root@apenglinux-002 ~]# tar zxvf stress-1.0.4.tar.gz
[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





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675449-1-1.html 上篇帖子: 19、《每天5分钟玩转Docker容器技术》学习 下篇帖子: MySQL 如何使用 PV 和 PVC?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表