linux中进程资源限制主要通过 cgroups v2 实现,挂载于 /sys/fs/cgroup,支持内存(memory.max)、CPU(cpu.max)等精细化控制,并可通过 systemd 持久化配置及 接口 文件实时监控。

Linux 中进程资源限制主要通过 cgroups(control groups)实现,它能对 CPU、内存、IO 等资源进行精细化分组管理。配置 cgroups 不依赖第三方 工具,现代 Linux 发行版(如centos 7+/ubuntu 16.04+)默认启用 cgroups v2,推荐优先使用 v2 统一接口。
确认 cgroups 版本与挂载点
cgroups v2 通常挂载在/sys/fs/cgroup,且为单一层级结构。运行以下命令验证:
- cat /proc/cgroups:若第三列(enabled)全为 1,且 name= 字段为空,说明 v2 已启用
- mount | grep cgroup:应看到cgroup2 on /sys/fs/cgroup type cgroup2
- 若看到多个 cgroup 挂载点(如 /sys/fs/cgroup/cpu),说明系统运行在 v1 兼容模式,需检查systemd 配置或内核启动参数(systemd.unified_cgroup_hierarchy=1)
创建并配置资源控制组(v2)
以限制某个后台服务的内存和 CPU 为例:
- 新建子目录:sudo mkdir /sys/fs/cgroup/myapp
- 限制内存上限为 512MB:echo 536870912 | sudo tee /sys/fs/cgroup/myapp/memory.max
- 限制 CPU 使用率不超过 2 个逻辑核心(即 200%):echo 200000 | sudo tee /sys/fs/cgroup/myapp/cpu.max(格式为quota period,默认 period=100000 微秒,200000 表示 200ms/100ms)
- 将进程加入该组:echo $PID | sudo tee /sys/fs/cgroup/myapp/cgroup.procs(PID 为要限制的进程 ID)
持久化配置(避免重启失效)
手动写入 /sys/fs/cgroup 仅临时生效。生产环境建议用 systemd 管理:
- 为服务单元添加资源限制:编辑 /etc/systemd/system/myapp.service,在[Service] 段下添加:
- MemoryMax=512M
- CPUQuota=200%
- IOWeight=50(可选,限制 IO 权重)
- 重载配置:sudo systemctl daemon-reload && sudo systemctl restart myapp
监控与调试技巧
实时查看资源使用情况可直接读取 cgroup 接口文件:
- 当前内存使用:cat /sys/fs/cgroup/myapp/memory.current
- 内存使用峰值:cat /sys/fs/cgroup/myapp/memory.peak
- CPU 时间统计:cat /sys/fs/cgroup/myapp/cpu.stat(含 usage_usec、nr_periods 等)
- 若进程被 OOM Killer 终止,检查 memory.events 中的 oom_kill 计数