背景:線上項(xiàng)目 框架Springboot ,mybatis 皇耗,dubbo
事故:cpu 暴漲100%
線上服務(wù)運(yùn)行穩(wěn)定超過一個(gè)月揍很,之后,突然某一個(gè)項(xiàng)目服務(wù)器警報(bào)cpu暴漲箭启。
開始分析原因,cpu暴漲可能引發(fā)的因素,訪問量突然飆升北救,代碼出現(xiàn)無限循環(huán)導(dǎo)致內(nèi)存泄露之類芜抒,出現(xiàn)慢sql 服務(wù)等待時(shí)間過長,緩存擊穿等
開始排查:
1.查詢代理服務(wù)器攘宙,未發(fā)現(xiàn)短時(shí)間內(nèi)訪問量暴增蹭劈,監(jiān)控qps訪問量正常排除訪問量线召,排除
2.代碼出現(xiàn)無限循環(huán)導(dǎo)致內(nèi)存無法釋放等問題,排查系統(tǒng)日志哈打,logback日志未發(fā)現(xiàn)任何錯(cuò)誤打出,排除
3.查詢數(shù)據(jù)庫慢sql湾盗,未發(fā)現(xiàn)任何慢sql立轧,排除
4.緩存擊穿,查看redis監(jiān)控匀借,未發(fā)現(xiàn)任務(wù)異常吓肋,排除
經(jīng)過2天各種排查瑰艘,未發(fā)現(xiàn)任何問題紫新,但是有個(gè)規(guī)律,一旦重啟就會(huì)恢復(fù)囤耳,恢復(fù)后1到2小時(shí)內(nèi)又回出現(xiàn)充择》梭埃基本確認(rèn)是定時(shí)器搞的鬼材彪。但是由于定時(shí)器分布在各個(gè)項(xiàng)目中任何遠(yuǎn)程調(diào)用本項(xiàng)目接口 排查十分困難。
走投無路下段化,開始研究java監(jiān)控程序穗泵,經(jīng)過咨詢其他同事后建議引入 javamelody嘗試佃延。
Springboot 集成javamelody 只需要 pom添加一個(gè)依賴包即可操作方便现诀。(此處可使用搜索引擎查看具體實(shí)施方法)
javamelody提供了界面展示,查看某一接口耗時(shí)占用的百分比坐桩。上線后發(fā)現(xiàn)某一接口占cpu 80% 绵跷,檢查該接口為定時(shí)器接口碾局。后確認(rèn)一次性去除大量的數(shù)據(jù)導(dǎo)致內(nèi)存沾滿 净当,gc機(jī)制釋放蕴潦,所以重啟項(xiàng)目就會(huì)恢復(fù)潭苞,啟動(dòng)1到2小時(shí) 定時(shí)器再次啟動(dòng)就又發(fā)生此疹。
通過對(duì)接口的最大調(diào)用數(shù)量限制重啟項(xiàng)目后,未出現(xiàn)此類現(xiàn)象振诬,事故解決。
由于之前各個(gè)地方都存有監(jiān)控肩豁,一旦出現(xiàn)問題基本可以定位。此次出現(xiàn)問題各個(gè)監(jiān)控均未發(fā)現(xiàn)問題清钥,無奈引入javamelody琼锋。 建議正式環(huán)境 關(guān)閉javamelody,出現(xiàn)問題再開啟檢測祟昭。