线上宕机优化过程记录

线上宕机优化过程记录

在线上容器中配置jvm参数

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/outMemoryDump.hprof

线上宕机后,自动将当前内存堆导出到文件中.

事故现场: 由于线上配置的是6G的内存,结果6G内存都被撑爆了,所以dump出来的堆文件有7G大小.

线上服务器dump.hprof文件拖到本地分析

步骤1: 压缩dump.hprof文件,方便传输.

tar –czf dump.tar.gz dump.hprof

步骤2: 在服务器上执行:
scp dump.hprof [email protected]:/logs/mylogs/
从服务器把dump.hprof上传到自己的电脑,按回车键后输入本机密码即可.
如果本机拉取文件,需要输入服务器的用户名密码,不安全同时也不知道服务器上面的密码.所以最好使用服务器上传到本机电脑更为方便安全.

还有一种方法:nc
要把文件从from服务器发送到to服务器.则

to服务器执行:nc -l 9999 > dump.tar.gz      //先执行 
from服务器执行: nc -w 1 ip 9999 < dump.tar.gz    //第二执行

这里需要开通to服务器的9999端口,也可以随便指定一个能互相访问的端口即可.文件过大,可能需要等待一会儿,不要关闭命令和窗口.
传输完毕后验证的文件是否一致,在服务器和自己电脑上执行:md5sum dump.tar.gz 值一样说明是一致的.

nc原理也很简单
nc -w ip 9999 < dump.tar.gz 将dump文件发送到ip地址.
nc -l 9999 > dump.tar.gz 接受输入流,然后写入到dump.tar.gz中.

步骤3: 解压文件
tar -xzvf dump.tar.gz //解压tar.gz

步骤4: 下载分析工具

  • mat内存分析工具 eclipse之前的mat插件,现在可以独立运行了.
  • [ibm heapanalyzer] ibm的一个内存分析工具,可以将堆内存中的线程,对象给解析出来.

启动ibm的内存分析工具: java -jar -Xmx14G heapanalyzer.jar
不同的dump文件大小设置的-Xmx内存不一样,看自己的情况,一般设置为dump文件大小的1.5倍到2倍,如果设置过小,分析工具在分析内存文件时会提示Java堆内存溢出的.

ibm分析失败:由于dump文件有7G大小,所以导致分析时,个人的电脑的内存不够用,总是分析到一半就报内存溢出.

eclipse的mat工具:
找到安装包,找到MemoryAnalyzer.ini这个文件,修改启动内存大小.-Xmx8G
mat只能识别.hprof后缀的文件,有时候我们dump出来的文件没有后缀名,可以添加一下后缀名为.hprof.

mat工具分析失败:个人电脑内存不足.

开始切割文件(linux): split -b 1024m dump.hprof
文件被分割了7份,每份1G.

mat分析失败,提示文件不完全.
ibm的分析出来了,从第一个的文件中看到了一部分信息,第二个文件分析失败,后面的文件都分析失败.提示文件打开失败.

尝试分割4G. split -b 4096m dump.hprof 希望能多看到一些,可惜分割大了,反而提示文件不全,无法分析.

步骤5: mat之Linux版本
由于个人电脑无法分析,所以只能找一台公司服务器去做分析了,但是服务器都是没有界面的,所以ibm的不能用,还好mat有Linux版本,不用带界面,分析报告会自动生成一个html的文件,并压缩到zip包中.总算解决的内存不够无法分析的问题了.

  1. 下载并解压安装包.进入到安装包中
  2. 修改MemoryAnalyzer.ini文件,将堆内存改为-Xmx18G
  3. 启动mat并分析文件 ./ParseHeapDump.sh /logs/dump.hprof org.eclipse.mat.api:suspects
  4. 由于文件过大,分析了大概15分钟左右. 最终会在dump.hprof文件所在的目录下生成一个dump_Leak_Suspects.zip文件.
  5. 将dump_Leak_Suspects.zip文件scp到本机目录下.解压后有一个index.html的文件,打开即可看到整个分析报告了.

mat的另外两个参数为:org.eclipse.mat.api:overview , org.eclipse.mat.api:top_components

小插曲:由于mat最新版本的需要使用jdk1.8版本,但是服务器上是1.6版本,我不可能去修改服务器.所以无奈只能下载一个jdk1.8版本.

export JAVA_HOME=/home/bin/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin

这里的设置只是当前窗口的一个设置,并不是全局的或者某用户的,所以不影响服务器的上面全局的环境变量.

参考

mat Linux版本
tar 命令详解省得自己老是忘记tar的解压和压缩参数
nc 命令详解

猜你喜欢

转载自blog.csdn.net/piaoslowly/article/details/81562403