要用 pidstat 监控线程级 CPU 和内存开销,必须组合使用 -t(线程视图)与 -u(CPU)、-r(内存)选项并指定目标进程;不加 -t 仅显示进程汇总数据,加后输出含 TID 列和线程名;常用命令如 pidstat -t -u -p 1234 1 实时查看线程 CPU,pidstat -t -u -r -p 1234 2 5 同时采集 CPU 与内存明细;关键指标包括 %usr(用户态占比)、%system(内核态占比)、RSS(常驻内存)、majflt/s(主缺页次数);高耗线程定位后,可将 TID 转十六进制,用 jstack 或 pstack 查看调用栈;注意普通用户需 sudo 才能监控其他用户进程,且 -t 必须与 -p 同用才生效。

要用 pidstat 监控线程级(TID)的 CPU 和内存开销,关键在于组合使用 -t(线程视图)与 -u(CPU)、-r(内存)选项,并明确指定目标进程。
启用线程级统计必须加 -t 参数
默认 pidstat 只显示进程(PID)汇总数据。不加 -t,即使监控 Java 或多线程服务,你也看不到各线程的独立占用。加上后,输出中会多出 TID 列,且 Command 列会显示线程名(如 “java” 后跟 “–nioEventLoopGroup” 等)。
-
只看某进程的所有线程 CPU 使用:
pidstat -t -u -p 1234 1
每秒刷新一次,列出该进程下每个线程的 %usr、%system、%CPU 等 -
同时看 CPU + 内存的线程明细:
pidstat -t -u -r -p 1234 2 5
每 2 秒采样,共 5 次,输出包含 TID、%CPU、RSS、minflt/s、majflt/s 等列
识别高开销线程的关键指标
线程级输出里,重点关注以下几列:
- %usr:线程在用户态执行的时间占比。Java 应用中某个线程持续 >80%,大概率是计算密集型逻辑或死循环
- %system:内核态时间高(比如 >30%),可能频繁调用 read/write、epoll_wait、futex 等系统调用,暗示锁争用或 I/O 阻塞
- RSS(常驻内存 KB):同一进程下某些线程 RSS 显著更高,可能是缓存独占或对象未释放
- majflt/s(主缺页次数):非零值说明该线程正频繁从磁盘加载页面,结合内存不足或 mmap 大文件场景需警惕
配合其他命令快速定位问题线程
pidstat 给出高耗线程的 TID 后,可直接转成十六进制,用 jstack 或 pstack 查栈:
- 假设 pidstat 输出中某行 TID=29456,则:
printf "%x\n" 29456→ 得到7310 - 再执行:
jstack 1234 | grep -A 10 "nid=0x7310"
即可看到该线程正在执行哪段 Java 代码 - 对 C/C++ 进程,可用:
sudo pstack 1234 | grep -A 10 "Thread 29456"
注意事项
普通用户只能看到自己启动的进程及其线程;监控其他用户进程(如 root 下的服务)需用 sudo 执行 pidstat。另外,-t 必须与 -p 同时使用才有效——单独运行 pidstat -t 不会自动展开所有线程,也不会报错,但输出仍是进程级汇总。


















