前言:我们的场景并没有像BAT等大型互联网公司里的系统那么复杂,但是基本上也有一定的规模,暂且就认为我们是一个中型互联网系统。但是工具和思路都是差不多的,因为原理是一样的。同时下面提到的命令,具体详细的用法,我想google上已经有足够多的资源了,这里只说思路与方向。
首先我们分析一下服务器构造和操作系统,服务器我们可以简单的分解为CPU、内存、硬盘(其他部件的我们就不考虑了),操作系统:我们简单的认为操作系统是来协同上面说的CPU、内存、硬盘的一个系统,然而jdk bin目录里的应用程序最后都会运行在操作系统上,所以jdk会借助操作系统来操作CPU、内存、硬盘。 所以常见的线上问题,通常就出现在CPU、内存、硬盘和操作系统这个几个维度上。
这里总结一下我所碰到过的问题:CPU 利用率高、内存溢出、应用程序很卡(但是又没挂)、各种诡异问题(很难重现但总是偶尔出现)等。
首先我们来说内存,因为通常内存问题是最经常出的,常见的有内存溢出(OOM)、GC问题等。排查这些问题需要了解linux相关命令:
top 后,shift + m 来对各进程按内存进行排序
free 查看linux整体内存情况
OOM异常最好排查,因为已经溢出报错了,常用解决办法:
jmap 导出内存堆栈信息,并用第三方工具(比如MAT)分析,这些工具基本上可以展示到底是哪种对象最多。(这种是最常用的方法)
第三方工具在线展现具体的堆栈信息,比如:https://github.com/alibaba/TBJMap (我并没有实际用过,但是淘宝开源的一定是他们实际用过的,但是一般此类工具最好还是在测试环境中使用)
jprofiler、jvisualvm(具体怎么用,请google)
上面的几种工具和思路,已经基本能搞定OOM类型的问题了
GC问题:我们所碰到过的通常会因为GC回收过于频繁导致CPU过高,或者因为fullgc让整个java进程暂停。此类问题可以借助 jstat -gcutil pid查看各个区域和gc相关信息。当然一些在线工具(jprofiler、jvisualvm)也可以查看,但是不推荐线上使用,jstat已经很NB了。至于里面具体每个字段什么意思,google上已经非常多了。通常查jstat + jmap分析已经基本上能让你知道,是哪个地方的内存问题引起了GC问题。
但是,jstat上会出来很多信息,这里需要对java的内存管理有一定的了解,至少得知道,堆栈、分代机制、新生代、老生代等相关区域有一定的了解。总之要解决内存问题,得对java里的内存要了解。
CPU问题会相对来说复杂很多,CPU好比服务器的大脑,很多其他的组件也可能会导致CPU利用率过高。总结一下我们碰到过的有以下几中:
的确计算量过大,cpu运算不过来
IO读写过于频繁
java线程竞争锁过于频繁
应用程序很卡(但是又没挂)
要排查CPU相关的问题,首先得了解linux的top命令,top的功能非常多,具体每个属性什么意思请先google一下。
解决CPU类的问题总体思路:找到java进程中哪些线程使用CPU很高,简单的说就是top -H -p pid,这个命令会出现java进程里哪些线程使用CPU很高,会按降序排序,但是子线程编号与jstack pid 里出来的不太一样,jstack里出来的是16进程,所以把top -H -p里的转成16进程,然后查找一下具体的线程。
1.的确计算量过大,cpu运算不过来
通过上面的top -H -p和 jstack基本已经能看出来这种类型的问题
2.IO读写过于频繁
截图中的wa。这个代表是cpu等待io的时间,简单的说就是io正在处理,告诉cpu请等我一下,我处理完了就让你去干别的。因为cpu是固定资源,它被io所持有,那么别人就没有办法使用,所以就导致cpu使用率上去了。所以io wait很高就思路很清楚了,接下来就要去查看具体哪些线程在频繁操作io。
接下来就用jstack pid 来查看具体jdk中具体线程,先扫一眼,看是否有很多线程都处于io操作的阶段。但是这还不能完全解决问题,有的时候信息太多,实在不好找,一眼眼看,要看得头痛。所以简单点也可以使用第1点里提到的方法。
3.java线程竞争锁过于频繁
top -H -p和 jstack已经基本上能看出,但是这里还需要对java 线程的各种状态要了解一下。要能理解jstack出来的线程信息里每种状态是什么含义。这样才能分析出具体原因,不然跑去看代码总感觉不应该啊,应该没错啊。
4.应用程序很卡(但是又没挂)
这类问题如果业务不是很复杂,基本上用top -H -p 和 jstack可以查看得出来。但是有的时候还不能完全确定,一种常见的办法就是打日志,这种办法当然是OK的。但是这里再介绍一些可以直接在线上就能定位和分析的工具。https://github.com/alibaba/TProfiler,号称是可以线上使用的分析工具,淘宝开源的东西我们已经使用过很多了,基本上是靠谱的。