pidstat -t 可直接监控线程粒度,无需重启进程或应用探针;通过 -p pid -t -u/-r/-d 参数组合采样,结合 tid 与 %cpu、nvcswch/s、majflt/s 等指标定位热点线程,并用 jstack 或 /proc//task//stack 关联调用栈。

pidstat 能直接监控到线程粒度,是定位高负载线程最轻量、最可靠的命令之一。它不依赖应用层探针,也不需要重启进程,只要进程在运行,就能实时看到每个线程的资源消耗。
确认目标进程 PID
诊断前先获取进程 ID,常用方式有:
- 按命令名模糊查找:
ps -ef | grep java或pgrep -f "app.jar" - 按用户筛选:
pgrep -u www-data - 结合端口反查:
lsof -i :8080 | grep LISTEN再看对应 PID
用 -t 参数开启线程级监控
默认 pidstat 只显示进程汇总,加 -t 才会展开线程(LWP,Light Weight Process):
- 查看某 Java 进程所有线程的 CPU 占用:
pidstat -p 12345 -t 1 5(每秒采样,共 5 次) - 同时看 CPU + 内存 + I/O 线程行为:
pidstat -p 12345 -t -u -r -d 2 - 输出中 TID 列即线程 ID,%CPU 值高的那一行就是热点线程
识别异常线程的关键指标
重点关注三类信号:
- CPU 高占比:某个线程 %CPU 持续 >80%,尤其 %usr 高而 %system 低,大概率是纯计算逻辑或死循环
-
频繁上下文切换:用
pidstat -p 12345 -wt 1,若 nvcswch/s(非自愿切换)突增,说明线程被反复抢占,CPU 成瓶颈 -
内存缺页异常:
pidstat -p 12345 -rt 1中 majflt/s > 0,表示线程频繁访问未驻留物理内存的页,可能触发大量磁盘换入
关联堆栈定位代码位置
找到可疑 TID 后,需映射到具体线程名和调用栈:
- 将十六进制 TID(如
0x7f8a)转为十进制:printf "%d\n" 0x7f8a→ 得到 32650 - 用 jstack 导出 Java 进程线程快照:
jstack -l 12345 | grep -A 10 "nid=0x7f8a" - 非 Java 进程可用
cat /proc/12345/task/32650/stack查内核态调用链











