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计数