线上应用故障排查

CPU 100% 处理流程

当我们遇到 CPU 使用率过高的情况时(这里只考虑 Linux/Solaris 系统)
首先想到了 top 指令

> top

先看看哪个进程使用的cpu 比较高, 当然这里只讲 JVM 使用 CPU 过高的情况;

图片
这里的图片只是示例用,不存在cpu 使用率过高的问题

在查询到 vmid 后,查询虚拟机进程中哪个线程使用的 cpu 比较高

> ps -mp pid -o THREAD,tid,time

确定了使用 cpu 过高的虚拟机线程 id 后,记录下 threadId

然后再使用 jstack 记录当前虚拟机线程信息快照

$ jstack -l vmid > outofcpu.threaddump

这里已经获得了 threadId 和 当前的虚拟机线程信息快照信息

我们可以考虑重启一下 tomcat 或者直接重启 JVM

对于保存的 threadId 和 outofcpu.threaddump
在 threaddump 文件中查看 threadId 线程信息定位代码问题,达到修复目的


内存使用过高处理流程

当我们遇到 内存 使用率过高的情况时(这里只考虑 Linux/Solaris 系统)

首先想到了还是 top 指令

图片

我们看到这里的tomcat 占用内存大到了 60% 多, 记录下 vmid

下面我们尝试查看这个进程中具体线程的内存使用情况
图片
这里可以看出

ps 指令无法查询进程中具体线程的内存适用情况



不过我们还有 java 提供的工具 jmap

> sudo jmap -F -histo 12788 > test.dump

这里使用 jmap -histo 指令去 统计 JVM 堆中的对象信息

> sudo jmap -F -dump:format=b,file=test.all.dump 12788

这里使用 jmap -dump 指令去生成JVM 堆存储快照, 后面在用 jhat visualvm 等工具进行分析

在分析之前,我们可以考虑一下是否需要重启服务


这里在介绍一下 ps 的具体使用
图片

-m: 显示当前 process id 进程下的线程的信息
-o: 用户自定义显示列