cgroups可精细化控制Linux服务进程的CPU和内存资源:先挂载cpu、memory子系统,再通过cpu.cfs_quota_us/cpu.cfs_period_us设CPU上限,memory.limit_in_bytes设内存上限并可禁用OOM killer,systemd服务可通过CPUQuota和MemoryLimit直接配置,最后用usage_in_bytes、cpu.stat等验证生效。

如果您在Linux系统中需要对服务进程的CPU、内存等资源进行精细化控制,cgroups提供了内核级的隔离与限制能力。以下是基于cgroups v1基础框架开展资源限制的实操步骤:
一、创建cgroups控制组并挂载子系统
cgroups通过层级化目录结构管理资源配额,需先确认内核已启用对应子系统,并将cpu、memory等子系统挂载到指定挂载点,以便后续写入参数。
1、检查当前已挂载的cgroups子系统:cat /proc/cgroups
2、创建挂载目录:sudo mkdir -p /sys/fs/cgroup/cpu_myapp /sys/fs/cgroup/memory_myapp
3、挂载cpu和memory子系统:sudo mount -t cgroup -o cpu none /sys/fs/cgroup/cpu_myapp
4、sudo mount -t cgroup -o memory none /sys/fs/cgroup/memory_myapp
二、为服务进程设置CPU使用上限
通过cpu子系统的cpu.cfs_quota_us与cpu.cfs_period_us文件可限定某组进程在固定周期内最多运行的微秒数,实现硬性CPU时间配额控制。
1、进入cpu控制组目录:cd /sys/fs/cgroup/cpu_myapp
2、设定调度周期为100000微秒(即100ms):echo 100000 | sudo tee cpu.cfs_period_us
3、设定该组每周期最多使用50000微秒CPU时间(即50%单核):echo 50000 | sudo tee cpu.cfs_quota_us
4、将目标服务PID写入tasks文件:echo PID | sudo tee tasks
三、为服务进程设置内存使用上限与OOM保护
memory子系统通过memory.limit_in_bytes限制最大可用物理内存,配合memory.oom_control可禁用内核OOM killer,避免进程被意外终止。
1、进入memory控制组目录:cd /sys/fs/cgroup/memory_myapp
2、设定内存上限为512MB:echo 536870912 | sudo tee memory.limit_in_bytes
3、禁用OOM killer以保留进程状态供调试:echo 1 | sudo tee memory.oom_control
4、将目标服务PID加入该组:echo PID | sudo tee tasks
四、使用systemd动态绑定服务到cgroups路径
对于由systemd管理的服务,无需手动挂载或写入tasks,可通过systemd单元配置文件直接声明资源限制,由systemd自动映射至cgroups v2路径(若启用v2)或兼容v1接口。
1、编辑目标服务单元文件:sudo systemctl edit myservice.service
2、添加CPU配额限制段:[Service]\nCPUQuota=50%
3、添加内存限制段:MemoryLimit=512M
4、重载配置并重启服务:sudo systemctl daemon-reload && sudo systemctl restart myservice.service
五、验证cgroups资源限制生效情况
限制是否实际起效需通过实时读取cgroups统计文件及系统工具交叉比对,重点关注usage、stat等关键指标是否符合预期阈值。
1、查看当前组内存使用量(字节):cat /sys/fs/cgroup/memory_myapp/memory.usage_in_bytes
2、查看CPU使用统计(毫秒):cat /sys/fs/cgroup/cpu_myapp/cpu.stat
3、观察进程是否被限频:watch -n1 'ps -o pid,pcpu,pmem,comm -p PID'
4、检查cgroups路径下tasks文件是否包含目标PID:cat /sys/fs/cgroup/cpu_myapp/tasks










