業務場景:遊戲行業,N個伺服器,要進行大批次的合服處理,玩家資料會上升,從新整理和伺服器的分配情況和邏輯處理,正常開發後,當天白天正常,然後晚上高峰期開始玩家頻繁反饋無法登入~~~
處理邏輯:
優先確認服務是否當機,如果是,就重啟,分析linux系統日誌,根據當機的原因進行處理即可;
再確認伺服器情況,cpu、記憶體、硬碟、網路等等;
記憶體使用情況還算正常,還有30-40的餘量空間,cpu很明顯的異常:
再查詢程式下執行緒的具體情況:
再吧5675轉16進位制: 162b ,再查詢堆疊資訊
jstack 5656|grep -i -B 10 -A 50 162b
可以確認,系統在瘋狂GC~~~再查詢gc的詳情
jstat -gcutil 5596 1000 5;
jstat -gc -h3 5596 250 10;
到此,確認是gc導致的bug~~~
首先把堆疊匯出後,重啟,先恢復系統
jstack -l 5596 > jstack.data; jmap -histo 5596 > jmap.data;
那麼如何解決呢?
1:最佳化程式碼
2:最佳化伺服器
1的話工作量比較大,而且開頭說道了記憶體其實是夠夠的~所以選2,jvm調優
根據jdk版本,選擇調整:1.7是PermSize,大於的是MetaspaceSize
-Xmx3072m -Xms2048m -XX:PermSize=256M -XX:MaxPermSize=512M
-Xmx3072m -Xms2048m -XX:CompressedClassSpaceSize=256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
後續觀察了幾天,cpu都正常。