pstack可直接查看指定进程所有线程的函数调用栈,无需停服或java环境,适用于c/c++、go等服务;通过top定位高cpu进程pid,再用top -h或ps筛选高耗cpu线程tid,最后用pstack结合grep或vim分析对应线程堆栈,快速识别卡点函数如epoll_wait、futex等。

直接用 pstack 查指定进程的函数堆栈,不需要停服务、不依赖 Java 环境,适合 C/C++、Go 或混合型服务。它输出的是所有线程当前的调用链,一眼就能看出哪个函数卡在 CPU 上。
第一步:快速定位高 CPU 进程
运行 top -c,按大写 P 按 CPU 使用率降序排列,记下 PID(比如 11466)。-c 能看到完整命令行,方便确认是不是目标服务。
第二步:确认是哪个线程在吃 CPU
对进程做线程级观察:
-
top -H -p 11466:只看该进程下的线程,再按 P 排序,找出 %CPU 最高的那个 TID(如 11699) - 或用静态方式:
ps -mp 11466 -o tid,pcpu,time | sort -rn | head -5,更快筛选出耗时长、CPU 高的线程
第三步:用 pstack 抓堆栈并聚焦问题线程
pstack 11466 输出全部线程栈,但信息量大。可结合 grep 快速过滤:
-
pstack 11466 | grep -A 10 "LWP 11699":匹配 Linux 线程 ID(LWP),显示该线程附近 10 行调用栈 - 若想全局浏览,直接
pstack 11466 | vim -,用 Vim 搜索/LWP 11699定位 - 常见卡点函数:如
poll、epoll_wait(I/O 等待)、sem_wait、futex(锁竞争)、vfprintf(日志刷屏)、空循环等
补充说明:为什么不用 jstack?
jstack 仅适用于 Java 进程,且要求 JVM 启动时未禁用调试接口;而 pstack 是系统级工具,只要进程在跑、符号表没被 strip,就能看到真实函数名和调用路径。遇到非 Java 服务(如 Nginx、MySQL、自研 C++ 后端),pstack 是更通用的选择。











