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

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

前言


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




目录
相关文章
|
4小时前
|
Cloud Native 测试技术 数据安全/隐私保护
云原生之使用Docker部署Teedy轻量级文档管理系统
【5月更文挑战第8天】云原生之使用Docker部署Teedy轻量级文档管理系统
20 1
|
4小时前
|
存储 Cloud Native 文件存储
云原生之使用Docker部署home-page个人导航页
【5月更文挑战第4天】云原生之使用Docker部署home-page个人导航页
27 1
|
4小时前
|
监控 安全 Cloud Native
【云原生之Docker实战】使用Docker部署Ward服务器监控工具
【5月更文挑战第11天】使用Docker部署Ward服务器监控工具
10 3
|
4小时前
|
Cloud Native 安全 Linux
【云原生之Docker实战】使用Docker部署mBlog微博系统
【5月更文挑战第10天】使用Docker部署mBlog微博系统
10 2
|
4小时前
|
Cloud Native 测试技术 Linux
云原生之使用Docker部署homer静态主页
【5月更文挑战第7天】云原生之使用Docker部署homer静态主页
12 0
|
4小时前
|
监控 Cloud Native 测试技术
云原生之使用Docker部署ServerBee服务器监控工具
【5月更文挑战第6天】云原生之使用Docker部署ServerBee服务器监控工具
13 1
|
4小时前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
|
4小时前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
4小时前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
26 5
|
4小时前
|
存储 运维 Linux
Docker详解(十)——Docker容器CPU资源限额配置
Docker详解(十)——Docker容器CPU资源限额配置
23 3