進行Photon的性能測試
性能測試(也稱為負載測試)是一種有用且強烈推薦的方式,用于驗證服務器端的實現,和硬件是否可以實際處理預期的負載(在線人數)。
您的期望是什么?
我們經常被問到一個簡單的問題就是:一個光子服務器可以處理多少個并發用戶(CCU)?
但是如果要認真考慮這個問題,那么這個答案并不是那么簡單。因為它取決于多個因素,例如:
- 每個房間的人數
- 傳遞消息率(每間房間和每秒的消息量合計)
- 通訊量的大小
- 協議類型(可靠Reliable/不可靠Unreliable)
- 客戶的平臺
- 采用服務器硬件規格
- 等等
在一個典型的案例中,我們假設需要處理的量為:約200消息量/房間/秒。
在如下的標準配置中:
- ?四核CPU(例如Intel Xeon E3-1270 v3、3.5GHz)
- ?8 GB RAM
- ?1 GBps NIC /上行鏈路端口速度
在標準配置中,每個配置Photon的服務器可以處理2000-3000 CCU
通常情況下,瓶頸不是CPU運算能力,而是NIC/帶寬大小。 因為流量通常比高配置的CPU更貴,因此可能使用較低配置的服務器通常效率更高。
而且一般而言,實體物理服務器比VM(虛擬云服務器)提供更好的結果。
但是,上面的數字只是對預期結果的粗略估計。 您需要使用自己的代碼庫進行一些調整并運行負載測試,以獲得適合您自己的項目的可靠數字。
確定測試方案
在運行負載測試之前,請預估您的項目運行環境并進行預先計算。
- 您希望服務器是什么硬件規格?
- 您希望自己的游戲有多少CCU(同時連接數)?
- 您是哪種類型的游戲,配對會如何進行?您是否具有用于不同功能的不同服務器?
- 您是使用Photon Server SDK中未經修改的代碼,還是擁有自定義代碼??如果有自定義部分,主要修改是什么?
- 每間客房有多少位用戶?
- 有多少條消息要被傳遞?
- ?示例:4個用戶/房間,每100ms調用RaiseEvent()?
- ?傳入:4 * 10 msg / s = 40 msg / s
- ?傳出:4 * 40 msg / s = 160 msg / s
- ?總計:200消息/房間/秒
- ?示例:4個用戶/房間,每100ms調用RaiseEvent()?
- 平均消息大小是多少?
- ?例:
- ?200消息/房間/秒 * 200byte=?40kByte/秒/房間
- ?預期:1000 CCU / 250個房間=>?10 Mbyte / s 總計
- ?例:
使用上面示例中的計算,您的項目已經接近100 MBit / s上行鏈路端口速度的上限。
我們幾個客戶端庫具有內置的“網絡流量統計信息”(Network Traffic Stats),可以幫助您回答這些問題。
建立一個測試客戶端
光子是專門為處理大量的連接和流量進行優化的, 但是,客戶端SDK和庫并不是設計來用于進行負載測試的。一般案例中也無法以與Photon相同的方式對客戶端進行優化。

在大多數情況下,要準備要運行負載測試時,一般您的“游戲客戶端”已完成。 因此,您可能會認為,將真實的游戲客戶端用于負載測試是更加簡單的做法。 但是,如果您嘗試使用PhotonSDK的“負載測試客戶端load test client”,則這些客戶端將成為瓶頸,您將獲得不準確且令人誤解的結果。
建立一個好的測試客戶端,是負載測試的真正挑戰。
我們建議采用以下方法:
- ?記下游戲客戶端需要發送的典型操作/事件的順序。
- ?構建一個簡單的Photon Server(!)應用程序,模擬游戲客戶端的行為。
- ?使用Photon的服務器到服務器(Server to Server)功能在“S2S負載測試應用程序”和“服務器端” 的兩個Photon應用之間建立連接。

配置光子
Photon / PhotonServer.config
- 使用默認配置,請勿進行任何更改。
- 默認配置針對各種用例進行了優化。 任何更改都可能產生不可預見的影響,并且將使理解和分析測試結果變得更加困難。
記錄/ log4net.config:
- ?確保在所有log4net.config文件中使用“ INFO”日志級別。
- ?在“ DEBUG”級別上過多的日志記錄會對性能產生巨大影響,因此需要避免使用!
- ?在此處了解有關日志的更多信息:https://logging.apache.org/log4net/release/config-examples.html
運行測試
- 將您的Photon S2S負載測試客戶端托管在單獨的物理計算機上。
- ?根據經驗,每個光子的“服務器端”至少需要兩臺“ S2S負載測試機”才能平均分配負載。
在運行測試之前,請確保在服務器端和客戶端計算機上安裝性能計數器(Performance Counters)并創建性能計數器日志:
- ?如果光子正在運行,請停止它
- ?從Photon Control->性能計數器(Performance Counters)->安裝計數器(Install Counters),創建日志集(Logging Set)
- ?從命令行啟動“ perfmon”。?在“data collector sets”->“User Defined”下:在“右”窗格中選擇photonperflog>“Properties”->將采樣間隔設置為1秒(如果采用默認的間隔1分鐘,則沒有足夠的數據)
- ?啟動光子
- ?Photon Control -> Performance Counters -> Start Logging
- ?運行負載測試(load test)
- ?Photon Control -> Performance Counters -> Stop Logging
- ?從c\perflogs\admin獲取性能日志
- ?從\deploy\bin_win64\log和\deploy\log獲取日志文件
如果從Photon Control創建計數器日志失敗,請從\deploy\bin_tools\perfmon運行以下命令:
logman.exe create counter photonperflog -si 00:01 -v mmddhhmm -cf logman.config.txt
分析性能并確定瓶頸
要分析負載,請在perfmon中加載性能計數器日志(performance counter log)。
在Photon Server SDK的“ doc”文件夾中,有一個“ photon-perfcounter.pdf”文件,其中列出了所有計數器并對其進行了簡要說明。
- ?估計“總體”負載:對于首次估計,請查看“明顯Obvious”計數器,例如:CPU load, number of Peers / Connections Active, memory usage per process, disconnects, network traffic (Bytes in / out / total)?等。?這些計數器可以使您了解服務器是否按您之前預期方式處理負載,或者是否存在需要進一步調查的瓶頸。
- ?傳出流量(客戶端忙嗎?):?如上所述,客戶端通常是瓶頸。?請檢查“傳出”流量是怎樣被處理的,例如“重新發送的命令每秒”的數量(如果客戶端不發送ACKs,則Photon重新發送該命令),“已排隊的可靠命令(Queued Reliable Commands)”的數量(已發送的命令的數量,尚未確認)等等。?如果這些值很高,則很可能您存在客戶端的問題。?無論如何,您都應該仔細檢查并確認這些計數器,如果您發現了客戶端的瓶頸,請解決它并重新運行測試。
- ?傳入流量(服務器忙嗎?):?通過比較當前正在“處理”多少個“Active” I/O,業務和ENet線程(Business and ENet Threads),以及ENet隊列中是否有消息等項目,來檢查服務器是否繁忙。?這些計數器通常與CPU /內存使用的計數器相關。