You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置开启:

  1. 编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX_DEFAULT,添加systemd.unified_cgroup_hierarchy=1,比如:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=1"
    
  2. 更新GRUB并重启:
    sudo update-grub
    sudo reboot
    

二、迁移前的准备工作

  1. 备份原v1配置:把你之前在/sys/fs/cgroup下各个v1子系统(比如cpu、memory)里的配置文件,还有软件中调用v1接口的脚本/代码都备份好,记录清楚每个用户的CPU配额、内存限制等规则。
  2. 梳理软件依赖:检查你的软件是否依赖第三方Cgroups库(比如libcgroup),Ubuntu 22.04的libcgroup版本已经支持v2,但建议提前确认兼容性。

三、配置非Root用户的资源限制(两种方案)

方案1:用Systemd用户Slice(推荐,适配Systemd生态)

Ubuntu 22.04用Systemd管理进程,用户的所有进程默认归属于user-<UID>.slice,直接修改这个Slice的配置就能限制资源:

  1. 找到目标用户的UID(比如用户alice的UID是1000),创建Slice的重载配置目录:
    sudo mkdir -p /etc/systemd/system/user-1000.slice.d
    
  2. 创建override.conf配置文件,写入资源限制规则(以CPU50%、内存1G为例):
    [Slice]
    # CPU使用率上限50%
    CPUQuota=50%
    # 内存上限1G
    MemoryMax=1G
    
  3. 重载Systemd配置,让规则生效:
    sudo systemctl daemon-reload
    
  4. 让用户重新登录,之后该用户启动的所有进程都会自动应用这个资源限制。

方案2:手动创建Cgroup(适合自定义进程组场景)

如果你的软件需要更灵活的分组(比如同一个用户下的不同进程组用不同限制),可以手动创建Cgroup:

  1. 先开放非root用户的Cgroup权限:
    # 允许用户控制cpu和memory子系统,按需添加其他子系统(比如io、pids)
    echo "+cpu +memory" | sudo tee /etc/cgroup2.subtree_control
    
  2. 为目标用户创建专属Cgroup目录,并修改权限:
    sudo mkdir /sys/fs/cgroup/alice_group
    sudo chown alice:alice /sys/fs/cgroup/alice_group
    
  3. 配置资源限制:
    # 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
    
  4. 将进程移入该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_uscpu.maxv2用配额 周期格式,或直接百分比
memory.limit_in_bytesmemory.maxv2支持更直观的单位(如1G、512M)
cpu.sharescpu.weightv1是相对权重(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

五、验证限制是否生效

可以用以下方式验证:

  1. 用systemd-cgtop查看各个Cgroup的资源使用情况,确认目标用户的Cgroup被限制。
  2. 直接查看Cgroup的统计文件:
    # 查看CPU使用统计
    cat /sys/fs/cgroup/alice_group/cpu.stat
    # 查看内存使用统计
    cat /sys/fs/cgroup/alice_group/memory.stat
    
  3. 运行高负载测试(比如stress工具),观察是否触发资源限制:
    # 安装stress
    sudo apt install stress
    # 运行CPU压力测试
    stress --cpu 4
    
    此时用top或htop查看,该用户的CPU使用率不会超过你设置的上限。

注意事项

  • 部分老工具(比如cgexec)对v2的支持不完善,建议优先用Systemd工具或直接操作sysfs文件。
  • 如果你的软件需要跨用户的Cgroup管理,确保操作时拥有足够的权限(比如用sudo,或配置合适的文件权限)。
  • 迁移后建议观察一段时间,确认软件的资源限制逻辑正常,没有出现异常卡顿或崩溃。

备注:内容来源于stack exchange,提问作者G. Raven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 13:15:31