游戏开发论坛

 找回密码
 立即注册
搜索
查看: 21780|回复: 30

C#异步Socket VS IOCP

[复制链接]

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
发表于 2011-3-8 15:17:00 | 显示全部楼层 |阅读模式
用C#写了一个服务端框架,与客户端广播比率为1:30,简单来讲就是每收到一次客户端数据,就将其广播给30个不同的客户端。
测试用客户端登录频率为200ms,数据发送频率为1s,每次发送数据长度为60byte。
当客户端登录数到达1000,此时服务端每秒调用30000次BeginSend方法异步发送数据,服务端CPU大于90%。
这个测试结果与C++下的IOCP框架性能相去甚远,后者同样的测试方法和广播比率,至少能承载2000以上的客户端。
求教大家:这是由于C#下的BeginSend方法太耗性能的原因吗?它跟IOCP下的WsaSend性能差距有这么大吗?
恳请使用C#开发过网游服务端的大侠赐教,在下感激不尽!!

6

主题

106

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2011-3-8 17:02:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

不太熟悉C#,帮不到你。在MSDN上找找C#和IOCP相关的资料?或在CSDN上的服务器子论坛上问问?

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2011-3-8 21:38:00 | 显示全部楼层

Re: C#异步Socket VS IOCP

可以看你的代码吗,我记得在c#版块里有一盘文章也是教如何使用异步socket,里面对一个异步对象做了特殊处理,也许会提高性能。理论上来说才1000个客户端不会造成90%以上的cpu占用量的。

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2011-3-9 09:00:00 | 显示全部楼层

Re: Re:C#异步Socket VS IOCP

zhcmeng: Re:C#异步Socket VS IOCP

不太熟悉C#,帮不到你。在MSDN上找找C#和IOCP相关的资料?或在CSDN上的服务器子论坛上问问?

没关系,谢谢您~ 我已经在CSDN里发帖了~

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2011-3-9 09:03:00 | 显示全部楼层

Re: Re: C#异步Socket VS IOCP

yahle: Re: C#异步Socket VS IOCP

可以看你的代码吗,我记得在c#版块里有一盘文章也是教如何使用异步socket,里面对一个异步对象做了特殊处理,也许会提高性能。理论上来说才1000个客户端不会造成90%以上的cpu占用量的。

不好意思,因为架构是给公司写的,所以不太方便透露。
基本原理仿照了MSDN里提供的异步套接字构建机制,内容如下:
http://blog.csdn.net/kenkao/archive/2010/03/26/5420158.aspx
自己额外加入了一些诸如发送队列、容错机制一类的措施。
您感觉1000人不会对服务端带来如此巨大的负担,很有道理。我想目前之所以会出现这样的情况,应该主要是由于服务端1:30广播引起的吧?可能是每秒调用30000次的BeginSend方法占据了太多的CPU,您觉得是这样吗?
另外,您提到了“对异步对象做了特殊处理”,这可能是一条重要线索。请问您还记得相关的细节吗?或者有原贴地址也可以~ 感激不尽~

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2011-3-9 09:10:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

PS:昨天听一位大侠提起,说C#每秒发送30000次数据不太现实,真实的网游中也不大可能会出现“1000人同时在线,且每人周围都分布有其他30位玩家”的极端情况,所以服务端不会达到我提到的这种数据发送量。
请问,是这样吗?有经验的大侠都有什么好的测试广播的方法吗?感激不尽~

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2011-3-9 21:46:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

new AsyncCallback(ReadCallback)

差异可以在这个地方,你google站内的文章,我记得有方法可以复用这个AsyncCallback对象,这样就不会造成异步对象大量创建。

15

主题

231

帖子

243

积分

中级会员

Rank: 3Rank: 3

积分
243
发表于 2011-3-10 20:21:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

C#怎么能和C++比呢?

内核,服务器,性能这东西本就应该用C++

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
 楼主| 发表于 2011-3-11 09:03:00 | 显示全部楼层

Re: Re:C#异步Socket VS IOCP

yahle: Re:C#异步Socket VS IOCP
new AsyncCallback(ReadCallback)
差异可以在这个地方,你google站内的文章,我记得有方法可以复用这个A...

非常谢谢您的指教~
这个问题我在代码编写过程中已经注意到了,没有采用MSDN范例中那种重复声明的方式,而是声明了统一的委托对象。您所指的是这个问题吗?

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2011-3-11 09:06:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

恩,如果用c#写异步的效率还是不行,你可以试试用托管c++写一个在。net环境下的IOCP网络层。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 02:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表