1. 程式人生 > >記錄《QMWS》伺服器效能優化過程

記錄《QMWS》伺服器效能優化過程

效能優化(圖片來自網路)

效能優化(圖片來自網路)

本文是為了記錄下《QMWS》專案伺服器在對外測試期間,效能表現和技術稽核時的效能表現差距很大,從而做出的一些優化過程,期間還是比較頭疼,接近兩個連續通宵來修改。第一個通宵一直在查詢問題和猜問題,找問題是如何出現的,第二天主要是解決對應的效能問題。

效能問題主要集中在:

記憶體使用過快

記憶體洩露

某些時間內協議過多

邏輯功能處理不當

其他網路消耗什麼的暫時也沒有考慮,下面詳細說說這幾個問題是如何引起的以及如何一步步解決的。

1.記憶體使用過快問題

我們專案使用的是C++後端,用了團隊主程之前寫的,後來我參與開發的一個開源的伺服器資料管理框架NFrame,下面是github地址。

A fast, scalable, distributed game server engine/framework for C++, include actor library, network library,can be used as a real time multiplayer game engine ( MMO RPG/MOBA ), which support C#/Lua script/ Unity3d, Cocos2dx and plan to support Unreal.

這個框架就不多做介紹了,有興趣可以從github pull下來研究研究,或者加群討論。

這個框架的主要問題就是小的變數和記憶體申請太多了,導致產生了很多碎片,在linux系統上回收不夠及時導致的,而且我們錯誤的估計了shared_ptr的能力了,智慧指標確實能減少很多記憶體管理,但是生命週期卻不好把握,所以我們臨時用了大google的TCMalloc,每5分鐘主動回收一次記憶體,確實解決了我們的問題。

2.記憶體洩漏

記憶體洩漏這塊主要的問題還是程式碼上的漏洞,邏輯不夠嚴謹,釋放物件的時候因為一些判斷導致物件沒有被釋放。還有就是一些資料管理上的問題,不是特別嚴重。

3.某些操作下邏輯處理過多

因為NFrame採用的是事件回撥的方式來處理資料變動,我們會在自己感興趣的屬性(Property)和表(Record)資料上註冊回撥函式,從而做一些邏輯。這個時候就得特別注意邏輯需求了,因為某些時候屬性會有多次變化,導致多次計算其他屬性,我們遇到的問題就是當屬性變化時計算多個武將的戰鬥力,如果某個操作導致了多個屬性變化,就會導致成倍的戰鬥力計算,加重了邏輯負擔。修改方式是去掉部分回撥,在邏輯操作中特定的時候處理回撥做的事情,從而降低呼叫次數。

4.邏輯功能處理不當

這個就是一些常見的問題了,經過重構整理以及效能測試就可以很好的看出來問題,就不多說了。

推薦的一些工具:

VLD C++記憶體洩漏檢查工具

VTune C++效能記憶體檢查工具,完美和VS IDE結合,非常好用

Valgrind linux下記憶體檢查工具,缺點是沒有IDE環境,報告不太容易看,不過分析還是蠻準確的

Border check(DevPartner) 自動化測試/覆蓋性測試工具,大borland(估計很多人都沒聽過了)出品,業界一流產品

好的結果是問題基本已經排查到了,所以後續的版本測試基本沒有特別大的效能問題,不過還是得爭取高的壓測結果。

PS:線上環境和本地測試還是有很大差距,前些天看到一個測試方法,覺得很有意思,與大家分享下。是通過線上開一臺功能伺服器A,然後再開一臺同樣的功能伺服器B,A和B做的事情完全相同,A是對外服務,B是內部測試伺服器,A多做一件事情,將收到的訊息順便轉發到B,B再按照收到的協議做處理,這樣通過觀察B的資料和效能就能模擬線上環境,從而更容易發現問題處理問題,這個東西github上也有對應的專案,叫TCP Copy,有興趣的朋友可以看看。