C#遊戲服務器優化

###遊戲服務器代碼:java

http://git.oschina.net/liyonghelpme/GameServerCsharppython

###遊戲服務器優化主要考慮如下幾個問題:git

CPU 運算;性能優化

水平擴展能力;服務器

內存使用;網絡

網絡IO數據流量;工具

硬盤使用;性能

###性能分析優化

任何性能優化以前須要首先對性能進行分析,一般使用Profile 工具,對於C#來說一般Profile 可使用:網站

VS 自帶有性能分析工具;也可使用 redgate ant 或者 和resharper 結合緊密的 dottrace;

VS自帶性能分析工具能夠分析程序運行時候的 CPU使用複雜;

也能夠分析程序內存使用較多的部分代碼;

對於網絡IO須要須要本身定製性能監控工具:

###內存

VS 內存分析工具,能夠分析出程序運行時間中總的內存消耗,以及內存消耗熱點代碼;

對於個人網絡遊戲服務器程序,主要是生成報文的時候,以及對象狀態更新的時候,有大量的內存分配;

優化方案:複用生成的報文,這樣就能夠只分配一次byte數值,使用內存池來管理這些報文內存;

對於protobuff的序列化,須要消耗大量內存,這裏仍然是使用對象池,建立一個能夠複用的stream對象,將protobuff 序列化到這個建立的protobuff對象中,我使用的是protobuf-net ,這個庫參考java的pb庫實現,主要注意這個類 codedoutstream 的內存使用狀況。

對於遊戲PlayerActor 狀態更新時候的大量內存分配,是由於以前採用複製的方式來存儲多幀玩家的數據,這裏修改成 採用修改更新的方式,而不是複製的方式,更新玩家上一幀數據,這樣就能避免內存分配了。

###網絡IO

網絡須要定製工具統計:

一段時間例如10s,0.5s一次間隔內的網絡狀態;

包括,每一個間隔中發送的報文數據量,接受的報文數據量;

發送的報文數量,接受的報文數量;

平均發送的報文大小,接受的報文大小;

這裏首先在服務器內部統計每一個Agent的接受發送報文數據,能夠將這個數據打印到log中, 再服務器內部嵌入一個 http 服務器,這樣就能夠實時查看一些內部狀態了。

接着實現一個python 程序按期查詢這個 http服務器,採樣狀態,接着將採樣的狀態 以matlibplot 繪製爲線圖,這樣就能直觀的查看程序狀態了。

同時能夠分析log日誌,統計每種類型報文每幀的數量,平均大小;這樣就能更精細化的監控狀態了。

對於程序的監控能夠 參考 newrelic 這個網站。

網絡流量的計算:

監控平均一個玩家,服務器發送和接受的數據量,根據這個數據量,能夠簡單乘以玩家的數量,獲得總的數據量;

例如一個玩家 2KB/s的網絡數據,500玩家就是 500*2KB = 1MB/s的網絡數據

固然玩家人數越多數據不必定是線性增長的,能夠參考下面論文。

客戶端還須要作一個自動腳本,用於開啓多個客戶端,每一個客戶端不斷移動和操做,這樣能比較好的模擬真實狀況。

###參考資料:

http://publications.lib.chalmers.se/records/fulltext/147114.pdf

相關文章
相關標籤/搜索