cgroups通过cpu.weight(v2)或cpu.shares(v1)实现CPU时间相对权重分配,cpuset.cpus实现物理核心精确绑定,二者配合可实现“分多少”与“在哪分”的协同控制。

Linux cgroups(control groups)通过 cpu.weight(v2)或 cpu.shares(v1)实现处理器资源的相对权重分配,而多核绑定则依赖 cpuset.cpus 实现物理 CPU 核心的精确隔离。两者常配合使用:权重决定“分多少”,绑定决定“在哪分”。配置不当易导致资源争抢、负载不均或容器性能抖动。
理解 cpu.weight:v2 中的相对权重机制
cpu.weight 取值范围为 1–10000,默认为 100。它不表示百分比,而是与其他 cgroup 的 weight 比值决定 CPU 时间占比。例如:
- A 组 weight=500,B 组 weight=1000 → B 获得约 2/3 的可用 CPU 时间,A 约 1/3
- 若只有 A 运行(weight=500),且系统空闲,A 可用满核;但当 A 和 B 同时竞争时,才按比例调度
- weight 仅在 CPU 饱和时生效;空闲时不设限
设置 cpuset.cpus:精准绑定物理核心
cpuset.cpus 指定该 cgroup 允许使用的 CPU 编号(从 0 开始),支持范围写法(如 0-3)、列表写法(如 0,2,4)或混合(如 0-1,4)。关键点:
- 需先挂载 cpuset 子系统:
mount -t cgroup2 none /sys/fs/cgroup(v2 默认启用所有控制器) - 子 cgroup 继承父级
cpuset.cpus,但可进一步缩小(不能扩大) - 绑定前确认 CPU 是否 online:
cat /sys/devices/system/cpu/online - 避免跨 NUMA 节点混绑(如同时指定 node0 的 CPU0 和 node1 的 CPU8),否则可能增加内存延迟
组合使用:权重 + 绑定的典型场景
生产中常见需求是“为数据库容器分配独占 4 核,并保障其优先于后台任务”。操作步骤如下:
- 创建 cgroup 目录:
mkdir -p /sys/fs/cgroup/db - 绑定 CPU:
echo "0-3" > /sys/fs/cgroup/db/cpuset.cpus - 设置权重(高于默认):
echo 800 > /sys/fs/cgroup/db/cpu.weight - 将进程加入:
echo $PID > /sys/fs/cgroup/db/cgroup.procs - 验证:
cat /sys/fs/cgroup/db/cpuset.cpus.effective(确认生效范围),cat /sys/fs/cgroup/db/cpu.stat(查看 throttling 和 usage)
避坑提醒:常见配置错误
实际部署中以下问题高频出现:
-
未关闭 idle 调度器干扰:某些内核版本下,若绑定的 CPU 处于 idle 状态,CFS 可能绕过 cpuset 限制。建议搭配
isolcpus=内核启动参数隔离关键核 - weight 设置过低(如 1):可能导致 cgroup 在竞争中几乎得不到时间片,应避免低于 10
-
cpuset.mems 未同步设置:若启用了内存节点控制,必须同时配置
cpuset.mems,否则会报错无法写入cpuset.cpus -
容器运行时覆盖配置:Docker/Podman 默认使用自己的 cgroup 配置,需通过
--cpus、--cpuset-cpus或--cgroup-parent显式传递,而非直接改宿主机路径










