记一次线上GC调优

最近完成了一次线上系统的jvm调优,写一篇博客记录调优过程以及调优前后数据对比。如有错误,请私信我指出。

一、调优背景

      1.最近老是接到用户反馈系统经常卡顿,监控了后台日志也没有发现相关的异常信息,猜想是GC的问题。

二、调优过程

      项目由于是ZF项目,所以晚上以及周末的使用人数比较少,调试的时间都是在这些时间段!

      1.首先在服务器端配置了远程连接的参数,方便本地工具连接查看具体的项目运行情况,参数如下

catalina.sh这个文件里面新增

         JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=xxx.xx.xx(跟服务器IP) -Dcom.sun.management.jmxremote"
         JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8550"
         JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
         JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
         JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

        本地通过jconsole进行远程连接,在内存那一栏发现服务器的最大堆内存只有8G,我们服务器的物理内存是32G,猜想服务器没有配置任何GC相关的参数,全是默认的。如果是这样那就要做大手术了,改变GC策略,调整GC参数。我们JDK使用的是1.8版本,默认的GC策略应该是是并行GC,考虑到服务器内存是32G,准备调整为G1GC同时增大最大以及最小堆内存。

        进入服务器输入jps查看系统的pid,再使用jmap -heap pid 查看GC相关的参数,印证了我的猜想。并行GC、最大堆内存8G。

        使用jstat -gcutil pid 1000 1000 查看GC记录

web服务器1:

dubbo服务器2:

由于采用的分布式,有4台服务器,两台web服务器两台dubbo服务器GC记录都差不多,dubbo服务器的FGC会少一点,但是数据也是明显的不正常。

2.第一次改进

        单纯的改变GC策略并且增大堆内存:JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -Xms20g -Xmx20g"

运行一天的GC记录如下

web服务器1:

dubbo服务器增大内存后一切正常了,没有FGC的产生。

3.第二次改进

        web服务器一天的FGC都有500多个,系统跟调整前并无明显差异,并且出现多次瞬间的503(马上恢复那种),但是都是测试人员反馈的,用户并未反应,吓尿了,于是再一次进行优化,调整参数如下:TS="$JAVA_OPTS -XX:+UseG1GC -Xms20g -Xmx20g -XX:MaxGCPauseMillis=100" 新增了一个参数-XX:MaxGCPauseMillis 设置每次GCswt时间为100毫秒,事实上JVM也不能达到每次都是100毫秒,只能是趋近于这个数值,第二天我分时间段进行了GC记录监控,由于dubbo服务器没有FGC发生,就暂时没有管这两台服务器,只优化web两台服务器了。当晚10点多调整完成的,调整后的GC记录如下

当晚11点记录:

次日上午8点记录

次日上午10点记录

已经出现FGC了,内心开始慌了。

次日上午11点记录

FGC还在持续增长

次日下午4点记录

次日晚上11点记录

        此次调整YGC总时长以及FGC时长都比上一次有了很大的提升,但是期间测试依然反馈会出现503,并且4点以后到晚上11点发生了100个FGC,这个不能忍,也是非正常现象,于是准备加日志并分析GC的原因

4.第三次改进

       JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -Xms20g -Xmx20g -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails   -Xloggc:/data/apache-tomcat-9.0.39/logs/gc.txt" 

我把产生的日志文件通过https://blog.gceasy.io/ 进行分析发现FGC产生的原因都是System.gc()触发的,于是求教了一些大佬,建议我禁用System.gc(),于是有了第四次改进

5.第四次改进

      JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -Xms20g -Xmx20g -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:+PrintGCDetails   -Xloggc:/data/apache-tomcat-9.0.39/logs/gc.txt" 

第二天一切正常,并且没有503发生,期间多次查看了GC记录,也没有FGC发生,截图只保留了一张,如下

次日下午4点记录:

终于正常了,顺便把另外的dubbo服务器也改成了这个配置,连续监控了半个多月,FGC也没有再次发生,本次GC调优圆满完成。

三、调优之后

        记得一定要关闭GC日志打印,他会增加服务器的负担,连续两周天天收到服务器警告都没有往这方面想,后面无意间翻看这方面的博客发现打印GC日志会增加服务器内存损耗,于是取消了GC日志打印,世界终于安静了。本次调优也结束了。下面是最近的GC情况。本次调优只针对本项目以及本服务器,其他项目情况请根据自身情况调整。仅做参考

web服务器:

dubbo服务器:

猜你喜欢

转载自blog.csdn.net/syso_alt_hao/article/details/114261752