【云原生】docker-Cgroup资源限制

news2024/11/25 1:03:28

Docker容器的资源控制

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

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

 

docker占用宿主机cpu的限制

 Linux通过CFS (Completely Fair Scheduler,完全公平调度器)来调度各个进程对ceu的使用。CFS默认的调度周期是100ms 。我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

 使用--cpu-period 即可设置调度周期,使用--cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。CFS周期的有效范围是 1ms~1s,对应的--cpu-period 的数值范围是1000~1000000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。

 

 

#正常创建容器(此时容器遵循默认的占用cpu资源规则)
[root@localhost ~]#docker run -id --name c1 centos:7
 
[root@localhost ~]#docker ps -a
 
[root@localhost ~]#docker exec -it c1 bash
 
[root@d6da0a6b999a /]# vi cpu.sh
 
#!/bin/bash
i=0
while true
do
let i++
done
 
 
[root@d6da0a6b999a /]# chmod +x cpu.sh 
 
[root@d6da0a6b999a /]# ./cpu.sh 

 由该结果可以看出,如果在创建容器时不限制它cpu使用的限制,是非常危险的一件事,一旦某个容器的程序异常陷入死循环,将直接导致其他容器中业务的中断 !

 (2)修改默认的容器时间分片上限规则,再次创建启动测试

docker start c1
docker ps -a
#d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04为容器id
cd/sys/fs/cgroup/cpu/docker/d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04
 
[root@localhost d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04]#echo 50000 > cpu.cfs_quota_us 

 

 

 (3)创建容器时指定容器的cpu资源占用量上限 

docker run -id --name c2 --cpu-quota 30000 centos:7
[root@localhost docker]#docker exec -it c2 bash
[root@10cfa036ff07 /]# vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@10cfa036ff07 /]# vi cpu.sh
[root@10cfa036ff07 /]# chmod +x cpu.sh 
[root@10cfa036ff07 /]# ./cpu.sh 

 

 (4)多cpu分配容器的使用上限

[root@localhost docker]#docker run -id --name c3 centos:7
 
[root@localhost docker]#docker ps -a
 
[root@localhost docker]#cd /sys/fs/cgroup/cpu/docker/a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a/
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#ls
 
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#echo 200000 >  cpu.cfs_quota_us 

 

[root@localhost ~]#docker exec -it c3 bash
[root@a1ce6948cdb6 /]# vi cpu.bash
#!/bin/bash
i=0
while true
do
let i++
done
[root@a1ce6948cdb6 /]# chmod +x ./cpu.bash 
[root@a1ce6948cdb6 /]# ./cpu.bash 

 

 设置cpu资源的占用比 

注意:该方式需要设置多个容器时才会生效 

 创建容器时可以使用选项  --cpu-shares  数值(该数值要为1024的倍数,1024代表一份,当个容器占用cpu的份额由自身分配的份数除于所有容器占用cpu的份数,就为该容器所占用cpu资源的百分比)

进行分配

[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7
 
[root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7
 
[root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7
 

 开启三个终端,启动容器压测:

#三个容器均为以下压测操作
#下载压测工具依赖环境
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 4
 
 
#再开启一个终端查看测试结果
docker stats

 

 

由测试结果, 可以看到在cPU进行时间片分配的时候,容器b1比容器b2和b3多一倍的机会获得cpu的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器 b2和b3一定能获得cpu时间片

比如容器b2和b3的进程一直是空闲的,那么容器b1是可以获取比容器b2和b3更多的cpu时间片的。极端情况下,例如主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的cpu资源。

 Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu 份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。

 设置容器绑定指定的cpu 

top   
按数字“1”

 进行绑核创建容器 

[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7

 压力测试:

yum install -y epel-release
yum insatll -y stress
 
stress -c 1

  测试结果:

 内存使用的限制

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

m (或--memory=)选项用于限制容器可以使用的最大内存 

docker run -itd --name d1 -m 512m centos:7 /bin/bash
docker  stats

 

 限制容器可用的swap 大小 


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

●强调一下, --memory-swap是必须要与 --memory(或-m)一起使用的。

●正常情况下, --memory-swap 的值包含容器可用内存和可用swap 。

●所以 -m 300m --memory-swap=1g 的含义为:容器可以使用300M 的物理内存,并且可以使用700M (1G - 300M)的swap。  ​  设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。  如果 --memory-swap 的值和 -m 值相同,则容器不能使用swap。  如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。

 #--memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。
 #表示容器可以使用512M的物理内存,并且可以使用512M的swap。因为1g减去512m的物理内存,剩余值才是可用swap。
 docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash
 ​
 ​
 #--memoryswap值和 -m 的值相同,表示容器无法使用swap
 docker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash
 ​
 ​
 # --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
 docker run -itd --name d4 -m 512m centos:7 bash
 ​
 ​
 # --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。
 docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash
 

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

-device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

该速度是指每秒钟进行读写操作1M,1G或者是1kb 

--device-read-iops :限制读某个设备的iops (次数)

--device-write-iops :限制写入某个设备的iops ( 次数)

默认情况下容器的写速度 

[root@localhost ~]#docker run -id --name e1  centos:7
[root@localhost ~]#docker exec -it e1 bash
[root@8657384cb483 /]# dd if=/dev/zero  of=/opt/test.txt bs=10M count=5 oflag=direct
## oflag=direct 规避文件读写系统中所带来的缓存,避免影响测试结果

 进行写速度限制的容器创建 

 
[root@localhost ~]#docker run -it --name e3 --device-write-bps /dev/sda:1M centos:7 /bin/bash
[root@6c1b8bcf6b44 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct

 总结

 对cpu的限制参数

 docker run --cpu-period     #设置调度周期时间1000~1000000
            --cpu-quota      #设置容器进程的CPU占用时间,要与调度周期时间成比例
            --cpu-shares    #设置多个容器之间的CPU资源占用比
            --cpuset-cpus   #绑核(第一个CPU编号从0开始)

对内存的限制

 -m 物理内存 [--memory-swap=总值]

对磁盘IO的限制

 --device-read-bps 设备文件:1mb/1M     #限制读速度
 --device-write-bps 设备文件:1mb/1M    #限制写速度
 --device-read-iops                   #限制读次数
 --device-write-iops                  #限制写次数
 ​
 docker system prune -a    #清理磁盘,删除关闭的容器、无用的数据卷和网络。

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

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

相关文章

报表生成器FastReport .Net用户指南: 显示表达式

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

Tomcat的安装与使用,Maven与Servlet的使用

文章目录 一.Tomcat的下载与使用1. Tomcat简介2. 安装和使用 二.Maven的使用三.Servlet1. 第一个Servlet程序2. 在idea中集成Tomcat3. 常见错误 一.Tomcat的下载与使用 1. Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目, 由…

学习Kafka生产者的缓冲池设计

大家一定都了解Java的线程池,线程池有什么好处呢?如果没有线程池,我们每次创建线程都要新建一个线程,这样对CPU的消耗比较大。那么利用线程池我们可以对已经创建好的线程复用,线程就不用频繁创建和销毁了。 同样&…

回顾 | Semantic Kernel:面向 AI 编程(三) - 云原生

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

chatgpt赋能python:Python如何创建角色

Python如何创建角色 在游戏开发中,创建角色是非常重要的一个环节,也是游戏设计的重要一环。Python作为一种广泛使用的编程语言,可以用于快速且高效地创建角色。 1. 创建角色的基本思路 创建角色的主要思路是定义角色的属性,包括…

ReactJS入门(一)—— 初步认识React

React刚开始红的时候,由于对其不甚了解,觉得JSX的写法略非主流,故一直没打算将其应用在项目上,随着身边大神们的科普,才后知后觉是个好东西。 好在哪里呢?个人拙见,有俩点: 1. 虚拟…

14.数据结构之多路查找树与堆

前言 之前介绍的都是二叉查找树,二叉树一个节点最多有两个子节点,那么多于两个节点是什么情况呢,这就是我们本节要介绍的多路查找树。 多路查找树,也是我们数据库mysql底层索引维护方式。下面,我们来详细介绍。 1. …

小红书母婴博主类型怎么选,类型区分

母婴类型的分享不管在哪个平台都是涨粉最快的,也可能是因为当前的大环境因素导致的。不过如果你想成为一名母婴博主或者想要借助它的影响,得先了解一些东西。那么小红书母婴博主类型怎么选,类型怎么区分。 小红书母婴博主是指聚集在小红书平台…

【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 常见算法的实现 插入排序 希尔排序 堆排序 选择排序 冒泡排序 快速排序 Hoare版本 随机选Keyi 三数取中 挖坑法 前后指针版本 归并排序 常见算法的实现 插入排序 动画演示&…

信创提速,人才为先!麒麟信安与领路信创签订《人才合作协议》

5月23日,麒麟信安杨涛董事长一行考察了设立在长沙领路信创科技有限公司(简称:领路信创)的“国家新一代自主安全计算系统产业集群人才基地”(简称人才基地),并与领路信创刘耿董事长签署《人才合作…

苹果WWDC2023:首款MR头显震撼发布,开发者泪洒现场,一文读懂全新产品及创新功能

🌷 博主 libin9iOak带您 Go to New World.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发…

macOS Sonoma 发布,全面提升生产力和创意工作流(ISO、IPSW、PKG 下载)

macOS Sonoma 14.0 Beta 1 (23A5257q) ISO、IPSW、PKG 下载 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Li…

chatgpt赋能python:Python如何删除行:从入门到精通

Python如何删除行:从入门到精通 在Python编程中,删除行是必不可少的操作之一。无论是清除不必要的数据,还是在数据集中删除重复行,或者在文本文件中删除某些行,删除行都是一项极其重要的任务。 什么是Python语言&…

shell文件读取

文件读取 一、whilefor shell中读取文件有两种方式 while 和 for while #!/bin/bash cat filename | while read line doetho $line donefor #!/bin/bash for line in cat filename(待读取的文件) doecho $line done第三中写法,上述两种方式的升级写法 #!/bin/bas…

SQL-约束

SQL-约束 1.1 概念 约束是作用于表中列上的规则,用于限制加入表的数据约束的存在保证了数据库中数据的正确性、有效性和完整性 1.2 分类 类型描述关键字非空约束保证列中所有的数据不能有null值NOT NULL唯一约束保证列中所有数据各不相同UNIQUE主键约束主键是一行…

HTTP首部(上)

HTTP 协议的请求和响应报文中必定包含 HTTP 首部,只是我们平时在使用 Web 的过程中感受不到它。本章我们一起来学习 HTTP 首部的结构,以及首部中各字段的用法。 1.HTTP报文首部 先来看看http报文的首部结构图: HTTP 协议的请求和响应报文中…

不知道如何搭建帮助中心?这里有解决办法!

在今天的数字化时代,帮助中心已经成为许多公司所必需的一个重要部分。它是一个客户与公司沟通和交互的重要渠道,可以帮助客户解决问题和获得支持。本文将介绍如何搭建一个有效的帮助中心,以提高客户满意度和公司的效率。 一、明确帮助中心的…

哪些因素对会影响到企业制定自己的融合CDN战略

我们知道一个企业/组织有多种方法可以实现和利用多CDN战略,由于带宽承诺、成本、超期费用等因素,因此对不同的指标进行评估至关重要。 以下是可能影响您的融合CDN战略的一些因素: 地理因素 在选择CDN时需要考虑的一个重要因素是用户所在的…

静态内存管理

内存管理的基本概念 在一般的实时嵌入式系统中,由于实时性的要求,很少使用虚拟内存机制。所有的内存都需要用户参与分配,直接操作物理内存,所分配的内存不能超过系统的物理内存,所有的系统堆栈的管理,都由…

快速上手kettle(三)壶中可以放些啥?

快速上手kettle(三)壶中可以放些啥? 序言一 、kettle这壶能装些啥二、Access输入2.1 准备Acess数据库和表2.2 新建一个转换并设置2.3 启动转换预览数据 三、CSV文件输入3.1 准备csv文件,并将csv输入控件拖入工作区3.2 csv输入控件…