cpu亲和性是将进程绑定到指定cpu核心以减少开销的技术,taskset是最常用工具;支持启动时绑定(-c)、动态修改(-p)及systemd持久化配置(cpuaffinity),需注意numa拓扑与内核限制。

Linux 中的 CPU 亲和性(CPU affinity)是指将进程或线程绑定到特定 CPU 核心上运行的能力,taskset 是最常用、最轻量的命令行工具,用于设置或查询进程的 CPU 亲和性。合理使用 taskset 能有效减少上下文切换、缓存抖动和跨核通信开销,在高实时性、低延迟或资源隔离场景中效果显著。
理解 CPU 亲和性掩码与核心编号
CPU 亲和性通过一个位掩码(bitmask)表示,每个 bit 对应一个逻辑 CPU(即超线程后的逻辑核心)。例如:
- 单核(CPU 0):掩码为 0x1(二进制 0001)
- CPU 0 和 CPU 2:掩码为 0x5(二进制 0101)
- 四核系统(CPU 0–3)全选:掩码为 0xf(二进制 1111)
注意:Linux 的逻辑 CPU 编号由内核启动时确定,可通过 lscpu 或 cat /proc/cpuinfo | grep "processor" 查看实际拓扑。NUMA 架构下,还应优先绑定在同一 NUMA 节点内的核心,避免远端内存访问延迟。
用 taskset 启动新进程并绑定核心
最常见用法是启动时指定亲和性,语法简洁直接:
- taskset -c 0,2,4 ./my_app:绑定到物理核心 0、2、4(自动处理超线程逻辑)
- taskset -c 1-3 nginx -g "daemon off;":绑定到 CPU 1、2、3 运行 Nginx
- taskset -c 0 --all-tasks true bash:新 shell 及其所有子进程默认继承 CPU 0 绑定(需内核支持 SCHED_RESET_ON_FORK)
建议避免使用十六进制掩码(如 -c 0x5)除非明确需要位操作;-c 参数更直观、可读性强,也兼容超线程重映射。
动态修改已有进程的 CPU 亲和性
对正在运行的关键进程(如数据库、实时服务),可随时调整绑定策略:
- 查看当前绑定:taskset -p
(输出类似 pid 1234's current affinity mask: 0000000f) - 强制绑定到 CPU 3:taskset -p 3 1234
- 绑定多个核心(如 2 和 5):taskset -p 2,5 1234
注意:若进程正以 real-time 调度策略(SCHED_FIFO/SCHED_RR)运行,修改亲和性通常成功;但若目标核心被隔离(isolcpus)、离线或已被硬性独占(如 cpuset cgroup 限制),则会失败并报错 Operation not permitted。
结合 systemd 服务持久化绑定策略
生产环境中不推荐手动执行 taskset,应通过 systemd 单元文件固化配置:
- 在 service 文件的 [Service] 段添加:
CPUAffinity=0 2 4
CPUSchedulingPolicy=other(或 fifo/rr,按需) - 重启服务前 reload 配置:systemctl daemon-reload && systemctl restart myapp.service
- 验证是否生效:systemctl show myapp.service | grep CPUAffinity,再查实际进程:taskset -p $(pgrep -f "myapp")
该方式具备开机自启、依赖管理、日志集成等优势,且比 shell 封装脚本更健壮,适合容器外的传统部署场景。










