CPU 100% 問題
線上問題處理 CPU 100% 2017-05-27
背景
由于之前做了個單點(diǎn)登錄,導(dǎo)致首次訪問子系統(tǒng)都要去驗證登錄影涉、獲取權(quán)限膏秫,生成seesion,速度慢懈叹,用戶體驗差
故做了個ajax請求乖杠,去提前獲取session,當(dāng)時做完自測的時候是有302錯誤的澄成,沒有在意胧洒,覺得并不影響,然后直接上線墨状。
結(jié)果炸了卫漫,2天以后cpu 100%, 如下圖, 重啟之后正常肾砂, 過了1天 又100%列赎。
解決過程
執(zhí)行 top
命令, 結(jié)果如下
CPUList2.png
執(zhí)行 top -H -p25493
CPUList.png
執(zhí)行 jstack 25493 | grep -A 40 63a5
發(fā)現(xiàn)占用cpu的線程是gc镐确, 初步認(rèn)定是堆內(nèi)存爆滿
看了下pinpoint 更加直觀 如下
PinpointError.png
重啟之后 正常
PinpointRestart.png
jmap 保存快照包吝。
VisualVM分析快照 有個OM 錯誤
OutOfMemoryException.png
堆內(nèi)存溢出.png
JProfilter分析快照 session 有300W個 驚呆了。源葫。漏策。
session.png
故障原因分析
根據(jù)pinpoint,內(nèi)存上升過程基本在一條直線上臼氨,說明session在不停的產(chǎn)生
大概是因為ajax請求之后在無限重定向掺喻。
由于這個ajax請求沒有攜帶session的cookie,所以就不停的產(chǎn)生session了储矩。
但是有點(diǎn)很奇怪感耙,自測的時候重定向幾次后就不會再重定向了
而線上情況看來是有個請求一直在重定向,難道重定向次數(shù)還跟跟瀏覽器有關(guān)持隧?
解決方法
代碼回滾
教訓(xùn)
不要忽視小錯誤
優(yōu)化什么的,能推就推了,畢竟能力差