云原生Docker Cgroups资源控制操作

目录

资源控制

cgroups四大功能

CPU 资源控制

设置CPU使用率上限

进行CPU压力测试

设置50%的比例分配CPU使用时间上限

 设置CPU资源占用比(设置多个容器时才有效)

设置容器绑定指定的CPU

 对内存使用的限制

限制容器可以使用的最大内存

 限制可用的 swap 大小, --memory-swap

对磁盘IO配额控制(blkio)的限制

 清理docker占用的磁盘空间


资源控制

Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面, 
基本覆盖了常见的资源配额和使用量控制。
Cgroup 是 ControlGroups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等) 的机制,
被 LXC、docker 等很多项目用于实现进程资源控制。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。

cgroups四大功能

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
  • 任务控制:cgroup可以对任务执行挂起、恢复等操作

CPU 资源控制

设置CPU使用率上限

Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。
CFS默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
 
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。
两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。

#创建容器
docker run -itd --name test5 centos:7 /bin/bash#查看容器
[root@localhost docker]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
a13543c5f4f2   centos:7   "/bin/bash"   34 seconds ago   Up 33 seconds             test5
[root@localhost docker]# cd /sys/fs/cgroup/cpu/docker/
[root@localhost docker]# ls
a13543c5f4f2419e2b8ef40553eabe0c30e9d94188e8a7986ecf5c81c3fd9796  cpuacct.stat          cpu.cfs_quota_us   cpu.stat
cgroup.clone_children                                             cpuacct.usage         cpu.rt_period_us   notify_on_release
cgroup.event_control                                              cpuacct.usage_percpu  cpu.rt_runtime_us  tasks
cgroup.procs                                                      cpu.cfs_period_us     cpu.shares#切换目录到容器相关配置目录
[root@localhost docker]# cd a13543c5f4f2419e2b8ef40553eabe0c30e9d94188e8a7986ecf5c81c3fd9796/
[root@localhost a13543c5f4f2419e2b8ef40553eabe0c30e9d94188e8a7986ecf5c81c3fd9796]# ls
cgroup.clone_children  cpuacct.usage         cpu.rt_period_us   notify_on_release
cgroup.event_control   cpuacct.usage_percpu  cpu.rt_runtime_us  tasks
cgroup.procs           cpu.cfs_period_us     cpu.shares
cpuacct.stat           cpu.cfs_quota_us      cpu.stat
[root@localhost a13543c5f4f2419e2b8ef40553eabe0c30e9d94188e8a7986ecf5c81c3fd9796]# cat cpu.cfs_quota_us 
-1
[root@localhost a13543c5f4f2419e2b8ef40553eabe0c30e9d94188e8a7986ecf5c81c3fd9796]# cat cpu.cfs_period_us 
100000#cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。

进行CPU压力测试
#登录容器
docker exec -it 3ed82355f811 /bin/bash
#写了个死循环并执行
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
donechmod +x /cpu.sh
./cpu.shtop					#可以看到这个脚本占了很多的cpu资源
设置50%的比例分配CPU使用时间上限
#设置50%的比例分配CPU使用时间上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash	#可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/4b9b13808286(对已经存在的容器进行限制)
echo 50000 > cpu.cfs_quota_us
docker exec -it 4b9b13808286 /bin/bashvim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
donechmod +x /cpu.sh
./cpu.shtop					#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果

#在多核情况下,如果允许容器进程完全占用两个 CPU,
 则可以将 cpu-period 设置为 100000( 即 0.1 秒),
 cpu-quota设置为 200000(0.2 秒)。

 设置CPU资源占用比(设置多个容器时才有效)
Docker 通过 --cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name c1 --cpu-shares 512 centos:7	
docker run -itd --name c2 --cpu-shares 1024 centos:7
#分别进入容器,进行压力测试
docker exec -it c1 bash
yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根docker exec -it c2 bash
docker exec -it c1 bash
yum install -y epel-release
yum install -y stress
stress -c 4	#查看容器运行状态(动态更新)
docker stats

可以看到在 CPU 进行时间片分配的时候,容器 c2 比容器 c1 多一倍的机会获得 CPU 的时间片。
但分配的结果取决于当时主机和其他容器的运行状态, 实际上也无法保证容器 c1 一定能获得 CPU 时间片。
比如容器 c1 的进程一直是空闲的,那么容器 c2 是可以获取比容器 c1 更多的 CPU 时间片的。
极端情况下,例如主机上只运行了一个容器,即使它的 CPU 份额只有 50,它也可以独占整个主机的 CPU 资源。
 
Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。
因此,无法单纯根据某个容器的 CPU 份额来确定有多少 CPU 资源分配给它,
资源分配结果取决于同时运行的其他容器的 CPU 分配和容器中进程运行情况。

设置容器绑定指定的CPU
#先分配虚拟机4个CPU核数[root@localhost ~]#docker run -itd --name test7 --cpuset-cpus 1,3 centos:7
bcc599d66099a91b1029bfb9b7c01c4715f7fb65da6c91f74938a6f6a6722588#进入容器,进行压力测试
yum install -y epel-release
yum install stress -y
stress -c 4#退出容器,执行 top 命令再按 1 查看CPU使用情况。

 对内存使用的限制

限制容器可以使用的最大内存
//-m(--memory=) 选项用于限制容器可以使用的最大内存
docker run -itd --name test8 -m 512m centos:7 /bin/bashdocker stats
 限制可用的 swap 大小, --memory-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。
例:docker run -itd --name test9 --device-read-bps /dev/sda:1M  centos:7 /bin/bash--device-write-bps : 限制某个设备上的写速度bps(数据量),单位可以是kb、mb(M)或者gb。
例:docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash--device-read-iops :限制读某个设备的iops(次数)--device-write-iops :限制写入某个设备的iops(次数)
#创建容器,并限制写速度
docker run -it --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash#通过dd来验证写速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct				#添加oflag参数以规避掉文件系统cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s

 清理docker占用的磁盘空间

docker system prune -a			#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年5个美国代理IP推荐,最佳代理花落谁家?

美国代理IP指的是代理服务器位于美国的IP地址,对于跨境业务来说,这些代理IP地址可以用于隐藏用户的真实IP地址,将其网络流量路由通过美国的服务器,以实现一些特定的目的。由于近年来,面向美国市场的跨境商家越来越多&a…

软件测试面试1000问(含文档)

前前后后面试了有20多家的公司吧,最近抽空把当时的录音整理了下,然后给大家分享下 开头都是差不多,就让做一个自我介绍,这个不用再给大家普及了吧 同时,我也准备了一份软件测试视频教程(含接口、自动化、…

java发送邮件

java发送邮件工具类 JavaMailSenderImpl JavaMailSenderImpl 类是 Spring 框架提供的一个实现了 JavaMailSender 接口的邮件发送类,用于发送邮件,提供接口如下: setJavaMailProperties:设置属性Properties setProtocol&#xff1…

如何从单体架构迁移到微服务架构:挑战和最佳实践

当单体架构成为项目增长的瓶颈时,迁移到微服务架构就成了必然的选择。 微服务虽然具有明显的优点,但由于其内在复杂性和缺乏一种通用的迁移方案,实施过程中可能会遇到不少挑战。本文旨在分享解决方案架构师在单体架构向微服务迁移过程中的专…

OpenCV实现物体尺寸的测量

一 ,项目分析 物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。 如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。 主要是通过…

C盘满了怎么清理文件?

电脑的C盘是我们电脑存储系统文件和应用程序的一个重要盘符,很多人经常会遇到C盘空间不足的问题;虽然我们可以通过卸载程序或者删除文件来释放空间,但是在这个过程中往往会误删掉一些重要的文件,造成部分程序可能无法正常使用。 因…

【EI会议征稿】第五届大数据与信息化教育国际学术会议(ICBDIE 2024)

【有往届检索记录】第五届大数据与信息化教育国际学术会议(ICBDIE 2024) 2023 5th International Conference on Big Data and Informatization Education 第五届大数据与信息化教育国际学术会议(ICBDIE 2024)定于2024年01月19-…

怒刷LeetCode的第28天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:动态规划 方法二:迭代 方法三:斐波那契数列公式 第二题 题目来源 题目内容 解决方法 方法一:栈 方法二:路径处理类 方法三:正则表达式 方法…

机器学习(新手入门)-线性回归 #房价预测

题目:给定数据集dataSet,每一行代表一组数据记录,每组数据记录中,第一个值为房屋面积(单位:平方英尺),第二个值为房屋中的房间数,第三个值为房价(单位:千美元…

RTL SDR的PYTHON开发环境搭建

不得不说RTL SDR真是神器,直接把SDR的入门门槛拉低到了几十块钱。对于RTL SDR的学习开发,有大佬写的《Software_Defined_Radio_using_MATLAB_Simulink_and_the_RTL-SDR》,另外,除了MATLAB,近些年爆火的PYTHON当然也是可…

系统集成测试(SIT)/系统测试(ST)/用户验收测试(UAT)

文章目录 单元测试集成测试系统测试用户验收测试黑盒测试白盒测试压力测试性能测试容量测试安全测试SIT和UAT的区别 单元测试 英文 unit testing,缩写 UT。测试粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”。 …

智能振弦传感器:参数智能识别技术的重要科技创新

智能振弦传感器:参数智能识别技术的重要科技创新 智能振弦传感器是一种能够自动识别传感器参数的高科技产品。它的研发得益于河北稳控科技的不断创新和努力,其电子标签专用读数模块模块TR01将传感器生产和标定过程实现了自动化。该模块将温度电阻两芯线…

Mysql第四篇---数据库索引优化与查询优化

文章目录 数据库索引优化与查询优化索引失效案例数据准备1. 全值匹配2 最佳左前缀法则(联合索引)主键插入顺序4 计算、函数导致索引失效5 类型转换(自动或手动)导致索引失效6 范围条件右边的列索引失效7 不等于(!或者<>)索引失效8 is null可以使用索引, is not null无法使…

【Mongo】数据删了磁盘空间但没有减少

Author:skate Time:2023/10/22 一、问题描述 产线用户反馈&#xff0c;一个华为云的mongo实例磁盘空间告警&#xff0c;使用率超过90%&#xff08;使用状况 1630.9/1800GB&#xff09;&#xff0c;让其通过数据库运维平台找到占用大空间的表&#xff0c;然后清理历史数据&…

爱创科技携手洽洽食品,探索渠道数字化最优解!

坚果的下半场&#xff0c;是从吃到喝。 消费升级大潮下&#xff0c;健康养生理念逐渐深入人心。以“天然健康”为核心的食品新消费潮流正加速形成&#xff0c;一个个打着“美味与营养”黄金设定的品类风口正被不断创建&#xff0c;其中人气有增无减的当属植物基饮品。据相关报告…

Anaconda/minAnaconda下配置虚拟环境并安装pytorch相关

Anaconda/minAnaconda下配置虚拟环境并安装pytorch相关 官网下载对应版本anaconda/minAnaconda进入Anaconda Prompt创建虚拟环境 conda create -n 虚拟环境名 python版本 -c https://mirrors.bfsu.edu.cn/anaconda/pkgs/main查看当前环境&#xff0c;如果之前anaconda3文件夹…

docker和k8s之间的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。 https://baijiahao.baidu.com/s?id1763716289717819767&wfrspider&forpc 背…

【idea】使用教程:idea 打开项目、配置、项目打包详细教程

目录 一、配套软件安装 二、打开已有项目 三、配置 jdk 四、项目打包 五、服务器首次创建目录 &#xff08;1&#xff09;后端代码目录 &#xff08;2&#xff09;前端代码目录 &#xff08;3&#xff09; 打包后的代码包上传到服务器上 一、配套软件安装 【idea】wi…

计算机算法分析与设计(20)---回溯法(0-1背包问题)

文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品&#xff0c;第 i i i 个物品的重量为 W i W_i Wi​&#xff0c;价值为 V i V_i Vi​&#xff0c;对于一个最多能装重量 c c c 的背包&#xff0c;应该如何选择放入包中的物品…

Git报错解决

本篇主要汇总在使用 Git 进行提交和拉取文件时&#xff0c;遇到的问题的解决方案&#xff0c;以便下次查找。 1 关于使用Git出现“git Failed to connect to 127.0.0.1 port xxxx: Connection refused”的问题解决方案 1. 问题描述 在使用 git 拉取、提交代码的时候&#xff…