相信大家都会碰到这样的问题,突然某一天服务器CPU直接拉满,导致服务响应超时或者服务宕机,碰到这种问题,掌握排查方法是解决问题的关键,下面列举一下这个问题的排查方法。
1.使用top命令查看对应的程序进程
2.使用 top -H -p 进程号 查找对应CPU较高的线程
top -H -p 进程号
3.由于我们是Java程序,Java的 jstack 命令 需要提供16进制的线程Id(查出来的线程号是十进制的),使用下面的命令获取线程号的16进制数
printf '0x%x\n' 线程号
结果:0x520
4.拿到线程号的十六进制数后,使用 jstack 来分析Java进程的线程堆栈信息,命令如下:
jstack 进程号 | grep 十六进制的线程数 -A 显示的行数
例如:
jstack 1312 | grep 0x520 -A 30
命令会生成进程ID为 1312 的Java进程的线程堆栈跟踪信息,并搜索其中的 30 行,然后将这些信息打印到屏幕上,便于去分析是哪几行代码造成的CPU过高。