伺服器效能瓶頸定位-伺服器卡例項解決
阿新 • • 發佈:2019-01-21
前言:
計算機是一個多層的結構,計算機領域的好多問題是通過增加一層中間層還解決,悲劇的是這樣上層發生問題得時候,沒有頭緒的時候,我們得通過了解底層,熟悉底層來定位和解決,或許這也是成長為nb程式設計師的道路吧.
問題:
伺服器抽象後架構如上:
12月份底我們的遊戲伺服器出現了卡的情況,
伺服器在某個時間點全區出現卡,表現為客戶端的人物不動,npc不動,
但是伺服器的cpu和記憶體資源佔用都很低.
分析:
第一階段: 定位為閘道器的問題
定位方式: 遊戲客戶端設定了ping指令, 記錄了客戶端到每個伺服器一個來回的時間,而且在伺服器內部收到訊息的時候打了日誌
出現卡現象的時候閘道器發訊息到邏輯伺服器,到收到邏輯伺服器的訊息時間時間沒多少延時
但是使用者收到ping訊息的延時很長,初步定為了閘道器的出現了卡的情況.
對比了閘道器伺服器最近提交的程式碼,發現有增加讀寫鎖的情況,寫了測試程式碼,發現多執行緒情況下有時候開銷很大
具體這邊
修改了相關程式碼
第二階段:繼續優化程式碼
上面的問題提交了,問題沒有得到解決,當時就沒有方向了
猜測可能是邏輯瞬間傳送的訊息很多,導致閘道器處理不過來,另外生成圖形驗證碼耗時,可能導致訊息的堆積
遮蔽了相關程式碼,繼續觀察
第三階段: tcpdump定位問題
通過抓包分析閘道器和客戶端直接通訊的情況,詳細這邊
問題定位為客戶端到伺服器的這條線出問題,最後發現是客戶端在網路卡的情況下,會超量發包,網路越卡發包越多
伺服器socket接受緩衝區被佔滿,問題得到了解決.
總結mark下,藉助優秀的工具,能讓我們更好的定位分析問題,還是要多學習啊