docker的资源控制管理——Cgroups

目录

一、对CPU使用率的控制

1.1 CPU 资源控制

1.2 cgroups有四大功能 

1.3 设置cpu使用率上限

查看周期限制和cpu配额限制

进行cpu压力测试然后修改每个周期的使用cpu的时间,查看cpu使用率 

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

创建两个容器设置比例然后压测

分别进入到c1和c2容器中,进行压测

1.5 设置容器绑定指定的cpu

二、内存资源控制

三、磁盘IO配额控制

3.1、限制Block IO

3.2、限制bps和iops进行限制


一、对CPU使用率的控制

1.1 CPU 资源控制

  • cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。

1.2 cgroups有四大功能 

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

1.3 设置cpu使用率上限

Linux通过CFS(completely fair scheduler,完全公平调度器)来调度各个进程对cpu的使用

  • 我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少cpu时间
  • 使用--cpu-period即可设置调度周期,默认100ms,设置范围为:1ms-1s,对应的--cpu-period的数值范围是1000~10000000
  • 使用--cpu-quota即可设置在每个周期内容器能使用cpu时间,默认无限制,设置的要求不能小于1ms,也就是--cpu-quota的值必须>=1000

查看周期限制和cpu配额限制

Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒 
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 100
docker run -itd --name test1 centos:7 /bin/bash
#启动一个centos:7镜像容器docker ps -a
#查看是否启动成功,并查看pid号cd /sys/fs/cgroup/cpu/docker/容器PID号
#进入到该容器的限制目录中cat cpu.cfs_quota_us
#查看每个周期的cpu最大限制时间cat cpu.cfs_period_us
#查看调度周期是多久//cpu.cfg_period_us: cpu 分配的周期(微秒,所以文件名中用us表示),默认为100000
//cpu.cfg_quota_us: 表示该cgroups限制占用的时间(微秒),默认为-1,表示为不限制,如果设为50000,表示占用50000/100000=50%的cpu
  • cpu.cfs_period_us:cpu分配的周期(微秒,所以文件名中用 us 表示),默认为100000。
  • cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。 如果设为50000,表示占用50000/100000=50%的CPU。 

进行cpu压力测试然后修改每个周期的使用cpu的时间,查看cpu使用率 

docker run -itd --name test1 --cpu-quota 50000 centos:7 /bin/bash
#可以直接创建一个容器并设置每个周期cpu执行的时间
或者
docker run -itd --name test1 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/【容器pid】
echo 50000 > cpu.cfs_quota_us
#也可以先创建一个容器,然后进入到文件中直接修改cpu执行的实际的文件名称docker exec -it 【容器id】 /bin/bash
#进入容器vim /cpu.sh
#!bin/bash
i=0
while true
do
let i++
done
#创建死循环脚本,为了进行cpu压力测试chmod +x /cpu.sh
./cpu.sh
#执行脚本

top
#查看这个容器中脚本占的多少的cpu资源

 

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

Docker通过-cpu-share指定cpu份额,默认为1024,值为1024的倍数

  • 在有多个容器竞争CPU时,我们可以设置每个容器能会用的CPU时间比例,这个比例叫做共享权值
  • 共享式CPU资源,是按比例切分CPU资源,Docker默认每个容器的权值为1024.如果不指定或将其设置为0,都将使用默认值
  • 通过--cpu-share并不是cpu资源的绝对数量,而是一个相对的权重值,某个容器最终能分配到的cpu资源取决于它的cpu share占用所有容器cpu share综合的比例。换句话说,通过cpu share可以设置容器使用cpu的优先级

     

  比如,当前系统上一共运行了两个容器,第一个容器上权重是1024,第二个容器权重是512, 第二个容器启动之后没有运行任何进程,自己身上的512都没有用完,而第一台容器的进程有很多,这个时候它完全可以占用容器二的CPU空闲资源,这就是共享式CPU资源;如果容器二也跑了进程,那么就会把自己的512给要回来,按照正常权重1024:512划分,为自己的进程提供CPU资源。如果容器二不用CPU资源,那容器一就能够把容器二的CPU资源所占用,如果容器二也需要CPU资源,那么就按照比例划分。那么第一个容器会从原来使用整个宿主机的CPU变为使用整个宿主机的CPU的2/3;这就是CPU共享式,也证明了CPU为可压缩性资源。

创建两个容器设置比例然后压测

docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
#创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的cpu资源占比为1/3和2/3

 

分别进入到c1和c2容器中,进行压测

分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根

再开一个终端查看  docker stats 

 

1.5 设置容器绑定指定的cpu

–cpuset-cpus 是限制容器运行在指定的cpu核心

运行容器运行在哪个CPU核心上,例如主机有4个核心,cpu核心标识为0-3,我们一启动容器,只想让这台容器运行在标识0和3的两个CPU核心上,可以使用cpuset来指定。
docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash
#启动一个容器,让它只使用内核1和内核3的资源docker exec -it 【容器id】 /bin/bash
#进入容器yum -y install epel-release
yum -y install stress
stress -c 8
#下载压力测试工具,并测试8个核

 

 

 

另一个终端top查看 

 

 

二、内存资源控制

与操作系统类似,容器可以使用的内存包括两部分:物理内存和Swap

Docker通过下面两组参数来控制容器内存的使用量

  • -m 或 --memory : 设置内存的使用限额, 例如:100MB,2GB
  • –memory-swap : 设置内存+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空间该容器就可以使用多少)

 
 

docker run -itd --name m1 -m 200m --memory-swap=300M centos:7 /bin/bash
#允许该容器使用物理内存200M,swap空间为100mdocker stats
#查看容器使用资源情况

 

 

三、磁盘IO配额控制

Block IO 是另一种可以限制容器使用的资源,Block IO 指的是磁盘的读写,docker可通过设置权重,限制bps和iops的方式控制容器读写磁盘的带宽。

3.1、限制Block IO

默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器bliock IO 的优先级。–blkio-weight 与 --cpu-share类似,设置的是相对权重值,默认为500。

docker run -it --name b1 --blkio-weight 600 /bin/bashdocker run -it --name b2 --blkio-weight 300 /bin/bash#上面两条中,b1容器读写磁盘的带宽是b2容器的两倍

 

3.2、限制bps和iops进行限制

  • bps 是 byte per second ,表示每秒读写的数据量。
  • iops 是 io per second ,表示每秒的输入输出量(或读写次数)

可以通过以下参数控制容器的bps和iops

  • –device-read-bps,限制读某个设备的bps(数据量)
  • –device-write-bps,限制写某个设备的bps(数据量)
  • –device-read-iops,限制读某个设备的iops(次数)
  • –device-write-iops,限制写某个设备的iops(次数)

对写bps进行限制的测试

docker run -it --name b1 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#创建容器,限制写的数数据量为1mb/sdd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#测试是否是写入的1MB/S 

清理docker占用的磁盘空间

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

 

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

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

相关文章

跨境外贸业务,选择动态IP还是静态IP?

在跨境业务中,代理IP是一个关键工具。它们提供了匿名的盾牌,有助于克服网络服务器针对数据提取设置的限制。无论你是需要经营管理跨境电商店铺、社交平台广告投放,还是独立站SEO优化,代理IP都可以让你的业务程度更加丝滑&#xff…

Linux命令 -- vim

Linux命令 -- vim 前言一般模式光标移动复制粘贴内容查找 底线命令行模式 前言 用vim指令进入文件。 刚进入时是命令行模式,也叫一般模式。 按i或者insert进入编辑模式,此时可以编辑文件内容。 按esc可从编辑模式退回到一般模式,输入冒号进…

基于 spring boot 的动漫信息管理系统【源码在文末】

半山腰总是最挤的,你得去山顶看看 大学生嘛,论文写不出,代码搞不懂不要紧,重要的是,从这一刻就开始学习,立刻马上! 今天带来的是最新的选题,基于 spring boot 框架的动漫信息管理系…

Linux系统安装Google Chrome

1.进入谷歌浏览器官网 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…

Azure如何启用网络观察应用程序

文章目录 基础概念介绍实操 基础概念介绍 Azure中的网络观察应用程序是一种用于监视和诊断Azure网络的工具。它提供了一种集中管理和监控网络流量、连接性和性能的方式。网络观察应用程序能够提供网络流量分析、连接监视、性能监视和故障诊断等功能,用于帮助管理员…

K8S核心组件etcd详解(下)

1 k8s如何使用etcd 在k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失。 只有api server能访问etcd,其它组件只能间接访问etcd的好处是 增强乐观锁系统及验证系统的健壮性 方便后续存储的替换…

使用 BERT 进行文本分类 (01/3)

摄影:Max Chen on Unsplash 一、说明 这是使用 BERT 语言模型的一系列文本分类演示的第一部分。以文本的分类作为例,演示它们的调用过程。 二、什么是伯特? BERT 代表 来自变压器的双向编码器表示。 首先,转换器是一种深度学习模…

SpringBoot 操作Redis、创建Redis文件夹、遍历Redis文件夹

文章目录 前言依赖连接 RedisRedis 配置文件Redis 工具类操作 Redis创建 Redis 文件夹查询数据遍历 Redis 文件夹 前言 Redis 是一种高性能的键值存储数据库,支持网络、可基于内存亦可持久化的日志型,而 Spring Boot 是一个简化了开发过程的 Java 框架。…

【TA 挖坑02】RayMarching SDF 物体黏合

写在前面 由于实习和忙着论文很久没经营博客了,最近以各种方式收集到了一些想实现的效果,其中一个就是卡通云融合、变大变小、聚散收拢的效果如何实现的问题,这就不得不提搁置了很久的RayMarching... 挖坑!整理一下有帮助的文章…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题,较为深入的研究AWS WAF的相关规则。面对上千万的冲突,笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

微服务08-多级缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分…

卷积操作后特征图尺寸,感受野,参数量的计算

文章目录 1、输出特征图的尺寸大小2、感受野的计算3、卷积核的参数量 1、输出特征图的尺寸大小 如果包含空洞卷积,即扩张率dilation rate不为1时: 2、感受野的计算 例如,图像经过两个3*3,步长为2的卷积后感受野为: co…

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…

在Gazebo中添加悬浮模型后,利用键盘控制其移动方法

前段时间写了文章,通过修改sdf、urdf模型的方法,在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型_sagima_sdu的博客-CSDN博客 今天讲…

Leetcode32 最长有效括号

给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 代码如下&#xff1a; class Solution {public int longestValidParentheses(String str) {Stack<Integer> s new Stack<>();int res 0;int st…

GrapeCity Documents for Excel, Java Edition Crack

GrapeCity Documents for Excel, Java Edition Crack 增加了对SpreadJS.sjs文件格式的支持&#xff1a; 更快地将大型Microsoft Excel文件转换为.sjs格式。 使用较小的占用空间保存导出的文件。 将Excel/SpreadJS功能导入SpreadJS/从SpreadJS导出。 从.sjs文件中压缩的JSON文件…

JVM——JDK 监控和故障处理工具总结

文章目录 JDK 命令行工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照**jhat**: 分析 heapdump 文件**jstack** :生成虚拟机当前时刻的线程快照 JDK 可视化分析工具JConsole:Java 监视与管理控制台连接…

手撕单链表

目录 链表的概念和结构 单链表的实现 申请新结点 打印 尾插 头插 尾删 头删 ​编辑 查找 在pos位置前插入元素 在pos位置后插入元素 删除pos位置的元素 删除pos位置之后的位置的元素​编辑 完整代码 SListNode.h SListNode.c 链表的概念和结构 链表是一种物理存储…

【JavaSE】Java方法的使用

【本节目标】 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 4. 掌握递归 目录 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 3. 递归 3.…

【uni-app报错】获取用户收货地址uni.chooseAddress()报错问题

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解决&#xff1a; 登录小程序后台申请接口 按照流程申请即可 在项目根目录中找到 manifest.json 文件&#xff0c;在左侧导航栏选择源码视图&a…