首页/系统/Linux 内核与性能调优速查/cgroup v2 cpuset 核心与节点绑定
CPU 与调度60 条

cgroup v2 cpuset 核心与节点绑定

cpuset.cpus 与 cpuset.mems 把一组任务限定在指定 CPU 与 NUMA 节点上运行,属于硬性隔离,常用于核心独占。

核心与节点绑定

cpuset.cpus 与 cpuset.mems 把一组任务限定在指定 CPU 与 NUMA 内存节点上运行,属于硬性隔离而不是按比例分配。子控制组的集合必须是父组集合的子集,层级越深可用范围越窄。实际生效的集合要看 cpuset.cpus.effective 与 cpuset.mems.effective,它们包含父组裁剪的结果。常见用途是核心独占、NUMA 亲和以及把关键服务与干扰源分开。

基本信息

接口文件cpuset.cpus 与 cpuset.mems,实际值看对应的 .effective
systemd 对应AllowedCPUs= 与 AllowedMemoryNodes=
子组规则集合必须是父组集合的子集
生效特点硬绑定,立即作用于组内全部任务
前提条件cgroup v2 需在父组启用 cpuset 控制器

典型使用场景

  • 核心独占:把关键服务固定在专用核上
  • NUMA 亲和:让任务与其内存落在同一节点
  • 隔离干扰源:批处理与延迟敏感服务分到不同核组
  • 配合中断亲和规划收包核与业务核
  • 容器资源规划:限定 Pod 可使用的核集合

设置与核对

设置与核对
cat /sys/fs/cgroup/<组>/cpuset.cpus.effective
echo 2-3 > /sys/fs/cgroup/<组>/cpuset.cpus
echo 0 > /sys/fs/cgroup/<组>/cpuset.mems
systemctl set-property myservice.service AllowedCPUs=2-3
systemctl set-property myservice.service AllowedMemoryNodes=0
lscpu | grep -E 'NUMA|CPU\(s\)'   # 确认核号与节点对应关系
numactl -H | head -20               # 查看节点与核的拓扑
cat /sys/fs/cgroup/<组>/cpuset.mems.effective

文件读法

文件含义注意
cpuset.cpus允许使用的 CPU 集合写入值可能被父组裁剪
cpuset.cpus.effective实际生效的 CPU 集合排查「写了不生效」要看这个
cpuset.mems允许分配内存的 NUMA 节点写错节点会导致分配失败或 OOM
cpuset.mems.effective实际生效的节点集合受父组与机器拓扑约束
cpuset 是硬绑定:绑错核比不限核更糟,改前先确认核编号与 NUMA 拓扑,避免把关键服务挤进少数核。
cpuset.mems 必须写任务可访问的节点;在单节点机器上写成 1 这类不存在的节点,会导致内存分配失败或触发 OOM。

不生效时的排查顺序

  • 先读相应的 .effective 文件,确认父组是否把集合裁剪得更窄
  • 确认父组已经启用 cpuset 控制器,否则子组文件不会出现
  • 核对核编号与 NUMA 节点拓扑,避免绑到错误节点

易错点

  • 只看 cpuset.cpus 不看 .effective:父组裁剪后实际集合更窄,容易误判为设置未生效
  • cpuset.mems 写错节点:内存分配失败或 OOM,单节点机器上尤其明显
  • 把关键服务挤到过窄的核集合:吞吐下降且热点集中
  • 迁移容器时沿用旧核号:不同机型的编号与拓扑不同,绑核结果不可预期
  • 忘记父组启用 cpuset 控制器:cgroup v2 中父组未开启时子组文件不会出现

数据来源与参考

  • Linux 内核 Documentation/admin-guide/cgroup-v2.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌