把容器锁在指定核上
--cpuset-cpus 把容器可用的 CPU 核限定在给定的集合上,取值形式是逗号分隔的核号或连字符范围,例如 0,1 或 0-2。用途是隔离调度抖动:让实时性要求高的服务独占几核,或者让噪声邻居与关键服务错开到不同的核上。它解决的是 CPU 层面的竞争,内存带宽与磁盘 IO 的互相影响不在它的作用范围里。
基本信息
| 语法 | --cpuset-cpus="0,1" 或 "0-2" |
|---|---|
| 取值依据 | 宿主 nproc 与 /proc/cpuinfo 的核编号 |
| 核对方式 | docker inspect 的 HostConfig.CpusetCpus 字段 |
| 作用范围 | 仅 CPU 调度,不含内存与 IO 争抢 |
典型使用场景
- 关键服务独占:把实时性要求高的进程固定在少数核上,减少调度抖动
- 多实例隔离:一台机器跑多个同类实例时,每个实例绑定不同的核
- NUMA 机器优化:把容器绑在同一 NUMA 节点内的核上,减少跨节点内存访问
- 性能对比:绑核后测吞吐,减少核间迁移带来的测量偏差
- 故障隔离:噪声邻居出问题时,先确认两者是否共用同一批核
绑核与核对
绑核与核对
# 先看宿主有多少核 nproc
cat /proc/cpuinfo | grep -c processor
# 启动时绑定 0、1 两核
docker run -d --name rt --cpuset-cpus="0,1" worker/rt:1.2.0
# 核对配置
docker inspect -f '{{.HostConfig.CpusetCpus}}' rt
# 容器内确认可用的核集合
docker exec rt sh -c 'grep Cpus_allowed_list /proc/self/status'取值与场景
| 场景 | 取值思路 | 说明 |
|---|---|---|
| 实时敏感服务 | 独占固定的少数核 | 与噪声邻居错开,减少抢占 |
| 多实例同机部署 | 每个实例绑定不同核号 | 避免实例之间互相抢占 |
| NUMA 机器 | 绑定同一节点内的核 | 降低跨节点内存访问延迟 |
| 压测与调优 | 固定绑核后逐项测吞吐 | 排除调度波动带来的偏差 |
绑核会限制容器的可用算力上限:绑的核越少,吞吐上限越低,容量规划时要把这个上限算进去。
核编号在容器内看到的是宿主的编号,跨宿主的部署脚本不要写死核号,按环境变量注入更灵活。