.net socket在win2008下的吞吐性能报告
对于.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所带的压力.
访问Beetlex的Github