對於.net socket的性能問題,似乎MS也沒有象WCF一樣出個詳細的報告,在很多人的使用情況來看性能方面並不理想。如果你比較關注這方面的東西,那這個測試的報告應該可以給你幫助對.net socket性能方面有個更多的了解。如果你擔心.net socket的性能是否滿足游戲服務端或應用網關的需要,以下測試結果相信也可以給到你一個明確的答案。
測試簡述
為了更接近實際應用情況,測試流程 主要如下:數據接收->協議分析->數據反序列化成協議消息對象->消息對象分發->構建應答對象->序列化成協議數據 ->發送;而整個測試流程只缺少邏輯處理,不同應用邏輯處理存在差異,導致損耗也不一樣所以並沒有歸納到測試里去.測試用例分別有:1)高連接高並 發,2)低連接密集並發,3)狀態廣播等三種情況.
測試硬件如下:
- 服務器采用E1230 V2版的至強CPU,8G內存和WIN2008R2的操作系統
- 測試客戶端則使用了三台配置低的台式機,2G內存和WIN2003操作系統
由於網絡環境和測試客戶端配置問題,並沒進行極端的壓力模擬
測試1
這個測試主要有三種情況,分別是10000連接,20000連接,30000連接;每個連接每秒向服務器發送一個請求,服務器接收請求后進行處理分發並進行應答
發請請求內容:
Register register = new Register(); register.UserName="henryfan"; register.EMail ="henryfan@msn.com";應用答內容:
User user= new User(); user.Name = "henryfan"; user.EMail = "henryfan@msn.com"; 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連接三種情況,每個連接向服務端發出一個請求,服務端接收處理后進行應答,客戶端得到應答后馬上進入一下次請求.
發送請求內容:Get get = new Get();應答內容:GetResponse response = new GetResponse(); response.User = new User(); response.User.Name = "henryfan"; response.User.EMail = "henryfan@msn.com"; 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;三種情況的CPU,內存,網絡等資源狀況:
測試3
連接廣播測試,這種在游戲場景中比較多,就是一個玩家狀態變化后通知相鄰的玩家,這種情況的數據交互非常大;以下測試是針對500連接的狀態廣播,連接每秒轉發兩次狀態變更,服務器把變更信息轉發給其他499個連接,其消息轉發總量是每秒50W條.
轉發信息如下:
Po 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所帶的壓力.