taskset
命令:CPU 核绑定使用方法
taskset
是 Linux 系统中用于 设置或查询进程的 CPU 亲和性(CPU Affinity) 的工具,可以将进程绑定到指定的 CPU 核心上运行,避免进程在不同核心之间切换,提高缓存命中率和性能。
1. 基本语法
taskset [options] <mask> <command> # 启动新进程并绑定 CPU
taskset [options] -p <mask> <PID> # 修改已运行进程的 CPU 绑定
常用选项
选项 | 说明 |
---|---|
-p , --pid | 操作已存在的进程(需指定 PID) |
-c , --cpu-list | 使用 CPU 编号列表(如 0,2,4 )代替掩码 |
-a , --all-tasks | 绑定进程的所有线程 |
2. 使用方法
(1)启动新进程并绑定 CPU
语法:
taskset -c <CPU列表> <命令>
示例:
taskset -c 0,1 stress -c 2 # 将 stress 进程绑定到 CPU 0 和 1
(2)修改已运行进程的 CPU 绑定
语法:
taskset -pc <CPU列表> <PID>
示例:
taskset -pc 2,3 1234 # 将 PID=1234 的进程绑定到 CPU 2 和 3
(3)查看进程当前的 CPU 绑定
语法:
taskset -p <PID>
示例:
taskset -p 1234
输出示例:
pid 1234's current affinity mask: 3 # 二进制 11(表示绑定到 CPU 0 和 1)
3. CPU 掩码(Mask)与 CPU 列表
(1)CPU 掩码(十六进制/二进制)
0x1
=0001
(绑定到 CPU 0)0x3
=0011
(绑定到 CPU 0 和 1)0xF
=1111
(绑定到 CPU 0、1、2、3)
示例:
taskset 0x1 sleep 60 # 绑定到 CPU 0
(2)CPU 列表(更直观)
0
→ 仅 CPU 00,2
→ CPU 0 和 21-3
→ CPU 1、2、3
示例:
taskset -c 1-3 stress -c 3 # 绑定到 CPU 1、2、3
4. 绑定所有线程(多线程进程)
如果进程是多线程的(如 Nginx、Java),可以使用 -a
绑定所有线程:
taskset -ac 0,1 <PID> # 将 PID 的所有线程绑定到 CPU 0 和 1
5. 典型使用场景
(1)高性能计算(HPC)
taskset -c 2,3 ./compute_job # 绑定到 CPU 2 和 3
(2)数据库优化(MySQL)
taskset -c 4-7 mysqld # 将 MySQL 绑定到 CPU 4-7
(3)实时任务(低延迟)
taskset -c 0 irqbalance # 将中断处理绑定到 CPU 0
6. 注意事项
-
taskset
不影响进程的子进程- 如果父进程被绑定到 CPU 0,子进程默认继承该绑定,但可以手动修改。
-
isolcpus
内核参数优先级更高- 如果某些 CPU 被
isolcpus
隔离,taskset
无法将普通进程绑定到这些核心。
- 如果某些 CPU 被
-
cgroups
更强大- 如果需要更精细的控制(如限制 CPU 使用率),建议使用
cgroups
(cset
或systemd
)。
- 如果需要更精细的控制(如限制 CPU 使用率),建议使用
7. 结合 numactl
优化 NUMA 架构
如果服务器是 NUMA 架构(多 CPU 插槽),建议配合 numactl
使用:
numactl --cpunodebind=0 --physcpubind=0-3 <command> # 绑定到 NUMA 节点 0 的 CPU 0-3
总结
场景 | 推荐命令 |
---|---|
启动新进程并绑定 CPU | taskset -c 0,1 <command> |
修改已运行进程的绑定 | taskset -pc 2,3 <PID> |
绑定所有线程 | taskset -ac 0,1 <PID> |
查看当前绑定 | taskset -p <PID> |
NUMA 优化 | numactl --physcpubind=0-3 <command> |
适用场景:
- 高性能计算(HPC)
- 数据库优化(MySQL/PostgreSQL)
- 实时任务(DPDK/低延迟应用)
通过合理使用 taskset
,可以显著提高 CPU 缓存命中率,减少进程切换开销,优化系统性能。