记得第一次当整个电商项目负责人的时候,在使用量高峰期时,运维的同事突然跑过来说,xx服务的某台机器的CPU,内存暴了(OOM了),赶紧想办法怎么做。当时的心情既高兴,又紧张。高兴的是产品真的有使用在使用了,有价值了;紧张的是出问题,要怎么解决?
出现这种问题有2种情况,一种是直接服务程序终止,一种是服务程序在还在(线程通过PS命令查看还在运行),但无法对外提供服务。
当然出现这种情况,都是第一时间让运维同事将nginx上的upstream对应的IP注释掉,不让流量在进来到故障的机器上。
对于第一种程序直接终止的,在启动的命令中,加上
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=${HeapDumpPath} \
输出当时的jvm内存镜像,然后通过jconsole来进行分析。
最头痛的是第二情况,服务程序还在运行,但是CPU/内存都满了,这种也就是假死,通过日志文件啥的,很难分析到问题,在纠结的时候,有同事看到了Arthas,我靠,可以直接在线debug,于是乎就搞起来,但当时(三年前吧)只是命领行格式。当初通过
- dashboard
- thread
- jvm
- memory
- trace
等几个命令,就可以去分析问题。而最终的问题原因,都是程序没写好(哇〜〜 又写bug了)