如何通过系统命令和JVM命令排查系统问题

321 阅读2分钟

背景

在开发过程中,往往我们都比较容易遇到一些故障需要排查,特别是线上系统,如何能够快速精准的排查出系统问题所在,这很多时候体现出的更多是一个工程师解决问题能力的一种有效方式。因此对于技术上有一定追求的你,掌握对应的问题定位和解决问题能力就显得尤为重要了;

接下来我将大致讲述如何通过命令行工具排查系统资源占用比较多的应用对应的具体线程分布;如下

操作步骤

1. 通过top命令查询出占用CPU高的进程

top

image.png

2. 通过进程号查找应用所在的位置

ps -aux|grep PID

image.png

3. 定位到具体线程或代码

ps -mp PID -o THREAD,tid,time

通过命令可以看到如下截图,比较耗CPU的线程是哪些,TID为线程号,time 是持续时长;

image.png

通过上图我们可以看到,编号为31244的线程,占用CPU 为1.4%,持续了2分1秒;

4. 将线程号转换为16进制格式,来我们看下这个线程的详细信息*;TID为需要查询的线程号

//命令模板: printf "%x\n" TID 
printf "%x\n" 31245

image.png

5. 打印线程的堆栈信息

jstack PID |grep TID -A 60 jstack 31240 |grep 7a0d -A 60

通过如上命令可以看到对应的堆栈,以及代码行;然后到自己工程查看源码分析即可

(因暂未合适场景验证,如下实例截图来源于网络)

image.png

最后,总结下排查CPU故障的方法和技巧有哪些:

  1. top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
  2. PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
  3. jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
  4. pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。