taskset 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,
taskset属于性能观测与调试族,用于 CPU 亲和性(绑核)。NUMA 相关绑定另见 numactl(深度文)。
CPU 亲和性决定一个线程允许被调度到哪些核。默认线程可在所有核间迁移;迁移会丢失 L1/L2 缓存热度。把计算密集、延迟敏感的线程固定到指定核可减少抖动。
一、查看与设置
taskset -p 1234 # 查看 PID 1234 的亲和性掩码(十六进制)
taskset -cp 1234 # 用核列表显示(如 0-7),更直观
taskset -c 0 ./worker # 启动时绑定到 0 号核
taskset -c 0,2,4 ./worker # 绑定到 0/2/4 核
taskset -c 0-7 ./worker # 绑定到 0~7 核
taskset -cp 0,1 1234 # 对已运行进程改绑(瞬时生效,不重启)掩码 vs 核列表:不带
-c用的是十六进制位掩码,最低位代表 CPU0——0x5= 二进制 101 = CPU0+CPU2。日常用-c 0,2核列表不易错。
二、绑线程而不只是进程
多线程进程里每个线程有独立亲和性。要绑某个线程用其 TID(/proc/<pid>/task/<tid>):
ps -T -p 1234 # 列出该进程所有线程 TID
taskset -cp <TID> # 查看/绑定单线程绑定主进程后,后续新建线程默认继承该掩码;已存在的线程需逐个绑定。
三、与 numactl、cgroup 的关系
taskset只约束"哪些 CPU 核";numactl --cpunodebind同时约束 CPU 与本地内存分配节点,跨 NUMA 绑定时应优先 numactl(见 numactl 深度、NUMA FAQ)。只绑核不控内存,仍可能远端访存。- 绑定不能超出 cgroup cpuset 给容器/服务划定的核:容器里
taskset -c 0-31但 cpuset 只给了 8-15,则实际只在交集内生效。 - systemd 服务可用
CPUAffinity=声明,等价且更规范。
四、什么时候绑、什么时候别绑
适合:低延迟交易、DPDK/轮询型、压测隔离、要保护缓存热度的固定计算线程。
不要盲目绑:通用服务绑死会让负载不均、无法利用空闲核,还可能和别的已绑核服务撞车。多数情况交给内核调度 + 正确的 cgroup 配额即可;先确认确有迁移抖动(perf sched/mpstat -P ALL)再绑。绑后务必验证各核利用是否均衡。
相关命令
优先级/调度策略用 chrt(深度),nice 值用 renice,每核负载用
mpstat -P ALL(见 mpstat),NUMA 用 numactl/numastat。
总结
taskset = 查看/设置进程或线程的 CPU 亲和性:-cp 看核列表、-c 0,2 或 0-7 绑核(不加 -c 是十六进制掩码,最低位为 CPU0),多线程要按 TID 绑且新线程继承掩码;跨 NUMA 应改用 numactl 同时绑内存节点,绑定受 cgroup cpuset 限制且不超交集——它能减少迁移与缓存冷热、压测隔离有效,但通用服务盲目绑核会负载不均,应先证实调度抖动再用。