服务公告

服务公告 > 技术教程 > 用 cgroup 限制进程资源:内存与 CPU 上限

用 cgroup 限制进程资源:内存与 CPU 上限

发布时间:2025-12-22 20:50
## 场景 一台机器上跑多个任务,最怕一个任务失控连累全体:某个脚本内存泄漏把整机的可用内存吃光,系统开始疯狂换页,所有服务跟着卡顿,最后连登录排查都费劲。cgroup 的 v2 版本提供了进程组级别的资源上限,把每个任务的爆炸半径圈在配额之内,失控任务自己被限制住,邻居毫发无伤。它也是容器资源限制的底层机制,先在裸进程上理解它,再看容器限额会顺理成章。 ## 步骤清单 确认系统挂载了 cgroup v2。 ``` mount | grep cgroup2 ``` 在系统根组下建一个子组并设置上限。 ``` mkdir /sys/fs/cgroup/limited echo 2G > /sys/fs/cgroup/limited/memory.max echo 50% > /sys/fs/cgroup/limited/cpu.max ``` memory.max 是内存硬顶,触碰后内核按组内进程的内存权重回收甚至终止;cpu.max 的两段写法分别是每周期配额与周期长度,写百分之五十表示最多用半个核。把进程号写进 cgroup.procs,限制即刻生效。 ## 验证 内存限制的验证最直接:受控任务里跑一个不断分配的进程,观察它的内存涨到两 G 附近就被终止,同机其他服务的可用内存曲线纹丝不动。CPU 验证用满载进程观察占用是否被压在半核,同时对照系统整体负载没有异常抬升。验证通过后把建组与迁移进程的动作写进任务的启动脚本,重启后自动恢复,手工建的组重启即失,这点与前面 ip 命令的临时配置是同一个道理。 ## 注意事项 内存上限值要参考任务的实际工作集,贴着日常峰值再留三成余量,设太紧会频繁触发回收,反而拖慢任务自己。CPU 上限限制的是可用时间片,不是独占核,任务不会因为限制而绑定到某个核上。批量脚本、压缩备份这类低优先级任务最适合先圈起来,它们的共同点是跑得慢一点无所谓,抢走在线服务的资源才是事故。顺云云服务器混跑多类任务时,用 cgroup 先把批量任务与在线服务隔开,比事后处理一次互相踩踏的故障省心得多。