前言
cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,还可以为资源设置权、计算使用量、操控进程启停等等。所以cgroups(Control groups)实现了对资源的配额和度量。
一、cgroups四大功能
资源限制:可以对任务使用的资源总额进行限制
优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
任务控制:cgroup可以对任务执行挂起、恢复等操作
二、设置cpu使用率上线
Linux通过crs(Completely Fair scheduler,完全公平调度器)来调度各个进程对CPU的使用。crs默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。
使用–cpu-period 即可设置调度周期,使用–cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS周期的有效范围是1ms~1s,对应的–cpu-period 的数值范围是1000~1000000。
而容器的CPU配额必须不小于1ms,即–cpu-quota的值必须>=1000。
2.1示例:
#创建容器 [root@localhost ~]# docker run -itd --name c1 centos:7 /bin/bash ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78 #查看容器 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff1dd348e227 centos:7 "/bin/bash" About a minute ago Up About a minute c1 #查看容器 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff1dd348e227 centos:7 "/bin/bash" 3 minutes ago Up 3 minutes c1 [root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/ [root@localhost docker]# ls cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78 cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares notify_on_release cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat tasks #切换目录到容器相关配置目录 [root@localhost docker]# cd ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/ [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# ls cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_quota_us -1 [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_period_us 100000 #cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用us表示),默认为100000 #cpu.cfs quota us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。如果设为50000,表示占用50000/100000=50%的CPU。
2.2压力测试
#登录容器 [root@localhost ~]# docker exec -it c1 bash [root@ff1dd348e227 /]# #写个死循环并运行 [root@ff1dd348e227 /]#vi /cpu.sh [root@ff1dd348e227 /]##!/bin/bash i=0 while true do let i++ done #给脚本权限 [root@ff1dd348e227 /]#chmod +x cpu.sh #运行脚本 [root@ff1dd348e227 /]#./cpu.sh #再开一个终端,查看cpu使用率 [root@localhost ~]#top
2.3 CPU限制
#创建容器c2并进行限制 [root@localhost ~]# docker run -itd --name c2 --cpu-quota 50000 centos:7 WARNING: IPv4 forwarding is disabled. Networking will not work. 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f #查看CPU限额文件 [root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/ 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f/ ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/ [root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f/ [root@localhost 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f]# cat cpu.cfs_quota_us 50000 #登录容器 [root@localhost 031972da696b8e079acaf0c40344cd64d3b3c4a8eb1ad09b5f04b89e8cc7ff0f]# docker exec -it c2 bash #写个死循环并运行 [root@031972da696b /]# vi /cpu.sh #!/bin/bash i=0 while true do let i++ done #给脚本权限 [root@031972da696b /]# chmod +x cpu.sh #运行脚本 [root@031972da696b /]#./cpu.sh #再开一个终端,查看cpu使用率 [root@localhost ~]#top
2.4 对已存在的容器进行CPU限制
直接修改/sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us文件即可
#进入c1文件目录 [root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78/ [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# echo "33000" >cpu.cfs_quota_us [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# cat cpu.cfs_quota_us 33000 #此时在进去容器执行之前创建好的脚本 [root@localhost ff1dd348e227bf94db19e107d4120428f49f5fc7d4bb12459b275970c3705c78]# docker exec -it c1 bash [root@ff1dd348e227 /]# ./cpu.sh #再开一个终端,查看cpu使用率 [root@localhost ~]#top
2.5 设置cpu资源占用比(设置多个容器时才有效)
Docker 通过–cpu-shares指定CPU份额,默认值为1024,值为1024的倍数(可以是0.5倍)。
#先删除所有容器 [root@localhost ~]# docker rm -f $(docker ps -aq) #创建两个容器为c1和c2 #只有这2个容器的情况下,cpu资源分摊给这两个容器,512:1024等于1:2,一个占1/3,一个占2/3 [root@localhost ~]# docker run -itd --name c1 --cpu-shares 512 centos:7 2869e1508ca4d91b5d92d590f11884d4d222ee366a5cffc57a752faf56daf372 [root@localhost ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7 85828ef49abb4010b61d3edafac1e49aac1b2a27fc0d11e936f5a5f56372fe44 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85828ef49abb centos:7 "/bin/bash" 8 seconds ago Up 7 seconds c2 2869e1508ca4 centos:7 "/bin/bash" 9 seconds ago Up 8 seconds c1 [root@localhost ~]#
#分别进入容器,进行压力测试 docker exec -it c1 bash docker exec -it c2 bash yum install -y epel-release #安装在线源 yum install -y stress #安装检测软件 stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
#查看容器运行状态(动态更新) docker stats
2.6 设置容器绑定指定的CPU
#先分配虚拟机4个CPU核数 docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash #--cpuset-cpus:指定绑定核数可以是多个
核号是从0开始的,1、3代表第二个核和第四个核
#进入容器,进行压力测试 [root@localhost ~]#docker exec -it c3 bash [root@81e3ea8f526e /]#yum install -y epel-release [root@81e3ea8f526e /]#yum install stress -y [root@81e3ea8f526e /]#stress -c 4 #执行top命令再按1查看CPU使用情况。 [root@localhost ~]# top top - 13:41:21 up 4 min, 3 users, load average: 3.43, 1.30, 0.48 Tasks: 173 total, 5 running, 168 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.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.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1867048 total, 381652 free, 406024 used, 1079372 buff/cache KiB Swap: 4194300 total, 4194300 free, 0 used. 1218384 avail Mem