当前位置: 首页 > news >正文

Linux cgroup v2 资源控制实战:限制进程 CPU/内存/IO,systemd slice 管理

Linux cgroup v2 资源控制实战:限制进程 CPU/内存/IO,systemd slice 管理

Linux cgroup(Control Groups)是内核提供的一种机制,用于限制、记录和隔离进程组的资源使用。cgroup v2 是其第二代实现,统一了层级结构,简化了接口设计,并与 systemd 深度集成。本文将带你从零开始掌握 cgroup v2 的核心用法,包括 CPU、内存、IO 限制,以及通过 systemd slice 进行服务资源管理。


环境要求

本教程在以下环境中测试通过:

  • 操作系统:Ubuntu 22.04 / Debian 12 / CentOS Stream 9
  • 内核版本:5.10+(建议 6.x)
  • systemd 版本:245+

推荐使用雨云服务器 rainyun-com进行实验,注册填优惠码2026off领 5 折优惠券。推荐机型:2 核 4GB Linux 云服务器,足以运行本文所有实验场景,价格实惠,按量计费,适合学习测试。


核心概念

cgroup v1 vs cgroup v2

cgroup v1 采用多层级结构,每种资源(cpu、memory、blkio 等)有独立的层级树,管理复杂,容易出现资源竞争问题。

cgroup v2 采用统一层级,所有控制器挂载在同一棵树下,接口更简洁,解决了 v1 中的多个设计缺陷:

特性cgroup v1cgroup v2
层级结构多层级统一层级
接口路径/sys/fs/cgroup/<controller>//sys/fs/cgroup/
资源控制粒度各控制器独立统一协调
systemd 集成部分支持原生支持
PSI 支持不支持支持

主要控制器

  • cpu:限制 CPU 使用时间(配额/周期)
  • memory:限制内存和 swap 使用
  • io:限制块设备读写速率/IOPS
  • pids:限制进程数量
  • cpuset:绑定 CPU 核心和 NUMA 节点

systemd slice 概念

systemd 使用 slice、scope、service 三种单元类型管理 cgroup:

  • slice:资源控制层级的容器单元(如system.sliceuser.slice
  • scope:由外部程序创建的进程组
  • service:由 systemd 管理的服务

配置步骤

第一步:确认 cgroup v2 已启用

# 检查挂载类型mount|grepcgroup# 应显示 cgroup2 类型# 或检查文件stat-fc%T /sys/fs/cgroup/# 输出 cgroup2fs 说明已启用 v2

若系统使用混合模式,可通过内核参数强制启用纯 v2:

# 编辑 GRUB 配置sudovim/etc/default/grub# 在 GRUB_CMDLINE_LINUX 中添加GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"sudoupdate-grubsudoreboot

第二步:手动创建 cgroup 并限制 CPU

# 创建自定义 cgroupsudomkdir/sys/fs/cgroup/myapp# 启用 cpu 和 memory 控制器(需在父级启用)echo"+cpu +memory +io"|sudotee/sys/fs/cgroup/cgroup.subtree_control# 设置 CPU 限制:每 100ms 周期内最多使用 50ms(即 50% 单核)echo"50000 100000"|sudotee/sys/fs/cgroup/myapp/cpu.max# 将进程加入 cgroup(替换 PID 为实际进程号)echo<PID>|sudotee/sys/fs/cgroup/myapp/cgroup.procs

第三步:限制内存使用

# 设置内存上限为 512MBecho$((512*1024*1024))|sudotee/sys/fs/cgroup/myapp/memory.max# 设置内存软限制(建议值)echo$((400*1024*1024))|sudotee/sys/fs/cgroup/myapp/memory.high# 禁用 swap(可选)echo0|sudotee/sys/fs/cgroup/myapp/memory.swap.max# 查看当前内存使用cat/sys/fs/cgroup/myapp/memory.current

第四步:限制磁盘 IO

# 查看块设备 major:minor 号ls-l/dev/sda# 例如 8:0# 限制读写速率:最大读 50MB/s,写 20MB/secho"8:0 rbps=52428800 wbps=20971520"|sudotee/sys/fs/cgroup/myapp/io.max# 限制 IOPS:最大读 1000 IOPS,写 500 IOPSecho"8:0 riops=1000 wiops=500"|sudotee/sys/fs/cgroup/myapp/io.max# 查看 IO 统计cat/sys/fs/cgroup/myapp/io.stat

第五步:使用 systemd slice 管理服务资源

创建自定义 slice 单元文件:

sudovim/etc/systemd/system/myapp.slice
[Unit] Description=MyApp Resource Slice Before=slices.target [Slice] # CPU 限制:总 CPU 的 30%(相对权重) CPUQuota=30% # 内存限制 MemoryMax=1G MemoryHigh=800M # IO 权重(100 为默认值,越小优先级越低) IOWeight=50

将服务绑定到该 slice:

sudovim/etc/systemd/system/myapp.service
[Unit] Description=MyApp Service After=network.target [Service] Slice=myapp.slice ExecStart=/usr/bin/myapp Restart=always [Install] WantedBy=multi-user.target
sudosystemctl daemon-reloadsudosystemctlenable--nowmyapp.service# 查看资源使用情况systemctl status myapp.service systemd-cgtop

实战示例

场景一:限制 Python 爬虫的 CPU 占用

# 启动爬虫后获取 PIDpython3 spider.py&SPIDER_PID=$!# 创建限制组,CPU 不超过 25%sudomkdir/sys/fs/cgroup/spiderecho"25000 100000"|sudotee/sys/fs/cgroup/spider/cpu.maxecho$((256*1024*1024))|sudotee/sys/fs/cgroup/spider/memory.maxecho$SPIDER_PID|sudotee/sys/fs/cgroup/spider/cgroup.procs# 验证限制效果top-p$SPIDER_PID

场景二:使用 systemd-run 临时限制命令

# 在限制资源的环境中运行命令(无需手动创建 cgroup)sudosystemd-run\--scope\--slice=myapp.slice\-pCPUQuota=20%\-pMemoryMax=256M\-- python3 heavy_task.py

场景三:查看 PSI(压力指标)

cgroup v2 支持 PSI(Pressure Stall Information),可监控资源压力:

# 查看 CPU 压力cat/sys/fs/cgroup/myapp/cpu.pressure# 查看内存压力cat/sys/fs/cgroup/myapp/memory.pressure# 查看 IO 压力cat/sys/fs/cgroup/myapp/io.pressure# 输出示例:# some avg10=0.00 avg60=0.00 avg300=0.00 total=0# full avg10=0.00 avg60=0.00 avg300=0.00 total=0

常见问题

Q:设置 cpu.max 后为何没有限制效果?

A:检查父级 cgroup 是否已启用 cpu 控制器。执行cat /sys/fs/cgroup/cgroup.subtree_control确认包含cpu,若没有则执行echo "+cpu" | sudo tee /sys/fs/cgroup/cgroup.subtree_control

Q:memory.max 设置后进程被 OOM Kill 怎么办?

A:可先设置较宽松的memory.high(软限制),系统会在达到该值时主动回收内存并触发 throttle,而非直接 kill。只有超过memory.max时才会触发 OOM。

Q:如何让 cgroup 设置在重启后持久化?

A:直接操作/sys/fs/cgroup/下的文件不会持久化。推荐通过 systemd slice/service 单元文件管理,或使用cgconfig工具(需安装libcgroup-tools)配合/etc/cgconfig.conf

Q:systemd-cgtop 显示的资源与 top 有差异?

A:systemd-cgtop显示的是 cgroup 维度的聚合数据,而top显示单进程数据。两者统计维度不同,属正常现象。

Q:如何删除自定义 cgroup?

A:先将所有进程移出(移到父级 cgroup),再使用rmdir删除目录:

# 将进程移到根 cgroupecho<PID>|sudotee/sys/fs/cgroup/cgroup.procs# 删除空目录sudormdir/sys/fs/cgroup/myapp

http://www.jsqmd.com/news/964553/

相关文章:

  • 像素风兔子跳跃闯关游戏源码:空格起跳、方向键移动、躲飞弹捡火箭道具
  • Windows下Qt Creator 6.0开发环境快速搭建:手把手解决安装后启动与配置问题
  • 手把手教你:如何把PS-InSAR的参考点“移植”到SBAS里做轨道精炼(附转换脚本)
  • AI 产品的用户反馈闭环:从收集洞察到产品优化
  • Krita Vision Tools:终极AI选区插件让图像编辑效率提升300%
  • 如何用SupContrast实现监督对比学习:提升图像分类性能的完整指南
  • PythonStock项目升级记:从Python3.6到3.7,搞定AKShare 0.9.65股票数据接口的‘start_date’报错
  • 2026德州实地走访测评黄金白银铂金彩金回收诚信门店TOP榜 - 余生黄金回收
  • 2026年 哈氏合金/高温合金/镍基合金源头厂家推荐榜:耐腐蚀与耐高温性能的顶级实力品牌解析 - 企业推荐官【官方】
  • 2026年 无缝钢管/钢管/精密钢管/冷拔钢管/异形钢管厂家推荐榜:高精度工艺与行业应用深度解析 - 企业推荐官【官方】
  • 2026实力之选:广东感应加热机厂家深度解析——聚焦高频/中频/超音频工业加热设备 - 品牌企业推荐师(官方)
  • 2026年 交通杆件生产厂家甄选:八角监控杆/综合杆/电子警察杆/交通F杆实力品牌深度测评 - 品牌企业推荐师(官方)
  • 树莓派TF卡坏了别慌!手把手教你用Win32 Disk Imager无损克隆系统(附下载避坑指南)
  • 2026上海AI搜索GEO排名优化:技术路径与服务能力解析
  • AI 产品商业化路径:从 MVP 到规模化盈利的探索
  • CSDN AI数字营销个人版能商用吗?律师+CTO双视角解读3类高危使用场景
  • 央国企 AI 转型:从工具试点到企业级智能化底座
  • 2026 广州代理记账公司怎么选?5 家高口碑专业财税机构真心推荐 - 互联网科技品牌测评
  • 赤峰黄金上门回收 六家正规门店实测指南 - 余生黄金回收
  • Windows Defender移除工具:专业级安全组件禁用与性能优化指南
  • 东营垦利河口广饶利津黄金回收优选榜 - 余生黄金回收
  • 告别繁琐安装:新手利用快马平台零配置开启python编程第一课
  • MATLAB信号分析实战:从CSV数据到1/3倍频程图的完整流程(附避坑指南)
  • 【路径规划】基于RRT和PRM算法优化3D打印工艺中的支撑结构 附matlab代码
  • 从电话线到光纤:PCM30/32(E1)技术如何在现代网络里“隐形”工作?
  • 2026年GEO优化工具软件选型参考:监测平台技术路径与落地约束解析
  • 2026年 高频焊接机/高频诱导焊接机/全自动高频焊接设备/铜产品焊接设备/制冰机焊接机源头厂家推荐:焊接精度与设备稳定性双优之选 - 企业推荐官【官方】
  • 蓝底证件照可以换成白底吗?2026手机免费一键蓝底转白底详细教程 - 科技大爆炸
  • 2026年塑胶跑道厂家推荐榜单:广州透气型/混合型/全塑型/自结纹/400米标准运动场塑胶跑道工程与翻新优选 - 品牌企业推荐师(官方)
  • 2026年铝线电缆厂家推荐排行榜:BLVV/YJLV/YJLHV/光伏铝线/铠装铝合金电缆源头品牌深度解析 - 企业推荐官【官方】