MyBlog


OOM线上排查

<p>[TOC]</p> <h1>1,线上故障及修复</h1> <p>线上其中一台服务器于2018-07-10中午12点左右发生了宕机,经排查原因是内存溢出了,之前的服务器配置是1C2G的,紧急进行了配置升级,然后优化了一些JVM的参数。</p> <h1>2,故障排查</h1> <p>JVM发生宕机时会在我们项目的日志路径下生成错误日志文件:jvm_err.log。对其进行分析查找具体的宕机原因。该文件大概包含几部分:<strong>日志头文件、导致crash的线程信息、所有线程信息、安全点和锁信息、堆信息、本地代码缓存、编译事件、gc相关记录、jvm内存映射、jvm启动参数、服务器信息</strong></p> <p>日志头大概说明了宕机的原因 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/4fc966aa92f5d992e0f13ec8be00a767?showdoc=.jpg" alt="" /></p> <p>继续查看导致crash的线程信息可以具体的看到哪一块代码有问题: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/605c91c99bbfec59b3c6a75f3c0221b3?showdoc=.jpg" alt="" /></p> <p>针对可能造成内存溢出的两个原因具体的分析:</p> <p>1,查看JVM宕机的堆信息和GC信息</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/edfb2ed96fae714b532af9d5627b8731?showdoc=.jpg" alt="" /></p> <p>GC信息 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/0b07f5ddb25cc40df26365c303bfaf2c?showdoc=.jpg" alt="" /></p> <p>看日志分析:JVM总用内存1.2G左右,参看JVM的配置-Xmx1024M -Xms2048M,当JVM想操作系统申请更多的内存来运行的时候,操作系统已经没有更多可用的内存了。</p> <h1>3,JVM参数优化</h1> <p>首先分享一个很好用的网站,一只懂JVM的小狐狸。可以帮我们查询参数、自动生成参数、优化参数等等:<strong><a href="http://xxfox.perfma.com/jvm/generate">http://xxfox.perfma.com/jvm/generate</a></strong>。</p> <p>升级服务后JVM参数如下:</p> <p>-Xmx4096M -Xms4096M -Xloggc:/home/work/www/promise-sell/var/log/gc.log -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/work/www/promise-sell/var/log -XX:ErrorFile=/home/work/www/promise-sell/var/log/jvm_err.log -XX:ConcGCThreads=1 -XX:ParallelGCThreads=1 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=50M -verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:MaxMetaspaceSize=512M -Djava.rmi.server.hostname={HOSTNAME} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1099</p> <p>除了重新配置了堆、栈的大小,我们还使用了最新的G1收集器取代了CMS收集器,并配置了可控的回收时间限制。关于G1收集器,有兴趣的小伙儿伴儿自己去了解下吧</p> <h1>4,JVM监控</h1> <p>虽然服务器配置升级后问题得到了解决,但是对于JVM的监控我们做的还远远不够,所以我们需要一些对JVM运行的一个整体的监控,这里我们用了JDK自带的visualvm,在C:\Program Files\Java\jdk1.8.0_161\bin 双击打开jvisualvm.exe即可</p> <p>1,左侧菜单栏选择【远程】右键选择添加远程主机,这里我们用包卖收车服务器:promise-sell00举例(使用hostname访问需要配置本地host:如172.20.31.208 promise-sell00)</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/cfd89e31c3e115b48a8d9ef27af785fc?showdoc=.jpg" alt="" /></p> <p>2,右键【promise-sell00】选择添加JMX链接,输入端口号1099,点击确定即可</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/98a4c25ba99a54cdb29ef4ed1f90c291?showdoc=.jpg" alt="" /></p> <p>3,成功后即可看到如下界面</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e92df5269086da6923a5793a15baa498?showdoc=.jpg" alt="" /></p> <p>4,VisualGC页面(需要在工具-插件安装VisualGC插件才能看到这个页面)</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/13210c0a06722cd0fa4cf35be5c2b524?showdoc=.jpg" alt="" /></p> <p>5,如果你的VisualGC页面显示不受此JVM支持,进行如下的操作:</p> <p>a)在服务器目录/usr/local/jdk1.8.0_74/bin 下新增文件:jstatd.all.policy</p> <p>grant codebase &quot;file:/usr/local/jdk1.8.0_74/lib/tools.jar&quot; { permission java.security.AllPermission; };</p> <p>b)当前路径下启动命令:./jstatd -J-Djava.rmi.server.hostname=本机IP -J-Djava.security.policy=jstatd.all.policy -p 2099</p> <p>c)左侧菜单栏:【172.20.31.298】右键选择【添加jstatd链接】,端口号改成2099</p> <p>d)再次查看VisualGC即可,如果还是不行,重启一下</p> <p>6,对转储文件进行分析</p> <p>7,更多功能需要小伙伴儿多多挖掘啦</p> <h2></h2>

页面列表

ITEM_HTML