Confluence內存溢出故障排查記錄
在各開發團隊使用敏捷進行項目管理之后,公司又推出了jira+confluence的團隊協同開發管理平臺,但在最近卻接連出現confluence宕機的故障。因為有過類似排查解決java項目線上問題的經驗,所以應邀幫忙進行故障的排查,下面將具體過程做了記錄以便分享。
問題排查過程
已知信息
- confluence服務器的IP、賬號和密碼
- confluence宕機時間
- confluence日?;臼褂媒涷?/li>
信息收集
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宕機的直接原因
查看tomcat的catalina.out日志,有OutOfMemoryError報錯,并且生成了heap dump文件
- 啟動參數中沒有配置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,等待分析完成查看分析報告
-
分析報告餅圖中列出了主要占用內存的塊,并標注出四個可疑問題
Leak Suspects -
查看Problem Suspect 1,是一個conversion線程,占用了20.62的JVM堆內存,點擊See stacktrace獲取線程的棧信息。通過類和方法名,大約可以猜測線程是confluence的負責文件的轉換的插件,在使用aspose的包生成縮略圖的時候,發生了內存泄漏。
-
繼續查看Problem Suspect 2、3、4,內部都是占用了大量的com.aspose.imaging.internal.z.e[]對象,和Problem Suspect 1中占用的完全相同,所以能確認這四個可疑問題屬于同一個,下面是Problem Suspect 1中Object占用情況
Problem Suspect 1 Object
從上面分析后的結果,并結合平時使用confluence的經驗。confluence作為共享空間,可以上傳各類文檔,并且會自動在頁面生成文檔的縮略圖。故障原因應該用戶大量上傳文檔,第三方包aspose生成縮略圖的時候產生了內存溢出??梢赃M一步大膽的推測,aspose生成縮略圖的算法可能是將文件全部加載到內存,當文檔過大或者同時上傳文檔過多的情況下會導致內存溢出。根據tomcat日志找到記錄的http請求用戶名,通過社交手段(電話)確認用戶當時的確是在大量上傳文檔。
雖然原因找到了,但是問題并沒有得到解決,我一向認為善于使用google的程序員才是合格的程序員(當然還包括Stack Overflow、Github等),因為你遇到的99%的問題別人可能都遇到過。通過上面的分析得到了幾個關鍵字confluence、Conversion、OutOfMemoryError、aspose,相互組合幾次很快就查到了想要的結果。
- confluence bug issue界面:File Conversion Service causes Sustained CPU Spike,此bug已經在5.10.4版本解決
- confluence bug issue界面:File Conversion Service causes OutOfMemoryError ,此bug尚未解決
- confluence 知識空間界面:File conversion service causes out of memory errors in Confluence 5.7 or above ,提供了具體的解決辦法。
最后大概描述一下故障產生的原因和影響范圍。在CONF-38233里就已經提出了File Conversion Service會導致CPU高和OutOfMemoryError,會影響5.4.2和5.7以上的版本,但atlassian公司在5.10.4版本只修復了CPU高的問題,在5.7以上版本仍然會存在可能會導致內存溢出的bug。在知識空間中提出了一些臨時的監控和解決辦法:
- 打開文件轉換服務日志 ,進行監控
- 增加JVM大小
- 修改文件轉換服務線程數
- 把文件轉換服務功能禁用
總結
不斷挖掘收集信息,篩選出有用部分,結合經驗抓住重點,關鍵是善用google。