taskset -p PID显示十六进制CPU亲和性掩码(如0x3f),表示允许运行的CPU范围,需转二进制从右往左对应CPU编号;taskset -cp PID直接显示可读核心列表;ps -o pid,psr,comm -p PID中的psr列显示进程最后一次执行的实际CPU编号。

taskset -p PID 显示的是掩码,不是实际运行核
执行 taskset -p 输出的是十六进制亲和性掩码(如 0x3f),它只表示“允许运行在哪些 CPU 上”,不反映当前调度位置。这个掩码需转二进制后从右往左数:最低位 bit 0 对应 CPU 0,bit 1 对应 CPU 1,依此类推。
-
0x1→ 只能跑在 CPU 0 -
0x5(二进制0101)→ 允许 CPU 0 和 CPU 2 -
0xff→ 允许前 8 个逻辑 CPU(0–7)
普通用户只能查自己启动的进程;查 systemd、kthreadd 等系统进程需 root 权限。
taskset -cp PID 直接看可读核心列表
加 -c 参数跳过换算:taskset -cp 输出类似 pid 1234's current affinity list: 0-3,6,8-10,直观列出允许范围。支持步长写法(如 0-6:2 表示 CPU 0、2、4、6),但极少用。
注意:输出中若显示 0-11,说明未显式绑定,内核可自由调度到任意逻辑 CPU —— 这是默认行为,不是错误。
ps -o pid,psr,comm -p PID 查当前真实落点
psr 列才是关键:它显示该进程**最后一次被调度执行的逻辑 CPU 编号**(从 0 开始)。例如:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
PID PSR COMMAND 1234 5 nginx: worker process
这表示此刻它刚在 CPU 5 上运行完一个时间片。多线程程序必须对每个线程 TID 单独查,因为线程才是调度单位 —— 主进程 PID 的 psr 值只代表主线程。
- 若
psr频繁变动,而taskset -cp显示宽范围(如0-7),说明内核正在负载均衡 - 若
psr长期固定在非绑定范围内(如绑了0-2却总显示 5),说明绑定失败或被代码内调用的pthread_setaffinity_np()覆盖
top -H -p PID + 按 f 选 P 列持续观察
对运行中的进程做动态验证:top -H -p 进入后按 f,用方向键找到 P(Last Used CPU),空格启用,再按 把它移到前列。这样每秒刷新一次,能直观看到各线程在哪些核上跳变。
虚拟机里看到的 P 值是 vCPU 编号,不是宿主机物理核编号;若发现所有线程都挤在同一个核上,先确认是否漏加 -a 参数(taskset -cap 才作用于全部线程)。
真正容易被忽略的点是:亲和性设置生效 ≠ 立即迁移。进程可能还在原核上跑完当前时间片,watch 几秒 psr 才算验证到位。










