[docker] Docker资源管理
一、docker资源控制
Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。
- 资源限制:可以对任务使用的资源总额进行限制。
- 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。
- 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。
- 任务控制: cgroup可以对任务 执行挂起、恢复等操作。
二、docker占用宿主机cpu的限制
2.1 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。
docker run -itd --name test5 centos:7 /bin/bashdocker ps -acd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/cd /sys/fs/cgroup/cpu/docker/
-1
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 test5 bash
vi /cpu.sh
#!/bin/bash
i=0
while true
do
let i++
donechmod +x /cpu.sh
./cpu.shtop #可以看到这个脚本占了很多的cpu资源


设置50%的比例分配CPU使用时间上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash #可以重新创建一个容器并设置限额
或者
cd/sys/fs/cgroup/cpu/docker/9d415515c01e61a335bdc841e19b60a1ce54dd3cbaefeab7844fdcf785cd5aa4/
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.shtop #可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果#在多核情况下,如果允许容器进程完全占用两个 CPU, 则可以将 cpu-period 设置为 100000( 即 0.1 秒), cpu-quota设置为 200000(0.2 秒)。




2.2 设置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创建三个容器为 b1 和 b2 和 b3,设置容器的权重,使得b1和b2和b3的CPU资源占比为1/2和1/4和1/4。
开启三个终端,启动容器压测:
#三个容器均为以下压测操作
#下载压测工具依赖环境
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 2#再开启一个终端查看测试结果
docker stats

查看容器运行状态(动态更新)

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

进行绑核创建容器
[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 1 centos:7
压力测试:
yum install -y epel-release
yum install -y stressstress -c 1

三、内存使用的限制
3.1 限制容器可以使用的最大内存
m (或--memory=)选项用于限制容器可以使用的最大内存
docker run -itd --name d1 -m 512m centos:7 /bin/bash
docker stats


3.2 限制容器可用的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 的值相同,表示容器无法使用swapdocker 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 ( 次数)
4.1 默认情况下容器的写速度
[root@localhost ~]#docker run -id --name e1 centos:7
[root@localhost ~]#docker exec -it e1 bash
[root@8657384cb483 /]# dd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct
## oflag=direct 规避文件读写系统中所带来的缓存,避免影响测试结果

4.2 进行写速度限制的容器创建
docker run -it --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bashdd if=dev/zero of=/mnt/test.txt bs=10M count=10 oflag=direct

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

总结
对cpu的限制参数
设置单个容器进程能够使用的CPU使用率上限
针对新建的容器:
docker run --cpu-period 单个CPU调度周期时间(1000~1000000) --cpu-quota 容器进程能够使用的最大CPU时间(>=1000)针对已存在的容器:
修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目录下的 cpu.cfs_period_us(单个CPU调度周期时间) cpu.cfs_quota_us(容器进程能够使用的最大CPU时间) 文件的值设置多个容器的CPU占用份额(只能在多个容器同时运行且CPU资源紧张时生效)
docker run --cpu-shares 容器进程最大占用CPU的份额(值为1024的倍数)设置容器绑定指定的CPU
docker run --cpuset-cpus CPUID1[,CPUID2,....]
对内存的限制
设置容器能够使用的内存和swap的值
docker run -m 内存值 --memory-swap 内存和swap的总值设置 0 或 不设置,表示swap为内存的2倍设置 -1,表示不限制swap的值,宿主机有多少容器即可使用多少设置 与 -m 一样的值,表示不使用swap
对磁盘IO的限制
docker run --device-read-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上读的速度--device-write-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上写的速度--device-read-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上读的次数--device-write-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上写的速度相关文章:
[docker] Docker资源管理
一、docker资源控制 Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如…...
不就业,纯兴趣,应该自学C#还是JAVA?
不就业,纯兴趣,应该自学C#还是JAVA? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家ÿ…...
【Go面试向】defer与time.sleep初探
【Go面试向】defer与time.sleep初探 大家好 我是寸铁👊 总结了一篇defer传参与time.sleep初探的文章✨ 喜欢的小伙伴可以点点关注 💝 请大家看下面这段代码,看运行结果会出现什么,为什么? 问题 demo package mainim…...
fpga外置flash程序烧录流程
Fpga外置FLASH程序烧录流程: step1: 打开vivado2019.2软件,找到hardware manager选项,进入该功能界面; Step2: 确定连接状态,当JTAG正确连接到板卡的调试插针后,会在状态窗口显示…...
什么是通配监听端口? 什么是通配监听IP?
什么是通配监听端口? 监听端口: 指的是服务器或服务开启的特定TCP或UDP端口号,等待客户端连接或发送数据。TCP/IP协议下每个端口只能由一个服务独占监听,一个服务或应用会指定监听特定的一个或多个端口来接收客户端的连接请求。 例如 Web…...
CentOS 安装 Ruby
1.下载 Ruby3.3 并安装 依次执行 wget https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz tar -zxvf ruby-3.3.0.tar.gz cd ruby-3.3.0 ./configure make make install 2.查看版本 ruby -v...
Laya3.0 相机使用
摄像机,是3D场景里边最经常使用的对象了。 官方文档:点击这里学习 1.投影 Projection 透视: 模拟人眼的视觉效果,近大远小。模拟物理世界的规律,将眼睛或相机抽象成一个点,此时视锥体内的物体投影到视平…...
前端语音识别(webkitSpeechRecognition)
前端语音识别(webkitSpeechRecognition)-CSDN博客 Excerpt 文章浏览阅读1.8k次,点赞4次,收藏4次。浏览器实现语音转文字_webkitspeechrecognition webkitSpeechRecognition(语音识别) <span class="token comment">// 创建一个webkitSpeechRecognition实…...
Flutter中状态管理选项的比较:利弊探索
Flutter 应用程序开发的一个关键方面是管理状态,这确保了整个应用程序的数据一致性和更新。然而,Flutter 提供了多种状态管理解决方案,每种解决方案都有自己的优缺点。在这篇博客中,我们将探讨 Flutter 中一些流行的状态管理选项&…...
# [NOI2019] 斗主地 洛谷黑题题解
[NOI2019] 斗主地 题目背景 时限 4 秒 内存 512MB 题目描述 小 S 在和小 F 玩一个叫“斗地主”的游戏。 可怜的小 S 发现自己打牌并打不过小 F,所以他想要在洗牌环节动动手脚。 一副牌一共有 n n n 张牌,从上到下依次标号为 1 ∼ n 1 \sim n 1∼…...
踩坑(6)Redisson调用unlockAsync方法释放锁失败
问题描述 通过redisson的lockAsync异步方法获取到锁之后,再业务执行完成后调用lock.unlockAsync()无法释放当前锁,导致后续的方法被阻塞 public void asyncLock() {RLock lock redissonClient.getLock("asyncLock");RFuture<Void> fut…...
树莓派实战应用:基于人脸识别系统
引言: 随着人工智能技术的不断发展,人脸识别技术已经广泛应用于各种场景,如门禁系统、安全监控等。树莓派作为一种功能强大的迷你计算机,也可以用于搭建人脸识别检测系统。 一、项目简介 人脸识别系统是一种基于人工智能技术的身…...
5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来
一、5G技术:智慧文旅的强大引擎 5G技术的起源可以追溯到2010年,当时世界各国开始意识到4G技术已经达到了瓶颈,无法满足日益增长的移动通信需求。2013年,国际电信联盟(ITU)成立了5G技术研究组,开…...
大模型:相关参数总结
文章目录 一、相关参数 一、相关参数 参数名称是否必填默认值描述model是调用的模型名称message是传入模型的消息max_tokens否返回tokens的数量temperature否top_p否n否表示一个问答返回几个回答的结果信息stream否false表示应答的方式,false表示返回全部的结果&am…...
腾讯云短信开发
短信服务应用申请 """ 准备工作 1)创建短信应用 - 应用管理 2)申请短信签名 - 国内短信 > 签名管理 3)申请短信模块 - 国内短信 > 正文模板管理 """python中开发腾讯云短信服务 """ 1…...
Dockerfile:如何写一个Dockerfile文件?
如何写一个Dockerfile文件? 🚨推荐参考:Dockerfile:如何写一个Dockerfile文件? 现在的项目肯定都离不开docker,只要是流水线部署就会涉及Dockerfile文件,那么如何写一个正确的编写一个Dockerfil…...
Lua 中的高级特性:模块的使用、字符串模式匹配、高阶函数和表的元方法
### 1. 模块的使用 在 Lua 中,模块是一种封装代码的方式,使得代码可以被重用。下面是一个简单的模块定义和使用的示例: lua -- 定义一个名为 mymodule 的模块 mymodule {} function mymodule.sayHello() print("Hello from my mo…...
openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca
文章目录 openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca概述笔记END openssl3.2/test/certs - 040 - EC cert with named curve signed by named curve ca 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev…...
LabVIEW准分子激光器控制系统
LabVIEW准分子激光器控制系统是为了实现准分子激光光源在工业、医疗和科研领域的应用集成及其功能的扩展。系统由PC端和激光器端两部分构成,通过光隔离的RS232通讯连接,以实现稳定可靠的控制与通信。 系统主要由微控制单元(MCU)主…...
热血江湖服务端服务器架设教程
热血江湖服务端服务器架设教程 大家好,我是艾西今天简单的说下热血江湖架设需要哪些东西然后怎么操作,不管你是自己玩还是对外开放,这对于有兴趣的小伙伴总的都是一件好事。技多不压身就是这么个道理,当你需要用上时还希望能记起…...
基于CPX与LSM303的电子罗盘制作:从I2C通信到传感器校准全解析
1. 项目概述与核心价值如果你玩过嵌入式开发,尤其是涉及姿态感知或导航的项目,大概率会碰到一个经典问题:如何让设备“知道”自己面朝哪个方向?加速度计能告诉你设备是平放还是倾斜,陀螺仪能告诉你转得多快,…...
Rust构建的轻量级文件搜索工具fltr:高性能文本检索新选择
1. 项目概述:一个轻量级、高性能的本地文件搜索工具在开发或日常文件管理工作中,我们常常面临一个看似简单却极其恼人的问题:如何在成千上万的文件中,快速、精准地找到包含特定关键词或符合特定模式的那一个?无论是定位…...
基于CircuitPython与RP2350的嵌入式多声道音频系统设计与实践
1. 项目概述:用CircuitPython打造你的专属交互式音频系统如果你玩过树莓派Pico或者Adafruit的Feather系列开发板,可能会觉得在微控制器上处理音频是件挺麻烦的事——要么得用专门的解码芯片,要么代码复杂得让人头疼。但最近我在一个互动艺术装…...
2025最权威的十大降AI率工具推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能生成内容工具广泛应用这件事引出了技术反思,此类工具能高效产出文本图像…...
UPS 蓄电池在线监控系统是什么?工业 UPS 电源有必要安装吗?
在机房、工业生产、医疗设备等依赖 UPS 不间断电源的场景中,蓄电池往往被视为设备的 “心脏”。很多用户配置了优质 UPS 电源,却忽略了对蓄电池的实时管理,等到突发停电才发现电池亏电、失效,导致 UPS 无法正常供电,引…...
DeepSeek MMLU 86.7分是怎么炼成的?从提示工程、校准策略到知识蒸馏链路(内部训练日志首次公开)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek MMLU 86.7分的里程碑意义与基准解读 MMLU 基准的本质与挑战 MMLU(Massive Multitask Language Understanding)是一项覆盖57个学科领域的综合性评测基准,涵…...
长期使用Taotoken聚合API对项目运维复杂度的简化感受
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合API对项目运维复杂度的简化感受 作为项目维护者,我们团队在过去一段时间里,将多个大模…...
御坂翻译器:5分钟快速上手,让Galgame翻译不再困扰你
御坂翻译器:5分钟快速上手,让Galgame翻译不再困扰你 【免费下载链接】MisakaTranslator 御坂翻译器—Galgame/文字游戏/漫画多语种实时机翻工具 项目地址: https://gitcode.com/gh_mirrors/mi/MisakaTranslator 你是否曾因语言障碍而错过精彩的Ga…...
如何用raylib在3天内构建跨平台游戏应用?
如何用raylib在3天内构建跨平台游戏应用? 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib raylib是一个专为游戏开发设计的轻量级跨平台框架ÿ…...
专业级隐私保护工具:Boss-Key老板键完全使用指南
专业级隐私保护工具:Boss-Key老板键完全使用指南 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在现代办公环境中,…...
