【Docker入门】cgroups 资源控制

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

什么是cgroups

cgroups(Control Groups)是Linux 内核提供的一种机制:根据需求把一系列系统任务及其子任务整合(分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。

cgroups 能够对 CPU、内存等资源进行精细化管控,是操作系统底层的核心资源控制机制。

基础命令

pidstat

pidstat 是systat的一个命令,用于监控全部或者指定进程的CPU、内存、线程、设别IO等系统资源的占用情况。

用户可以通过指定统计的次数和时间来获得所需的统计信息

powershell 复制代码
pidstat [选项] [<时间间隔>] [<次数>]

首先我们需要在系统里面安装sysstat 命令

powershell 复制代码
apt install sysstat -y

参数:

  • -u默认参数 ,显示各进程的CPU 使用统计

  • -r:显示各进程的内存 使用统计

  • -d:显示各进程的IO使用情况

  • -p:指定进程号 ,ALL表示所有进程

  • -C:指定命令

*-l:显示命令名和所有参数

stress

stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试

首先在系统安装stress命令

powershell 复制代码
apt install stress -y
powershell 复制代码
stress [option [arg]]

参数

  • -c N:产生N个进程,每个进程循环调用sqrt函数产生CPU压力
  • -i N:产生N个进程,每个进程循环调用sync将内存缓冲区内容写到硬盘上,产生IO压力
  • -m N:产生N个进程,每个进程循环调用malloc函数分配和free释放内存
      --vm-bytes B:指定分配内存大小
      --vm-keep:一致占用内存,区别在于不断释放和重新分配内存
  • -d N:产生N个不断执行write和unlink函数的进程(创建文件、写入文件、删除文件)
  • -t N:在N秒后结束程序
  • -q:程序在运行过程中不输出信息

我们要监控一个stress程序所有的进程中的CPU,监控周期是2秒检测一次,检测10000次

powershell 复制代码
pidstat -C stress -p ALL  -u 2 10000


随后,我们在stress中执行stress -c 1命令 ,如下图 CPU 基本爆满

cgroups信息查看

cgroups版本查看存在有cgroup v1cgroup v2

powershell 复制代码
cat /proc/filesystems | grep cg

那么两个有什么区别呢?

  • v1:每个控制器有自己的目录(如 /sys/fs/cgroup/cpu/, /sys/fs/cgroup/memory/)
  • v2:只有一个统一的挂载点 /sys/fs/cgroup/,所有控制器都在这里

cgroups子系统查看 :支持对哪些资源(左侧)可以控制

powershell 复制代码
# cgcroup1
cat /proc/cgroups

系统默认挂载了 cgroup v2 文件系统, 默认存储位置是/sys/fs/cgroup/

powershell 复制代码
# cgcroup2
cat /sys/fs/cgroup/cgroup.controllers

cgroups挂载信息的查看

powershell 复制代码
# cgroup2 挂载
mount |grep cgroup


查看一个进程上的cgroup 限制

powershell 复制代码
# cgroup2
cat /proc/$$/cgroup
ll /sys/fs/cgroup/user.slice/user-0.slice/session-14557.scope

在user.slice目录中,里面有对init进程详细限制信息

使用cgroups对内存进行控制

确认当前版本的cgroup,支持对内存的控制

创建一个内存cgroup

以cgroup2操作
创建内存的cgroup,创建子cgroup目录

powershell 复制代码
mkdir /sys/fs/cgroup/test_memory
ll /sys/fs/cgroup/test_memory/

配置内存

配置 cgroup 最大使用20MB内存

powershell 复制代码
cd /sys/fs/cgroup/test_memory
echo 20M > memory.max

启动一个stress进程

启动一个stress进程(同时启动监控),也就是消耗内存的进程,每个进程占用50MB内存

powershell 复制代码
cd /sys/fs/cgroup/test_memory
stress -m 1 --vm-bytes 50M

再启动一个shell,启动监控进程

powershell 复制代码
pidstat -r -C stress -p ALL 2 10000

检测cgroup效果

进程ID移动到我们的cgroup.procs策略 中,同时我们发现stress进程因为无法申请到足够内存而退出,进程消失。

使用cgroups对CPU进行控制

以cgroup2操作

创建cpu 的cgroup

我们先进入到挂载点/sys/fs/cgroup/,创建test_cpu,通过ll命令可以看到系统自动帮我们创建cgroup的cpu策略。

powershell 复制代码
cd /sys/fs/cgroup/
mkdir test_cpu
ll test_cpu

开启一个stress模拟cpu使用

powershell 复制代码
stress -c 1

再使用一个监控进程

powershell 复制代码
pidstat -u -C stress -p ALL 2 10000

检测控制效果

设置cgroup的cpu使用率为30%,计算公式有两种

  • cfs_period_us:cfs_period_us 表示一个 cpu 带宽,单位为微秒。系统总 CPU 带宽 ,默认值100000
  • cfs_quota_us:cfs_quota_us 表示 Cgroup 可以使用的 cpu 的带宽,单位为微秒。cfs_quota_us 为-1,表示使用的 CPU 不受 cgroup 限制。cfs_quota_us 的最小值为1ms(1000),最大值为1s

我们将cfs_quota_us的值设置为30000,从理论上讲就可以限制test_cpu控制 的进程的cpu利用率最大30%

powershell 复制代码
cd /sys/fs/cgroup/test_cpu
echo "30000 100000">cpu.max
echo 3246800 > cgroup.procs

实际上,我们观察发现cpu使用率成功降到30%

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
LXY_BUAA2 小时前
《嵌入式操作系统》_内核编译练习与配置文件讲解_20260119
linux·运维·服务器
林九生2 小时前
【MySQL/PostgreSQL】MySQL 到 PostgreSQL 数据迁移:Docker + pgloader
mysql·docker·postgresql
WX _ jishuwu19903 小时前
deeploc 2.1 大批量蛋白亚细胞定位分析,适合三代测序级数据、真菌全菌数据的分析
ubuntu·三代测序·亚细胞定位,·deeploc·protcompv9·真菌基因组
触想工业平板电脑一体机3 小时前
【触想智能】MES工位一体机在自动化生产线上的作用和市场应用前景分析
大数据·运维·自动化
芥子沫3 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi3 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
xlq223223 小时前
4.LInux权限
linux·运维·服务器
HiTomcat3 小时前
一键自动化部署 macOS 开发环境
运维·macos·自动化