陌生系統故障排查記錄(一)-Confluence記憶體溢位
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當機的直接原因
檢視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,等待分析完成檢視分析報告
-
分析報告餅圖中列出了主要佔用記憶體的塊,並標註出四個可疑問題
-
檢視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佔用情況
從上面分析後的結果,並結合平時使用confluence的經驗。confluence作為共享空間,可以上傳各類文件,並且會自動在頁面生成文件的縮圖。故障原因應該使用者大量上傳文件,第三方包aspose生成縮圖的時候產生了記憶體溢位。可以進一步大膽的推測,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。
相關文章
- Java棧溢位|記憶體洩漏|記憶體溢位Java記憶體溢位
- Centos 伺服器系統記憶體故障排查CentOS伺服器記憶體
- 記憶體溢位記憶體溢位
- tomcat記憶體溢位問題記錄Tomcat記憶體溢位
- Java記憶體溢位OutOfMemoryError的產生與排查Java記憶體溢位Error
- 記一次 .NET 醫院CIS系統 記憶體溢位分析記憶體溢位
- Java記憶體溢位Java記憶體溢位
- JBOSS記憶體溢位記憶體溢位
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- 記憶體洩漏和記憶體溢位記憶體溢位
- 直播平臺搭建,Java 記憶體溢位的排查方法Java記憶體溢位
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- 記憶體溢位:native溢位 和 上層溢位記憶體溢位
- WebLogic: 記憶體溢位Web記憶體溢位
- java 程式記憶體溢位Java記憶體溢位
- 記憶體溢位問題記憶體溢位
- 記憶體溢位的分析記憶體溢位
- JVM執行緒和記憶體溢位問題排查思路JVM執行緒記憶體溢位
- 來了解一下記憶體溢位和記憶體洩漏記憶體溢位
- JavaScript之記憶體溢位和記憶體洩漏JavaScript記憶體溢位
- 面試官:說一下記憶體溢位排查過程和工具?我...面試記憶體溢位
- 記一次記憶體溢位問題的排查、分析過程及解決思路記憶體溢位
- Android記憶體溢位分析Android記憶體溢位
- Java記憶體溢位情況Java記憶體溢位
- 記憶體溢位的問題記憶體溢位
- Flume記憶體溢位錯誤記憶體溢位
- JNI練習-記憶體溢位記憶體溢位
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- 記憶體洩漏與記憶體溢位神比較記憶體溢位
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- android防止記憶體溢位淺析(一)Android記憶體溢位
- 阿里大佬講解Java記憶體溢位示例(堆溢位、棧溢位)阿里Java記憶體溢位
- jvm記憶體設定及記憶體溢位、解決方案JVM記憶體溢位
- 【轉】java中的記憶體溢位和記憶體洩漏Java記憶體溢位
- 誰動了我的記憶體之 PHP 記憶體溢位PHP記憶體溢位
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- 誰動了我的記憶體之PHP記憶體溢位PHP記憶體溢位
- 記錄一次記憶體洩漏排查過程記憶體