對於.net socket的性能問題,似乎MS也沒有象WCF一樣出個詳細的報告,在很多人的使用情況來看性能方面並不理想。如果你比較關注這方面的東西,那這個測試的報告應該可以給你幫助對.net socket性能方面有個更多的瞭解。如果你擔心.net socket的性能是否滿足遊戲服務端或應用網關的需要,以下測試結果相信也可以給到你一個明確的答案。
測試簡述
爲了更接近實際應用情況,測試流程 主要如下:數據接收->協議分析->數據反序列化成協議消息對象->消息對象分發->構建應答對象->序列化成協議數據 ->發送;而整個測試流程只缺少邏輯處理,不同應用邏輯處理存在差異,導致損耗也不一樣所以並沒有歸納到測試裏去.測試用例分別有:1)高連接高並 發,2)低連接密集併發,3)狀態廣播等三種情況.
測試硬件如下:
- 服務器採用E1230 V2版的至強CPU,8G內存和WIN2008R2的操作系統
- 測試客戶端則使用了三臺配置低的臺式機,2G內存和WIN2003操作系統
由於網絡環境和測試客戶端配置問題,並沒進行極端的壓力模擬
測試1
這個測試主要有三種情況,分別是10000連接,20000連接,30000連接;每個連接每秒向服務器發送一個請求,服務器接收請求後進行處理分發並進行應答
發請請求內容:
123Register register =
new
Register();
register.UserName=
"henryfan"
;
應用答內容:
1234567891011User user=
new
User();
user.Name =
"henryfan"
;
user.City =
"guangzhou"
;
user.Counrty =
"china"
;
user.ID = 2324;
user.Age = 45;
user.BirthDay = 45454545;
user.Enabled =
true
;
user.FData = 4454.45f;
user.DData = 34343242.242;
三種情況的CPU,內存,網絡等資源狀況:
測試2
這個測試主要是針對連接相對比較少,但交互量比較大的應用如遊戲.測試分別是1000,2000和3000連接三種情況,每個連接向服務端發出一個請求,服務端接收處理後進行應答,客戶端得到應答後馬上進入一下次請求.
發送請求內容:應答內容:
1Get
get
=
new
Get();
三種情況的CPU,內存,網絡等資源狀況:
123456789101112GetResponse response =
new
GetResponse();
response.User =
new
User();
response.User.Name =
"henryfan"
;
response.User.City =
"guangzhou"
;
response.User.Counrty =
"china"
;
response.User.ID = 2324;
response.User.Age = 45;
response.User.BirthDay = 45454545;
response.User.Enabled =
true
;
response.User.FData = 4454.45f;
response.User.DData = 34343242.242;
測試3
連接廣播測試,這種在遊戲場景中比較多,就是一個玩家狀態變化後通知相鄰的玩家,這種情況的數據交互非常大;以下測試是針對500連接的狀態廣播,連接每秒轉發兩次狀態變更,服務器把變更信息轉發給其他499個連接,其消息轉發總量是每秒50W條.
轉發信息如下:
12345Po postion =
new
Po();
Point point = client.GetPoint();
postion.Type = client.GetClientType();
postion.X = Convert.ToInt16(point.X);
postion.Y = Convert.ToInt16(point.Y);
CPU,內存,網絡等資源狀況:
以上測試並沒有通過1比1的IO來達到50W的消息轉發,從測試數據來看發送50W消息所使用發送IO大概是1W多來進行處理,因爲同時多個消息發向一個連接,可以把消息進行合併處理來緩解IO所帶的壓力.