Java應用Docker化部署GC變長的踩坑經歷

餓了麼物流技術團隊發表於2018-08-07

作者簡介

超哥,2008年畢業後進入IT行業,目前就職於餓了麼物流架構部,曾就職於聯想研究院的AR裝置視覺團隊和阿里巴巴的業務中臺團隊。 工作內容涉及大資料計算平臺構建,計算視覺雲端應用,業務中介軟體研發以及業務領域模型抽象與實現等。 即時配送業務的高速增長,對系統的複雜度提出了更大的挑戰,同時也給我們足夠多的場景去嘗試與征服。

開發同學反饋應用docker化部署之後,gc時間比KVM部署時漲了好幾倍,最近正好手熱,上機器擼了一把。

問題定位

通過gc日誌收集工具,檢視jvm的gc資訊,平均單次ygc的時間非常不穩定,但基本上都在100ms以上。

Java應用Docker化部署GC變長的踩坑經歷

從叢集裡隨機挑了幾臺機器看了一下gc log,每次gc的堆大小都比較正常,但是時間不太科學。

Java應用Docker化部署GC變長的踩坑經歷

猜測是gc執行緒出了問題。jinfo檢視了

Java應用Docker化部署GC變長的踩坑經歷

服務的docker容器分配了8核16g的資源,上面拉出來的gc執行緒和併發標記執行緒數是38和10,顯然不科學(猜測拉的宿主機的核數)。

預設的gc執行緒和併發標記執行緒數計算公式如下:

Alt text

通過與運維同學溝通,瞭解到宿主機是56核,根據上面公式進行計算,對上了。

修改配置灰度驗證

從叢集中隨機挑選幾臺機器進行灰度,修改下jvm啟動引數,增加 -XX:ParallelGCThreads=8(8是容器核數),設定了ParallelGCThreads之後CMS的併發標記執行緒數會同步下降。

Java應用Docker化部署GC變長的踩坑經歷

執行了一個晚上和一個白天,發現灰度機的ygc變的非常平穩,時間降到了 10ms左右,gc的log如下:

Java應用Docker化部署GC變長的踩坑經歷

結論

因為容器不是物理隔離的,部署的java應用,務必要指定-XX:ParallelGCThreads=CPU_COUNT ,以防被YGC被坑了。




閱讀部落格還不過癮?

歡迎大家掃二維碼加入交流群,討論和部落格有關的技術問題,還可以和博主有更多互動

Java應用Docker化部署GC變長的踩坑經歷
部落格轉載、線下活動及合作等問題請郵件至 shadowfly_zyl@hotmail.com 進行溝通

相關文章