某服務(wù)有兩臺(tái)機(jī)器,每隔幾天會(huì)報(bào)警load高,一開(kāi)始看監(jiān)控發(fā)現(xiàn)gc時(shí)間抖動(dòng)很大,以為是發(fā)生了fullgc引起卡頓而未加注意,之后登入線上機(jī)器查看日志發(fā)現(xiàn)是jvm崩潰導(dǎo)致了服務(wù)重啟從而引發(fā)gc時(shí)間抖動(dòng)。以某天為例,該服務(wù)分別在上午7點(diǎn)和上午10點(diǎn)發(fā)生jvm崩潰,如果同時(shí)發(fā)生崩潰將導(dǎo)致線上停服,后果不堪設(shè)想。
2 問(wèn)題分析崩潰日志顯示jvm崩潰發(fā)生在在標(biāo)記清除掃根路徑時(shí)。
搜索此bug,發(fā)現(xiàn)是jvm的一個(gè)已知bug,https://bugs.openjdk.java.net/browse/JDK-8020236,這個(gè)bug在1.6和1.7中均有,只是因?yàn)橹噩F(xiàn)困難而一直未被修復(fù)。
Par_MarkFromRootsClosure::scan_oops_in_oop(HeapWord*)
有人遇到和我們一樣的問(wèn)題(http://hllvm.group.VEvb.com/group/topic/43404),他通過(guò)壓測(cè)發(fā)現(xiàn)當(dāng)“ParallelCMSThreads > ParallelGCThreads”會(huì)引起此崩潰,而當(dāng)"ParallelCMSThreads <= ParallelGCThreads"時(shí)問(wèn)題不再?gòu)?fù)現(xiàn)。而“ParallelCMSThreads > ParallelGCThreads”這個(gè)問(wèn)題也在jvm bug列表中(https://bugs.openjdk.java.net/browse/JDK-6668573),此bug下有人給出的解決思路是將ParallelCMSThreads 設(shè)置為 <=ParallelGCThreads。
3 解決方法查看我們junglepoi-service服務(wù)的jvm參數(shù)配置,發(fā)現(xiàn)ParallelCMSThreads被設(shè)置成4,而ParallelGCThreads卻未被設(shè)置。默認(rèn)情況下ParallelGCThreads = (ncpus <= 8) ? ncpus : 3 + ((ncpus * 5) / 8),其中ncpus是機(jī)器的核數(shù),由于junglepoi-service服務(wù)所在的機(jī)器為2核4G配置,因此默認(rèn)情況下ParallelGCThreads=2,此時(shí)ParallelCMSThreads > ParallelGCThreads。
解決方法是:1)將ParallelCMSThreads設(shè)置為2或1;2)或者不設(shè)置ParallelCMSThreads,默認(rèn)情況下ParallelCMSThreads = (ParallelGCThreads + 3) / 4,如果不設(shè)置默認(rèn)ParallelCMSThreads=(2+3)/4=1。
我們將ParallelCMSThreads設(shè)置為2,上線兩天未復(fù)現(xiàn)jvm崩潰異常,后續(xù)將持續(xù)觀察。
4 啟示不能簡(jiǎn)單拷貝其它項(xiàng)目的jvm參數(shù)配置,需要結(jié)合項(xiàng)目特點(diǎn)、機(jī)器環(huán)境等各方面信息來(lái)綜合配置。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注