如何提升cgroup中cpu.shares的控制粒度并调整其上限?
嘿,先纠正一个关键误解:cpu.shares的默认值1024并不是“100%可用计算能力”的上限,它只是内核用来计算资源分配的基准权重值。这个参数的核心是相对分配,而非绝对限制——也就是说,它决定的是你的cgroup在和其他cgroup竞争CPU资源时,能拿到的比例。
提升相对权重的控制粒度
你完全可以把cpu.shares设为2048、8192甚至更大的正整数,内核并没有限制这个值的上限。举个实际场景的例子:
- 如果系统里只有你的cgroup,不管你把
cpu.shares设成1024还是8192,它都能用到全部CPU资源(因为没有其他竞争者) - 如果有另一个cgroup的
cpu.shares设为1024,而你的设为2048,那你的cgroup会拿到2/3的CPU资源,对方拿到1/3 - 要是你的设为8192,对方还是1024,那你会拿到8/9的资源
设置命令很直接,写入对应cgroup的控制文件即可:
echo 8192 > /sys/fs/cgroup/cpu/your_cgroup_name/cpu.shares
如果需要绝对CPU占用上限
如果你真正想要的是“固定最大CPU使用率”(而不是相对权重),那cpu.shares就不是合适的工具了。你应该用cpu.cfs_quota_us和cpu.cfs_period_us这对参数:
cpu.cfs_period_us:统计CPU使用的周期,默认是100000微秒(即100毫秒)cpu.cfs_quota_us:在一个周期内,该cgroup允许占用的CPU时间总量
比如要限制你的cgroup最多使用2个CPU核心(假设是多核系统),可以这么设置:
# 保持周期为默认的100ms echo 100000 > /sys/fs/cgroup/cpu/your_cgroup_name/cpu.cfs_period_us # 允许每个周期使用200ms的CPU时间(相当于2核的上限) echo 200000 > /sys/fs/cgroup/cpu/your_cgroup_name/cpu.cfs_quota_us
如果要设置成1.5核的上限,就把cpu.cfs_quota_us设为150000即可。
内容的提问来源于stack exchange,提问作者offbynull
相关产品推荐
相关产品推荐

