Linux 服务器 CPU 负载过高的定位分析

前言

本文将以 Java 应用程序为例子,介绍如何在 Linux 服务器上,快速定位分析 CPU 负载(占用率)过高的问题,即通过多个命令精确定位到存在问题的 Java 代码。

第一步

使用 top 命令找出 CPU 占用率最高的进程,记录下进程 ID

1
top
  • top 命令的输出结果:

第二步

使用 ps 命令进一步找出 CPU 占用率最高的线程,记录下线程 ID

1
2
# 列出进程 6113 的所有线程,并显示线程 ID 和线程已使用的 CPU 时间
ps -T -p 6113 -o THREAD,tid,time
  • ps 命令的参数解释:
1
2
3
-T:显示所有的线程
-p:进程 ID
-o:用户自定义的输出格式
  • ps 命令的输出结果:

第三步

将找到的线程 ID 转换为十六进制格式(英文小写),比如 17e2

1
printf "%x\n" 6114

第四步

使用 jstack 命令进一步精确定位到错误代码

1
jstack 6113 | grep 17e2 -A 60
  • jstack 命令的参数解释:
1
jstack 进程ID | grep 线程ID(十六进制格式) -A 输出行数
  • jstack 命令的输出结果: