最近完成了一次線上系統的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服務器:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265518.html
標籤:其他
上一篇:Linux應用
