线上故障主要会包括 CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。
同时例如 jstack、jmap 等工具也是不囿于一个方面的问题的,基本上出问题就是 df、free、top 三连,然后依次 jstack、jmap 伺候,具体问题具体分析即可。
1,CPU一般来讲我们首先会排查 CPU 方面的问题。CPU 异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁 gc 以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用 jstack 来分析对应的堆栈情况。
使用 jstack 分析 CPU 问题
我们先用 ps 命令找到对应进程的 pid(如果你有好几个目标进程,可以先用 top 看一下哪个占用比较高)。
接着用top -H -p pid来找到 CPU 使用率比较高的一些线程
其中-p
表示查找指定进程的信息,-H
表示线程模式。
然后将占用最高的 pid 转换为 16 进制printf '%x\n' pid得到 nid,
printf '%x\n' pid
或:
printf 0x%x pid
接着直接在 jstack 中找到相应的堆栈信息jstack pid |grep 'nid' -C5 –color
jstack -l 11 |grep 0x255777
可以看到我们已经找到了 nid 为 0x42 的堆栈信息,接着只要仔细分析一番即可。
当然更常见的是我们对整个 jstack 文件进行分析,通常我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用说了。我们可以使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c来对 jstack 的状态有一个整体的把握,如果 WAITING 之类的特别多,那么多半是有问题啦。
命令总结:
1,free -h
2,ps -aux | sort -k4nr | head -n 10
3,top -Hp pid
4.记录首个pid,转化成16进制后的数字,可通过计算器(calc)或 printf %x 26461 675D
5, 导出
jstack -l pid > pid.log
或使用jmap生成hprof文件
./jmap -dump:live,format=b,file=/u01/pid.hprof pid
使用jprofiler分析原因