taskset 绑定 CPU
taskset 属于 util-linux,用来设置或查看进程的 CPU 亲和性,也就是允许它跑在哪几个核上。它的价值在于把互相干扰的任务分开:把计算密集任务固定到指定核,避免它到处抢占;或者把某个进程限制在一颗核上,观察单核条件下的真实性能。它只控制「能在哪些核上运行」,不改变优先级。
基本信息
| 适用平台 | Linux(util-linux),容器内可用范围受资源限制约束 |
|---|---|
| 语法 | taskset -c 核列表 命令;taskset -pc 核列表 进程号 |
| 编号规则 | CPU 编号从 0 开始,可用区间与枚举写法 |
| 查看方式 | 不给命令只给进程号即打印当前亲和性 |
典型使用场景
- 把性能测试任务固定在指定核上,减少核间迁移带来的波动
- 让多个批处理任务分核运行,避免互相抢占同一颗核
- 排查某进程是否被限制在少数核上导致吞吐不足
- 验证单线程程序在单核条件下的最大能力
- 配合中断与队列设置,把特定负载隔离到独立核
常用示例
常用示例
taskset -c 0-3 ./bench.sh # 只允许使用 0 到 3 号核
taskset -c 0,2 ./worker # 允许使用 0 号与 2 号核
taskset -pc 2 1234 # 把已在运行的进程钉到 2 号核
taskset -p 1234 # 查看该进程当前的亲和性掩码
taskset -c 0-3 ./bench.sh > out.log 2>&1 & # 后台运行并保留输出
nproc; lscpu | grep On-line # 先确认可用核数与在线核范围核列表写法
| 写法 | 含义 | 说明 |
|---|---|---|
| 0 | 只使用 0 号核 | 单核绑定时最直观 |
| 0-3 | 使用 0 到 3 号核 | 区间写法,闭区间 |
| 0,2 | 使用 0 号与 2 号核 | 枚举写法,适合跨 NUMA 的场景 |
| 0x3 | 掩码形式,等价于 0 与 1 号核 | 老脚本里常见,可读性差 |
| 查看模式 | 输出十六进制掩码与进程号 | 掩码需换算才能对应到核编号 |
绑定不是加速手段:单线程任务被钉在单核上反而可能因为邻居任务干扰而变慢,先做对照测试再决定策略。
使用与验证
- 绑定前后各跑一次基准测试,用数据确认有效果
- 结合进度与负载观察进程是否真的只落在指定核上
- 容器内先确认可用的核范围,再按容器视角编号绑定
- 绑定只是限制范围,不能阻止其他进程抢占同一颗核
- 需要同时控制内存本地性时,考虑更完整的 NUMA 绑定方案
亲和性会被子进程继承:给一个脚本绑定后,它启动的所有任务都会在同样的核集合内运行,评估影响面时要考虑这一点。