1. 程式人生 > >伺服器效能瓶頸定位-伺服器卡例項解決

伺服器效能瓶頸定位-伺服器卡例項解決

前言:

   計算機是一個多層的結構,計算機領域的好多問題是通過增加一層中間層還解決,悲劇的是這樣上層發生問題得時候,沒有頭緒的時候,我們得通過了解底層,熟悉底層來定位和解決,或許這也是成長為nb程式設計師的道路吧.

問題:

   

伺服器抽象後架構如上: 

12月份底我們的遊戲伺服器出現了卡的情況,

伺服器在某個時間點全區出現卡,表現為客戶端的人物不動,npc不動,

但是伺服器的cpu和記憶體資源佔用都很低.

分析:

第一階段: 定位為閘道器的問題

定位方式: 遊戲客戶端設定了ping指令, 記錄了客戶端到每個伺服器一個來回的時間,而且在伺服器內部收到訊息的時候打了日誌

出現卡現象的時候閘道器發訊息到邏輯伺服器,到收到邏輯伺服器的訊息時間時間沒多少延時

但是使用者收到ping訊息的延時很長,初步定為了閘道器的出現了卡的情況.

對比了閘道器伺服器最近提交的程式碼,發現有增加讀寫鎖的情況,寫了測試程式碼,發現多執行緒情況下有時候開銷很大

具體這邊

修改了相關程式碼

第二階段:繼續優化程式碼

上面的問題提交了,問題沒有得到解決,當時就沒有方向了

猜測可能是邏輯瞬間傳送的訊息很多,導致閘道器處理不過來,另外生成圖形驗證碼耗時,可能導致訊息的堆積

遮蔽了相關程式碼,繼續觀察

第三階段: tcpdump定位問題

通過抓包分析閘道器和客戶端直接通訊的情況,詳細這邊

問題定位為客戶端到伺服器的這條線出問題,最後發現是客戶端在網路卡的情況下,會超量發包,網路越卡發包越多

伺服器socket接受緩衝區被佔滿,問題得到了解決.

總結mark下,藉助優秀的工具,能讓我們更好的定位分析問題,還是要多學習啊