直接用taskset -p PID查看掩码,转二进制后从右往左对应CPU 0、1……,如0x69=1011001,表示可在CPU 0、3、5、6运行;掩码仅限制允许范围,需ps -o pid,psr,comm -p PID观察实际运行核并watch验证稳定性。

直接用 taskset -p PID 查出掩码,转成二进制后从右往左数位——bit 0 对应 CPU 0,bit 1 对应 CPU 1,以此类推。这是用掩码精准控制跨核调度最底层、也最可靠的起点。
看懂十六进制掩码对应哪些核心
输出类似 pid 1234's current affinity mask: 0x69,先转二进制:0x69 = 1011001(7 位),补足前导零对齐逻辑 CPU 总数(比如 8 核系统就写成 01011001)。从右往左标位:
- 第 0 位(最右)= 1 → 允许在 CPU 0 运行
- 第 3 位 = 1 → 允许在 CPU 3 运行
- 第 5 位 = 1 → 允许在 CPU 5 运行
- 第 6 位 = 1 → 允许在 CPU 6 运行
所以 0x69 表示该进程可在 CPU 0、3、5、6 上运行——不是连续范围,而是离散核心的显式授权。
用掩码设置亲和性要避开常见误写
设置时必须用十六进制或十进制整数,不能写二进制字符串(如 1011001 会报错):
- ✅ 正确:
sudo taskset -p 0x69 1234或sudo taskset -p 105 1234(105 是 0x69 的十进制) - ❌ 错误:
taskset -p 1011001 1234(会被当十进制 1011001,远超实际核心数) - ⚠️ 注意:掩码值不能超出系统支持的最大逻辑 CPU 数。例如 64 位系统最大掩码是 0xFFFFFFFFFFFFFFFF;若只用 8 核,高位全 0 即可,但写 0x100 就非法(bit 8 被置 1,而 CPU 8 可能不存在)
掩码设完不等于调度立刻稳定
掩码只是“允许在哪跑”,不是“此刻在哪跑”。真实位置得靠 ps 实时观察:
- 运行
ps -o pid,psr,comm -p 1234,看psr列显示的当前逻辑 CPU 编号 - 如果
psr在你设定的掩码范围内频繁跳变(比如掩码是 0x03/CPU 0–1,但 psr 在 0 和 1 之间秒级切换),说明内核仍在做负载均衡——这本身是正常行为 - 若希望真正“钉住”某核(如避免 L3 缓存抖动),需配合更窄掩码(如 0x01)+ 持续监控:
watch -n0.5 'ps -o pid,psr,comm -p 1234'
多线程进程下掩码只作用于主线程
默认 taskset -p 只修改线程组 leader(即主线程)的亲和性,子线程仍按默认策略调度:
- 查所有线程:
ps -T -p 1234或top -H -p 1234 - 为全部线程统一设掩码,加
-a参数:sudo taskset -ap 0x01 1234 - 否则可能出现:主线程绑在 CPU 0,但某个 GC 线程在 CPU 5 上抢资源,导致预期外的跨核延迟


















