前言
到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题。
还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不过还好是不同的环境互相没有影响。
定位问题
拿到问题后首先去服务器上看了看,发现运行的只有我们的 Java 应用。于是先用 ps
命令拿到了应用的 PID
。
接着使用 top -Hp pid
将这个进程的线程显示出来。输入大写的 P 可以将线程按照 CPU 使用比例排序,于是得到以下结果。
果然某些线程的 CPU 使用率非常高。
为了方便定位问题我立马使用 jstack pid > pid.log
将线程栈 dump
到日志文件中。
我在上面 100% 的线程中随机选了一个 pid=194283
转换为 16 进制(2f6eb)后在线程快照中查询:
因为线程快照中线程 I