欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记一次线上GC调优

程序员文章站 2022-03-15 14:45:32
最近完成了一次线上系统的jvm调优,写一篇博客记录调优过程以及调优前后数据对比。如有错误,请私信我指出。一、调优背景 1.最近老是接到用户反馈系统经常卡顿,监控了后台日志也没有发现相关的异常信息,猜想是GC的问题。二、调优过程 项目由于是ZF项目,所以晚上以及周末的使用人数比较少,调试的时间都是在这些时间段! 1.首先在服务器端配置了远程连接的参数,方便本地工具连接查看具体的项目运行情况,参数如下catalina.sh这个文件里面新增 ......

最近完成了一次线上系统的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:

记一次线上GC调优

dubbo服务器2:

记一次线上GC调优

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

2.第一次改进

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

运行一天的GC记录如下

web服务器1:

记一次线上GC调优

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点记录:

记一次线上GC调优

次日上午8点记录

记一次线上GC调优

次日上午10点记录

记一次线上GC调优已经出现FGC了,内心开始慌了。

次日上午11点记录

记一次线上GC调优FGC还在持续增长

次日下午4点记录

记一次线上GC调优

次日晚上11点记录

记一次线上GC调优

        此次调整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点记录:

记一次线上GC调优

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

三、调优之后

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

web服务器:

记一次线上GC调优

dubbo服务器:

记一次线上GC调优

 

 

本文地址:https://blog.csdn.net/syso_alt_hao/article/details/114261752

相关标签: Java jvm.gc