docker應用,后端服務出現OOM情況排查


參考:
 
 
默認情況下,JVM的Max Heap Size是系統內存的1/4,假如我們系統是8G,那么JVM將的默認Heap≈2G。
 
# docker logs compose_cwtpro-back_1
Exception in thread "http-nio-8080-Acceptor-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
28-Feb-2019 08:59:19.035 SEVERE [http-nio-8080-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint$Poller.events
java.lang.OutOfMemoryError: GC overhead limit exceeded
 
Exception in thread "http-nio-8080-exec-89" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "http-nio-8080-exec-58" java.lang.OutOfMemoryError: GC overhead limit exceeded
Exception in thread "http-nio-8080-exec-123" java.lang.OutOfMemoryError: GC overhead limit exceeded

 

# docker exec -it compose_cwtpro-back_1 bash
# java  -XshowSettings:vm  -version
 
 
從監控頁面獲取的信息是,在故障時間點,后端業務的內存使用量突然飆升到接近4.3G,因此導致OOM

 

設置參數:
JAVA_OPTS="-server -Xms6g -Xmx6g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:-OmitStackTraceInFastThrow"      //由於compose文件里面沒有聲明相關jvm參數,因此采用默認。導致初始最大堆棧為系統內存的1/4(4G)。最終突然的流量上升,導致OOM。
 
驗證設置是否有效:
# docker exec -it 2f24707d7a97 bash
# ps -ef | grep java
# jinfo -flag MaxHeapSize 7   //打印對應pid的最大堆棧

 

對比主91.17,設置未重啟及JAVA_OPTS未生效的:

3.87G 基本與截圖一中通過java  -XshowSettings:vm  -version獲取的最大堆棧符合(容器啟動未限制容器可使用內存,默認讀取/proc/meminfo為最大可以內存,未設置docker啟動限制cpu及內存情況下,默認MaxHeapSize為可用最大內存的1/4)
 
 
查看堆內存中的對象數目、大小統計直方圖,如果帶上live則只統計活對象,如下:
# jmap -histo:live 26590 | less
 
用jmap把進程內存使用情況dump到文件中,再用jhat分析查看。jmap進行dump命令格式如下:
# jmap -dump:format=b,file=/tmp/v2x_dump 7
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM