0


【云原生Docker系列第四篇】Docker Cgroups资源控制操作(人人都喜欢森林,却都不想去种树)

在这里插入图片描述

系列文章目录

😜即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个关注喔

😜收录至专栏 云原生

😜【云原生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             #释放无用的资源

在这里插入图片描述

标签: docker 云原生 容器

本文转载自: https://blog.csdn.net/qq_42327944/article/details/125469530
版权归原作者 Steve lu 所有, 如有侵权,请联系我们删除。

“【云原生Docker系列第四篇】Docker Cgroups资源控制操作(人人都喜欢森林,却都不想去种树)”的评论:

还没有评论