陌生系統故障排查記錄(一)-Confluence記憶體溢位

weixin_34006468發表於2016-12-06

Confluence記憶體溢位故障排查記錄

在各開發團隊使用敏捷進行專案管理之後,公司又推出了jira+confluence的團隊協同開發管理平臺,但在最近卻接連出現confluence當機的故障。因為有過類似排查解決java專案線上問題的經驗,所以應邀幫忙進行故障的排查,下面將具體過程做了記錄以便分享。

問題排查過程

已知資訊

  • confluence伺服器的IP、賬號和密碼
  • confluence當機時間
  • confluence日常基本使用經驗

資訊收集

1.登入confluence伺服器首先ps -ef|grep confluence檢視了一下confluence的程式資訊。獲取到了confluence目錄、啟動引數等重要資訊:

  • jdk版本和JVM大小:*/usr/java/jdk1.8.0_66/jre/bin/java -Xms1024m -Xmx4096m
  • GC資訊:-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=23 -XX:ConcGCThreads=6
  • 記憶體溢位會生成dump檔案:-XX:+HeapDumpOnOutOfMemoryError

2.檢視confluence下面各級目錄,重點關注log、conf、bin、data。又獲取到一些有用資訊:

confluence其實就是一個基於tomcat的java web工程,雖然confluence不熟悉但是tomcat和java還是熟悉的領域

  • 檢視gc日誌,發現在confluence當機之前,一直在頻繁的進行Full GC,但是jvm記憶體並沒有並回收,直到掛掉重啟,這應該是導致confluence當機的直接原因


    3961684-ac1403eb3b3da19f.png
  • 檢視tomcat的catalina.out日誌,有OutOfMemoryError報錯,並且生成了heap dump檔案

3961684-c62158437b391f9f.png
  • 啟動引數中沒有配置HeapDump檔案生成目錄,預設會生成在程式啟動目錄bin下面,發現了java_pid889.hprof

HeapDump分析

經過上面資訊收集,確認是存在記憶體溢位導致的,下面就是分析heap dump檔案了,這裡使用的是Eclipse Memory Analyzer,由於記憶體超4G需要下載64位MAT
1.修改MemoryAnalyzer.ini配置檔案,dump檔案大小為5.8g,所以調大MAT最大記憶體,檔案結尾新增引數-Xmx12240m
2.使用MAT選擇開啟java_pid889.hprof,等待分析完成檢視分析報告

  • 分析報告餅圖中列出了主要佔用記憶體的塊,並標註出四個可疑問題


    3961684-5dd082306d5707d9.png
    Leak Suspects
  • 檢視Problem Suspect 1,是一個conversion執行緒,佔用了20.62的JVM堆記憶體,點選See stacktrace獲取執行緒的棧資訊。通過類和方法名,大約可以猜測執行緒是confluence的負責檔案的轉換的外掛,在使用aspose的包生成縮圖的時候,發生了記憶體洩漏。


    3961684-77d71a75cd5a6c67.png
  • 繼續檢視Problem Suspect 2、3、4,內部都是佔用了大量的com.aspose.imaging.internal.z.e[]物件,和Problem Suspect 1中佔用的完全相同,所以能確認這四個可疑問題屬於同一個,下面是Problem Suspect 1中Object佔用情況


    3961684-26e4065805d8fd17.png
    Problem Suspect 1 Object

Google

從上面分析後的結果,並結合平時使用confluence的經驗。confluence作為共享空間,可以上傳各類文件,並且會自動在頁面生成文件的縮圖。故障原因應該使用者大量上傳文件,第三方包aspose生成縮圖的時候產生了記憶體溢位。可以進一步大膽的推測,aspose生成縮圖的演算法可能是將檔案全部載入到記憶體,當文件過大或者同時上傳文件過多的情況下會導致記憶體溢位。根據tomcat日誌找到記錄的http請求使用者名稱,通過社交手段(電話)確認使用者當時的確是在大量上傳文件。
雖然原因找到了,但是問題並沒有得到解決,我一向認為善於使用google的程式設計師才是合格的程式設計師(當然還包括Stack Overflow、Github等),因為你遇到的99%的問題別人可能都遇到過。通過上面的分析得到了幾個關鍵字confluence、Conversion、OutOfMemoryError、aspose,相互組合幾次很快就查到了想要的結果。

最後大概描述一下故障產生的原因和影響範圍。在CONF-38233裡就已經提出了File Conversion Service會導致CPU高和OutOfMemoryError,會影響5.4.2和5.7以上的版本,但atlassian公司在5.10.4版本只修復了CPU高的問題,在5.7以上版本仍然會存在可能會導致記憶體溢位的bug。在知識空間中提出了一些臨時的監控和解決辦法:

  • 開啟檔案轉換服務日誌 ,進行監控
  • 增加JVM大小
  • 修改檔案轉換服務執行緒數
  • 把檔案轉換服務功能禁用

總結

不斷挖掘收集資訊,篩選出有用部分,結合經驗抓住重點,關鍵是善用google。

相關文章