孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结


孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结fredalxin|
线上故障主要会包括 cpu、磁盘、内存以及 网络 问题 , 而大多数故障可能会包含不止一个层面的问题 , 所以进行排查时候尽量四个方面依次排查一遍 。 同时例如 jstack 、jmap 等工具也是不囿于一个方面的问题的 , 基本上出问题就是 df、free、top 三连 , 然后依次 jstack、jmap 伺候 , 具体问题具体分析即可 。
CPU一般来讲我们首先会排查cpu方面的问题 。cpu异常往往还是比较好定位的 。 原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多 。 而最常见的往往是业务逻辑(或者框架逻辑)导致的 , 可以使用jstack来分析对应的堆栈情况 。
使用jstack分析cpu问题我们先用ps命令找到对应进程的 pid(如果你有好几个目标进程 , 可以先用top看一下哪个占用比较高) 。 接着用top -H -p pid来找到cpu使用率比较高的一些线程
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结然后将占用最高的pid转换为16进制printf '%x\n' pid得到nid
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结接着直接在jstack中找到相应的堆栈信息jstack pid |grep 'nid' -C5 –color
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结可以看到我们已经找到了nid为0x42的堆栈信息 , 接着只要仔细分析一番即可 。
当然更常见的是我们对整个jstack文件进行分析 , 通常我们会比较关注WAITING和TIMED_WAITING的部分 , BLOCKED就不用说了 。 我们可以使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c来对jstack的状态有一个整体的把握 , 如果WAITING 之类的特别多 , 那么多半是有问题啦 。
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结频繁gc当然我们还是会使用jstack来分析问题 , 但有时候我们可以先确定下gc是不是太频繁 , 使用jstat -gc pid 1000命令来对gc分代变化情况进行观察 , 1000表示采样间隔(ms) , S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU分别代表两个Survivor区、Eden区、老年代、元数据区的容量和使用量 。 YGC/YGT、FGC/FGCT、GCT则代表YoungGc、FullGc的耗时和次数以及总耗时 。 如果看到gc比较频繁 , 再针对gc方面做进一步分析 。
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结上下文切换针对频繁上下文问题 , 我们可以使用vmstat命令来进行查看
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结cs(context switch)一列则代表了上下文切换的次数 。 如果我们希望对特定的pid进行监控那么可以使用 pidstat -w pid命令 , cswch和nvcswch表示自愿及非自愿切换 。
孤独酒馆|6000+字,30+张图。JAVA线上故障排查全套路总结磁盘磁盘问题和cpu一样是属于比较基础的 。 首先是磁盘空间方面 , 我们直接使用df -hl来查看文件系统状态


推荐阅读