系列文章目录
😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个关注喔
😜收录至专栏 云原生
😜【云原生Docker系列第一篇】Docker镜像管理
😜【云原生Docker系列第二篇】Docker容器管理
😜【云原生Docker系列第三篇】Docker网络模式
文章目录
前言
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_us100000#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/bashi=0whiletruedolet 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/bashi=0whiletruedolet 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_us33000#此时在进去容器执行之前创建好的脚本[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 ~]#
#分别进入容器,进行压力测试dockerexec -it c1 bashdockerexec -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 ~]# toptop - 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
三、对内存使用的限制
3.1 限制容器可以使用的最大内存
-m(--memory=):用于限制容器可以使用的最大内存
[root@localhost ~]# docker run -itd --name c4 -m 512m centos:7 /bin/bash
fb2ee21e0468d1426aacbd50bf628ba9314c9727ad67a0e7229d64901916f9f5
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb2ee21e0468 centos:7 "/bin/bash"7 seconds ago Up 6 seconds c4
81e3ea8f526e centos:7 "/bin/bash"6 minutes ago Up 6 minutes c3
5c88ac86d48f centos:7 "/bin/bash"13 minutes ago Exited (255)6 minutes ago c2
5dfeb7d377aa centos:7 "/bin/bash"15 minutes ago Exited (255)6 minutes ago c1
[root@localhost ~]#docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
fb2ee21e0468 c4 0.00% 392KiB / 512MiB 0.07% 648B / 0B 0B / 0B 1
81e3ea8f526e c3 0.00% 202.2MiB / 1.781GiB 11.09% 32.3MB / 244kB 58.3MB / 25.3MB 1
3.2 限制可用的swap大小
–memory-swap :限制可用的swap大小
强调一下,–memory-swap是必须要与–memory一起使用的。
正常情况下,–memory-swap的值包含容器可用内存和可用swap。
所以-m 300m --memory-swap=1g的含义为:容器可以使用300M的物理内存,并且可以使用700M(1G-300)的swap。
如果–memory-swap 设置为0或者不设置,则容器可以使用的swap大小为-m值的两倍。
如果–memory-swap 的值和-m值相同,则容器不能使用swap。
如果–memory-swap值为-1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap容器就可以使用多少)。
四、对磁盘Io配额控制(blkio)的限制
–device-read-bps:限制某个设备上的读速度bps(数据量),单位可以是kb、mb(M)或者gb。
–device-read-iops:限制读某个设备的iops(次数)
–device-write-iops:限制写入某个设备的iops(次数)
例:
docker run -itd --name test6 --device-read-bps /dev/sda:1mb centos:7 /bin/bash
--device-write-bps:限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:
docker run -itd --name c6 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
4.1 创建容器,并限制写速度
#创建容器c6并限制写速度[root@localhost ~]# docker run -itd --name c6 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
525d77ff742386a8d676500326850597030fa966cdf9c1ef06bf3d3dd7f840c3
[root@localhost ~]# docker exec -it c6 bash#通过dd命令来验证写的速度[root@525d77ff7423 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct5+0 records in5+0 records out
52428800 bytes (52 MB) copied, 50.5056 s, 1.0 MB/s
[root@525d77ff7423 /]#
五、清除docker占用的磁盘空间
docker system prune -a #可用于清理磁盘,删除关闭的容器、无用的数据卷和网络
#查看容器[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
525d77ff7423 centos:7 "/bin/bash"3 minutes ago Up 3 minutes c6
fb2ee21e0468 centos:7 "/bin/bash"12 minutes ago Up 12 minutes c4
81e3ea8f526e centos:7 "/bin/bash"18 minutes ago Up 18 minutes c3
5c88ac86d48f centos:7 "/bin/bash"25 minutes ago Exited (255)19 minutes ago c2
5dfeb7d377aa centos:7 "/bin/bash"27 minutes ago Exited (255)19 minutes ago c1
#清理磁盘[root@localhost ~]# docker system prune -a
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all images without at least one container associated to them
- all build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
5c88ac86d48f80c6261c834f92fbb1e89c67c3b8547d5cce91ec3ae56b476525
5dfeb7d377aafd309c90642799c6165026013af074b455e2da61cb2dfdb85957
Deleted Images:
untagged: stevelugyq/nginx:latest
untagged: stevelugyq/nginx@sha256:25dedae0aceb6b4fe5837a0acbacc6580453717f126a095aa05a3c6fcea14dd4
deleted: sha256:0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d
deleted: sha256:1e877fb1acf761377390ab38bbad050a1d5296f1b4f51878c2695d4ecdb98c62
deleted: sha256:834e54d50f731515065370d1c15f0ed47d2f7b6a7b0452646db80f14ace9b8de
deleted: sha256:d28ca7ee17ff94497071d5c075b4099a4f2c950a3471fc49bdf9876227970b24
deleted: sha256:096f97ba95539883af393732efac02acdd0e2ae587a5479d97065b64b4eded8c
deleted: sha256:de7e3b2a7430261fde88313fbf784a63c2229ce369b9116053786845c39058d5
deleted: sha256:ad6562704f3759fb50f0d3de5f80a38f65a85e709b77fd24491253990f30b6be
Total reclaimed space: 562.7MB
#再次查看容器[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
525d77ff7423 centos:7 "/bin/bash"3 minutes ago Up 3 minutes c6
fb2ee21e0468 centos:7 "/bin/bash"12 minutes ago Up 12 minutes c4
81e3ea8f526e centos:7 "/bin/bash"18 minutes ago Up 18 minutes c3
[root@localhost ~]#
总结
1.对cpu的限制参数
docker run -cpu-period #设置调度周期时间1000~1000000
-cpu-quota #设置容器进程的CPU占用时间,要与调度周期时间成比例
--cpu-shares #设置多个容器之间的CPU资源占用比
--cpuset-cpus #绑核(第一个CPU从0开始)
2.2对内存的限制
-m 物理内存 [--memory-swap=总值]
3.对磁盘IO的限制
--device-read-bps 设备文件:1mb/1M #读速度
--device-write-bps #写速度
--device-read-iops #读次数
--device-write-iops #写次数docker system prune -a #释放无用的资源
版权归原作者 Steve lu 所有, 如有侵权,请联系我们删除。