Ubuntu 22.04下基于Cgroups V2限制非Root用户资源及从Cgroups v1迁移的方案咨询
Ubuntu 22.04下基于Cgroups V2限制非Root用户资源及从Cgroups v1迁移的方案咨询
嗨,刚好我之前在Ubuntu 22.04上完成过从Cgroups v1到v2的迁移,还配置过非root用户的资源限制,给你整理了一套实操方案,一步步来应该没问题:
一、先确认Ubuntu 22.04的Cgroups v2状态
Ubuntu 22.04默认已经启用Cgroups v2,但还是建议先验证一下:
mount | grep cgroup
如果输出里看到cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate),说明v2已经正常启用。
如果没启用,需要修改GRUB配置开启:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX_DEFAULT,添加systemd.unified_cgroup_hierarchy=1,比如:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=1" - 更新GRUB并重启:
sudo update-grub sudo reboot
二、迁移前的准备工作
- 备份原v1配置:把你之前在
/sys/fs/cgroup下各个v1子系统(比如cpu、memory)里的配置文件,还有软件中调用v1接口的脚本/代码都备份好,记录清楚每个用户的CPU配额、内存限制等规则。 - 梳理软件依赖:检查你的软件是否依赖第三方Cgroups库(比如libcgroup),Ubuntu 22.04的libcgroup版本已经支持v2,但建议提前确认兼容性。
三、配置非Root用户的资源限制(两种方案)
方案1:用Systemd用户Slice(推荐,适配Systemd生态)
Ubuntu 22.04用Systemd管理进程,用户的所有进程默认归属于user-<UID>.slice,直接修改这个Slice的配置就能限制资源:
- 找到目标用户的UID(比如用户
alice的UID是1000),创建Slice的重载配置目录:sudo mkdir -p /etc/systemd/system/user-1000.slice.d - 创建
override.conf配置文件,写入资源限制规则(以CPU50%、内存1G为例):[Slice] # CPU使用率上限50% CPUQuota=50% # 内存上限1G MemoryMax=1G - 重载Systemd配置,让规则生效:
sudo systemctl daemon-reload - 让用户重新登录,之后该用户启动的所有进程都会自动应用这个资源限制。
方案2:手动创建Cgroup(适合自定义进程组场景)
如果你的软件需要更灵活的分组(比如同一个用户下的不同进程组用不同限制),可以手动创建Cgroup:
- 先开放非root用户的Cgroup权限:
# 允许用户控制cpu和memory子系统,按需添加其他子系统(比如io、pids) echo "+cpu +memory" | sudo tee /etc/cgroup2.subtree_control - 为目标用户创建专属Cgroup目录,并修改权限:
sudo mkdir /sys/fs/cgroup/alice_group sudo chown alice:alice /sys/fs/cgroup/alice_group - 配置资源限制:
# CPU上限50%(100000代表100%,50000即50%) echo "50000 100000" > /sys/fs/cgroup/alice_group/cpu.max # 内存上限1G echo "1G" > /sys/fs/cgroup/alice_group/memory.max - 将进程移入该Cgroup:
# 把当前shell的进程移入,也可以替换成指定PID echo $$ > /sys/fs/cgroup/alice_group/cgroup.procs
四、迁移软件中的Cgroups调用逻辑
把原来基于v1的接口改成v2的,核心参数对应关系如下:
| Cgroups v1参数 | Cgroups v2参数 | 参数说明变化 |
|---|---|---|
cpu.cfs_quota_us/cpu.cfs_period_us | cpu.max | v2用配额 周期格式,或直接百分比 |
memory.limit_in_bytes | memory.max | v2支持更直观的单位(如1G、512M) |
cpu.shares | cpu.weight | v1是相对权重(1024为基准),v2是1-10000的权重 |
比如原来v1设置CPU配额的代码:
echo 50000 > /sys/fs/cgroup/cpu/alice/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu/alice/cpu.cfs_period_us
改成v2的写法:
echo "50000 100000" > /sys/fs/cgroup/alice_group/cpu.max
五、验证限制是否生效
可以用以下方式验证:
- 用
systemd-cgtop查看各个Cgroup的资源使用情况,确认目标用户的Cgroup被限制。 - 直接查看Cgroup的统计文件:
# 查看CPU使用统计 cat /sys/fs/cgroup/alice_group/cpu.stat # 查看内存使用统计 cat /sys/fs/cgroup/alice_group/memory.stat - 运行高负载测试(比如
stress工具),观察是否触发资源限制:
此时用# 安装stress sudo apt install stress # 运行CPU压力测试 stress --cpu 4top或htop查看,该用户的CPU使用率不会超过你设置的上限。
注意事项
- 部分老工具(比如
cgexec)对v2的支持不完善,建议优先用Systemd工具或直接操作sysfs文件。 - 如果你的软件需要跨用户的Cgroup管理,确保操作时拥有足够的权限(比如用sudo,或配置合适的文件权限)。
- 迁移后建议观察一段时间,确认软件的资源限制逻辑正常,没有出现异常卡顿或崩溃。
备注:内容来源于stack exchange,提问作者G. Raven
相关产品推荐
相关产品推荐

