Docker Cgroups资源控制操作

news2024/11/24 0:34:19

资源控制

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。

 

 

 设置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/bash
 
vim /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
 
chmod +x /cpu.sh
./cpu.sh
 
top                    #可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果

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

#分别进入容器,进行压力测试
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    

对内存使用的限制

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

限制可用的 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

完结. 

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

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

相关文章

vm安装,虚拟环境搭建win+linux+mac,及本机连接虚拟环境数据库、windows服务器搭建、内网穿透

教程中的软件、镜像、工具可去阿里云盘提取: 阿里云盘:https://www.aliyundrive.com/s/CLdTjFtnYbr 提取码:s1a8 一、安装虚拟机 下载链接:https://www.vmware.com/products/workstation-pro.html 下载的过程中可能需要注册登录…

经典的设计模式5——建造者模式

文章目录 建造者模式 建造者模式 截止到今天,创建者模式这一类别的模式已经全整理完了,一共包含5个,工厂方法模式,抽象工厂模式,单例模式,原型模式和建造者模式。还是太看的太慢,得加快进度了。…

黑客零基础入门方法有哪些?如何自学黑客技术?

大家经常问我一个问题,黑客零基础入门方法有哪些?以及如何自学黑客技术?首先要说的是世界上大部分的网络黑客都是自学成才的,这与黑客这门技术有很大的原因,黑客是一个靠兴趣驱动的技术,大部分成为黑客的人…

字节面试归来,黑暗3小时......

背景 杭州某中厂的软件测试开发,本科毕业5年,最近面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer,最终选择了字节2-2。以下是他的一些分享和总结。 从准备看机会开始,一直到拿到offer,经历了2个月的时间&…

探索未来,畅享奇迹——3DVR智慧景区引领旅游革命

导语: 在快速发展的科技时代,我们正逐渐进入一个全新的旅游体验时代。3DVR智慧景区作为旅游业的革命性创新,为游客带来了前所未有的沉浸式体验,同时也为景区管理者带来了无限的营销机遇。 通过穿戴VR设备,游客能够在虚…

vue项目中el-tree 添加右键菜单的方法

vue项目中,如何在el-tree 中显示右键菜单呢?这里的核心用到了 node-contextmenu“rightClick” ,具体的操作方法如下: 核心分析 node-contextmenu是el-tree一重要的属性, 当某一节点被鼠标右键点击时会触发该事件。共…

Sui Builder House日本京都站开启报名

下一站Sui Builder House将于6月29-30日在日本京都举行,为世界各地的开发者提供身临其境地学习和交流的机会。 春日的樱花已经绽放,黄金周也已经过去,现在是时候来京都参加Sui Builder House一起庆祝夏天的来临了。来自日本和周边地区的开发…

Java 常量池:静态常量池 动态常量池 字符串池

Java 常量池相关内容 Java 常量池概念分类:静态常量池、动态常量池、字符串常量池(由于jdk1.7之后字符串常量池从运行时常量池分离到堆中) 静态常量池 class 文件中CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有…

【C++】C++的类型转换

文章目录 1、C语言中的类型转换2、为什么C需要四种类型转换3、C强制类型转换(重点)3-1、static_cast3-2、reinterpret_cast3-3、const_cast3-4、dynamic_cast 4、RTTI(了解)5、常见面试题6、总结 1、C语言中的类型转换 在C语言中&…

选择合适的数据库引擎:InnoDB vs. MyISAM - 你的终极指南!

大家好,我是小米,一个热衷于技术分享的29岁程序员。今天,我将带大家一起探讨一下MySQL中两种常见的存储引擎:InnoDB和MyISAM。它们之间有许多差异,了解这些差异对于我们在选择合适的存储引擎时至关重要。废话不多说&am…

想做好接口测试,先把这些概念搞清楚了

接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口 比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用…

Springboot配置Log4j日志系统,并将日志存入数据库

Log4j是apache公司开发的一款日志管理系统&#xff0c;可以高效的管理系统中出现的BUG或者各种信息&#xff0c;并且可以已文本的方式或者数据库存入的方式来记录数据 第一步&#xff1a;导入依赖 在pom.xml中导入Log4j依赖 <!-- https://mvnrepository.com/artifact/log…

通达信通道交易系统选股公式,结合MACD绿柱缩短底背离

亚历山大埃尔德在《以交易为生》&#xff08;原书第2版&#xff09;中&#xff0c;将价格在通道中的波动比喻为河流在河谷中流动。当河流碰到右岸时&#xff0c;会向左转&#xff1b;碰到左岸时&#xff0c;会向右转。价格上涨时&#xff0c;常在碰到隐形天花板时停止上涨&…

java SSM 啤酒配送管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 啤酒配送管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

【每天学习一点新知识】应急响应快速指南

一、前言 马上就端午节啦&#xff0c;提前祝大家端午快乐&#xff0c;顺便把之前的六一也给补上&#xff0c;希望大家每天的生活都跟童话世界一样美好&#xff0c;充满希望&#xff08;虽然现实很残酷&#xff09;。 最近更的没有以前勤快了&#xff0c;一是在实习&#xff0c;…

基于smardaten无代码开发舆情分析系统

一、前言 在日常生活中&#xff0c;有各种各样的资讯、社交平台。这些平台充斥着大量信息&#xff0c;这些信息中隐含了许多有用数据&#xff0c;但是这些数据无法之间获取&#xff0c;且难以展示&#xff0c;于是就有了舆情分析系统。 舆情分析系统是一个综合的系统&#xf…

elementui tree 支持虚拟滚动和treeLine (上)

背景&#xff1a;在使用elementuivue2.x进行项目开发时&#xff0c;有用到el-tree组件&#xff0c;但是在数据很多时会卡顿 基于以上背景elementui 提供的el-tree组件无法满足需求。 期间在网上调研了很多相关的tree组件&#xff0c;例如&#xff1a; vue-treeszTreesjsTrees…

d3dcompiler_47.dll缺失怎么修复,总结五个修复方法

d3dcompiler_47.dll是一个由微软公司开发的动态链接库文件(DLL File)&#xff0c;属于Microsoft Direct3D Shader Compiler 库的一部分&#xff0c;该库包含用于编写和编译 Direct3D 11 的着色器的编译器源代码。这个 DLL 文件是 Direct3D 11 中非常重要的组成部分&#xff0c;…

什么是微软的 Application Framework?

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下什么是微软的 Application Framework&#xff1f; 到底什么是 Application Framework&#xff1f; 还没有真正掌握任何一套Application Framework的使用之前&#xff0c;就来研究这个真的不是很…

海龟绘图turtle库之二级基础编程题

海龟绘图turtle库之二级基础编程题 python2.6版本中后引入的一个简单的绘图工具&#xff0c;叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 原理&#xff1a; Turtle库是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个…