CPU 亲和性绑定
taskset 用掩码或 -c 列表把进程限制在指定 CPU 上运行,减少跨核迁移与缓存失效。常用形式是 taskset -pc <pid> 查看亲和性、taskset -c 0-3 <命令> 指定核启动进程、taskset -pc 0-1 <pid> 修改运行中进程。systemd 服务可以用 CPUAffinity= 固化设置。绑核不是越窄越好:过窄会放大热点,过宽等于没绑。NUMA 机器上跨节点绑核会抬高内存访问延迟,应先看 numactl -H 的拓扑。
基本信息
| 查看 | taskset -pc <pid> |
|---|---|
| 绑定启动 | taskset -c 0-3 <命令> |
| 改运行中进程 | taskset -pc 0-1 <pid> |
| 持久化 | systemd 的 CPUAffinity=0-3 |
| 底层接口 | sched_setaffinity(2) |
典型使用场景
- 减少跨核迁移带来的缓存失效
- 把关键服务固定在指定核上运行
- 配合 isolcpus 做核心隔离后的显式绑定
- 排查线程在核间反复迁移造成的抖动
- 与 NUMA 节点绑定组合规划
常用操作
常用操作
taskset -pc 12345 # 查看进程当前亲和性
taskset -c 2,3 ./service # 绑定到 2、3 号核启动
taskset -pc 0-1 12345 # 修改运行中进程的亲和性
taskset -c 4 chrt -f 50 ./rt-task # 与实时策略组合使用
systemctl set-property myservice.service CPUAffinity=0-3
lscpu | grep -E 'NUMA|CPU\(s\)'
numactl -H | head -20 # 绑核前先确认节点拓扑用法读法
| 用法 | 含义 | 注意 |
|---|---|---|
| -c 列表 | 以核列表形式指定 | 支持 0-3 与 2,3 混合写法 |
| -p PID | 作用于已运行进程 | 不带 -c 时后面跟的是掩码 |
| 掩码形式 | 十六进制位图 | 核数多时手算掩码容易出错 |
| systemd CPUAffinity | 服务级固化设置 | 比重启后失效的运行时设置可靠 |
绑核不是越窄越好:过窄会让热点集中、并行度不足,过宽等同于没有绑定。
NUMA 机器上跨节点绑核会抬高内存延迟,绑核范围应与节点划分保持一致。
验证与回退
- 用 taskset -pc 或 ps -eo pid,psr 确认进程实际运行在哪些核
- 观察核间占用是否符合预期,避免全部挤在少数核上
- 回退只需重新设置更大的核集合,不必重启进程
- 服务化场景把绑核写进单元文件,避免重启后设置丢失
绑核后应用新建的工作线程会继承该亲和性,但由其他组件拉起的进程需要单独设置,否则整体看起来像没生效。