taskset 通过设置 cpu 亲和性将进程绑定到指定核心,支持启动时绑定(如 taskset -c 2 /usr/bin/myserver)、运行时重绑定(taskset -pc 0,4 pid)及 systemd 持久化(cpuaffinity=0 2 4),并可通过 taskset -p 和 ps -o pid,psr,comm 验证绑定效果。

Linux 中用 taskset 把服务固定在特定 CPU 上,核心是控制进程的 CPU 亲和性——即告诉内核“只许在这个(或这几个)核心上跑”。它不改变服务本身,而是调度层面的约束。实际操作分两类:临时绑定(适合调试/启动即定)和持久化绑定(适合长期运行的服务),下面直接说怎么用。
启动服务时就绑定到指定 CPU
这是最常用、最稳妥的方式,尤其适用于 systemd 管理前的手动测试或脚本启动场景:
- 绑定单个核心(比如 CPU 2):
taskset -c 2 /usr/bin/myserver - 绑定多个核心(比如 CPU 0 和 CPU 3):
taskset -c 0,3 /usr/bin/myserver - 用十六进制掩码(如只允许 CPU 1 和 CPU 2):
taskset 0x6 /usr/bin/myserver(因为0x6 = 0110₂,对应 bit1 和 bit2) - 对多线程程序更彻底:加
-a参数,让所有线程都受约束,例如taskset -ac 1,2 /usr/bin/myserver
运行中的服务动态重绑定
服务已启动但没提前绑定?可以用 taskset -p 修改正在运行的进程(需 root 权限或进程属主权限):
- 查当前绑定情况:
taskset -p PID(输出类似pid 1234's current affinity mask: 0xff) - 改成只在 CPU 0 和 CPU 4 上运行:
taskset -pc 0,4 1234 - 等价的掩码写法:
taskset -p 0x11 1234(0x11 = 00010001₂,对应 CPU 0 和 CPU 4) - 注意:若进程正执行长时间内核操作(如大块 I/O 或锁等待),命令可能暂时失败,稍后重试即可
让服务开机自动绑定(systemd 持久化)
靠命令行启动只能管一次,真正要长期稳定,得写进 systemd 单元文件:
- 编辑服务配置,如
/etc/systemd/system/myapp.service - 在
[Service]段落里添加一行:CPUAffinity=0 2 4(空格分隔,不能用逗号;支持范围写法如0-3) - 如果想允许多组核心(比如“CPU 0–1 或 CPU 4–5”),可写两行:
CPUAffinity=0 1和CPUAffinity=4 5,systemd 会做逻辑 OR 合并 - 保存后执行:
sudo systemctl daemon-reload && sudo systemctl restart myapp
验证是否真绑住了
光设不验等于白设。两个关键检查点:
- 看亲和掩码是否生效:
taskset -p PID输出应与你设置的一致 - 看实时运行在哪颗核:
ps -o pid,psr,comm -p PID中的psr列显示当前所在 CPU 编号(注意:它只反映“此刻在哪”,不是“允许在哪”;结合前者才完整) - 持续观察:
top -p PID按1键可显示各核负载,确认目标 CPU 有明显占用,其他核无波动











