核心与节点绑定
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 节点拓扑,避免绑到错误节点