Linux下无法挂载cgroup v1 cpu子系统问题求助
Linux下无法挂载cgroup v1 cpu子系统问题求助
嗨,我来帮你拆解这个问题哈!先从你问的cpu和cpuacct是什么说起,再分析挂载失败的原因,最后给你解决思路。
先搞清楚cpu和cpuacct子系统的区别
在cgroup v1里,这俩是经常绑定在一起的子系统,分工很明确:
- cpu子系统:管的是CPU资源的限制与调度,比如给进程设置CPU使用率上限、指定可用的CPU核心、调整进程调度优先级这类控制型操作。
- cpuacct子系统:管的是CPU资源的统计审计,比如统计某个cgroup下所有进程累计用了多少CPU时间、用户态/内核态分别用了多少,方便做资源使用的核算。
为什么单独挂载cpu子系统会提示“Device or resource busy”
从你给出的/proc/cgroups输出能看到,cpu和cpuacct的hierarchy(层级)编号都是3——这就说明它们已经被绑定挂载到同一个cgroup层级里了!
在cgroup v1的设计里,有些子系统是不能单独挂载的,cpu和cpuacct就是典型的一对,它们必须共用同一个层级。你现在尝试单独挂载cpu子系统时出错,本质是因为cpu已经和cpuacct一起挂载到某个路径下了(就是你看到的none already mounted on <...>),所以系统会提示“设备或资源忙”。
解决办法
方案1:直接用已有的联合挂载点(推荐)
其实你完全不需要重新挂载,直接在已有的cpu,cpuacct挂载点下操作就可以实现cpu子系统的所有功能。比如:
- 先找到这个联合挂载点,执行命令:
你会得到类似这样的输出:mount | grep cpu,cpuacctnone on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct),这个路径就是挂载点。 - 在这个路径下创建自定义cgroup,然后设置CPU限制:
# 创建自定义cgroup mkdir /sys/fs/cgroup/cpu,cpuacct/my_cpu_limit_group # 设置CPU使用率上限为50%(cfs_quota_us设为周期的一半,周期默认100000微秒即100ms) echo 50000 > /sys/fs/cgroup/cpu,cpuacct/my_cpu_limit_group/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu,cpuacct/my_cpu_limit_group/cpu.cfs_period_us # 把进程PID加入这个cgroup echo 1234 > /sys/fs/cgroup/cpu,cpuacct/my_cpu_limit_group/cgroup.procs
方案2:卸载联合挂载后单独挂载cpu(不推荐)
如果你确实一定要单独挂载cpu子系统(其实没必要,因为cpuacct的统计功能通常很有用),可以先卸载已有的cpu,cpuacct挂载,再重新挂载:
# 先卸载联合挂载点,注意:这可能影响系统进程,仅在测试环境操作! umount /sys/fs/cgroup/cpu,cpuacct # 单独挂载cpu子系统到你的目标路径 mount -t cgroup -o cpu none /root/tmp0
备注:内容来源于stack exchange,提问作者JenyaKh
相关产品推荐
相关产品推荐

