要查看多线程web服务各线程实际运行的cpu核心,需结合亲和性设置与实时调度状态:先用ps -t -p或/proc/[pid]/task/获取所有线程tid,再用taskset -pc查允许运行的核心范围,最后通过ps -elf的psr列或top -h的p字段确认当前实际运行的核心。

要查看正在运行的多线程 Web 服务(如 Nginx、Apache 或基于 Node.js/Java 的服务)各线程实际运行在哪些 CPU 核心上,不能只对主进程 PID 执行 taskset -pc——因为那仅显示**主线程的亲和性设置**,而非每个线程当前调度所在的物理核心。真正的核心分配需结合线程级调度状态与亲和性策略一起分析。
确认 Web 服务的主进程和所有线程 PID
多线程服务通常由一个主进程派生多个工作线程(LWP),每个线程可被独立调度:
- 用
ps -T -p $(pgrep -f "nginx|httpd|java.*spring|node.*app")查看完整线程列表,输出含 LWP(线程 ID)和 SPID(即 TID)列 - 或用
pidof nginx/pgrep -f "tomcat"获取主 PID 后,再进/proc/[PID]/task/目录遍历子线程:ls /proc/1234/task/ | xargs -n1 -I{} sh -c 'echo -n "TID {} → "; taskset -c -p {} 2>/dev/null || echo "N/A"'
用 taskset -pc 查看每个线程的 CPU 亲和性掩码
taskset -pc [TID] 显示该线程**允许运行的 CPU 列表**(即亲和性设置),不是当前正在跑的核心——但它决定了调度器能把它放到哪儿:
- 例如:
taskset -pc 5678输出pid 5678's current affinity list: 0-3,表示该线程只能在 CPU 0~3 间调度 - 若输出
0,2,4,说明它被显式绑定了三个离散核心,常用于隔离关键工作线程 - 若未设置亲和性(默认),通常显示全核范围,如
0-7(8 核机器),意味着内核可自由迁移
用 ps 或 top 实时观察线程实际运行的核心
亲和性是“许可范围”,而 PSR(Processor)字段反映线程**此刻正在哪个核心执行**:
- 运行
ps -eLF | grep [your-web-pid],关注 PSR 列数值(0 起始),它就是当前调度到的 CPU 编号 - 或启动
top -H -p [PID],按f→ 选中 P(Last used CPU)→q返回,即可看到每行线程对应的实时 CPU 核心号 - 注意:PSR 值会随调度动态变化;若线程被绑定了亲和性(如只允许 CPU 2),则 PSR 永远只会是 2 或保持不变(除非绑定失效)
区分亲和性设置与实际负载分布
即使所有线程都允许跑在 0-7,也不代表负载均匀——可能因锁竞争、IO 阻塞或调度抖动导致某些核心持续高占,而其他空闲:
- 用
mpstat -P ALL 1观察每核的 %usr/%sys,比对线程 PSR 分布是否匹配 - 若发现某核心长期 95%+,但其上只有 1–2 个线程在跑,可能是这些线程本身计算密集或存在自旋等待
- 此时可配合
perf top -p [TID]定位热点函数,再决定是否用taskset -pc 3,5 [TID]将其迁移到低负载核心











