
🚀 欢迎来到我的CSDN博客:Optimistic _ chen
✨ 一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!
🚀我的专栏推荐:
| 专栏 | 内容特色 | 适合人群 |
|---|---|---|
| 🔥C语言从入门到精通 | 系统讲解基础语法、指针、内存管理、项目实战 | 零基础新手、考研党、复习 |
| 🔥Java基础语法 | 系统解释了基础语法、类与对象、继承 | Java初学者 |
| 🔥Java核心技术 | 面向对象、集合框架、多线程、网络编程、新特性解析 | 有一定语法基础的开发者 |
| 🔥Java EE 进阶实战 | Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 | 想快速入门Java Web开发的同学 |
| 🔥Java数据结构与算法 | 图解数据结构、LeetCode刷题解析、大厂面试算法题 | 面试备战、算法爱好者、计算机专业学生 |
| 🔥Redis系列 | 从数据类型到核心特性解析 | 项目必备 |
🚀我的承诺:
✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例
✅ 持续更新:专栏内容定期更新,紧跟技术趋势
✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)
🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨
📌 标签:#技术博客 #编程学习 #Java #C语言 #算法 #程序员
文章目录
- 什么是cgroups
- 基础命令
- cgroups信息查看
- 使用cgroups对内存进行控制
- 使用cgroups对CPU进行控制
-
- [创建cpu 的cgroup](#创建cpu 的cgroup)
- 开启一个stress模拟cpu使用
- 检测控制效果
- 完结撒花!🎉
什么是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 v1和cgroup 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 带宽 ,默认值100000cfs_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
📌 收藏本文,下次需要时不迷路!
我们下期再见!💫 持续更新中......
悄悄说:点击主页有更多精彩内容哦~ 😊
