游戏开发论坛

 找回密码
 立即注册
搜索
楼主: 思月行云

C#异步Socket VS IOCP

[复制链接]

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

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

Re: Re:C#异步Socket VS IOCP

juexing: Re:C#异步Socket VS IOCP
C#怎么能和C++比呢?
内核,服务器,性能这东西本就应该用C++

您说的很有道理,只是这是公司的需要,呵呵~
C#服务端已经商业化了,只是公司缺少这方面的经验,所以想求教大家,尽量把现有服务端的性能提一提,呵呵~

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

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

Re: Re:C#异步Socket VS IOCP

yahle: Re:C#异步Socket VS IOCP
恩,如果用c#写异步的效率还是不行,你可以试试用托管c++写一个在。net环境下的IOCP网络层。

嗯~ 最后万不得已的情况下,就要考虑用这招当杀手锏了,呵呵~

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-3-14 14:26:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

这几天我也正在测试异步SOCKET的IO性能,我的结果给你做个参考,50字节一个包,服务端每秒收包2000个左右,收到的每个包广播200个出去,也就是每秒发送40万个包,CPU占用在85%-90%,这是我在本机测出来的极限,如果再多的话发送就处理不过来了,公司的局网是无线的性能不好,所以客户端和服务端都在我的本机上,等有空找个有线网络再分开测试一下

PS,我测试出来发包用同步比用异步性能要好些,你可以看下SocketAsyncEventArgs对象

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-3-14 19:52:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

因为你本机所以发包可以用同步吧, 不同机器甚至是在WAN上同步就要崩溃了

我最近也在测试C#开发TCP网络服务器的承载能力, 感觉是不太尽如人意。 测试写了个Echo服务器, 每个包256字节,100并发, 6M/s的吞吐就占用了近90%的CPU了。

PS 要想高负载,用BeginXXX/EndXXX是肯定不行了,必须用SocketAsyncEventArgs池

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

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

Re: Re:C#异步Socket VS IOCP

ozeo1121: Re:C#异步Socket VS IOCP
这几天我也正在测试异步SOCKET的IO性能,我的结果给你做个参考,50字节一个包,服务端每秒收包2000个左右,...

您提供的这些数据很有参考价值,非常感谢~
不晓得是不是因为我加入了额外的服务端逻辑(拆包、AOI等等),我这边测出的结果远没有您的理想。
您所使用的是.net3.5下的异步收发框架吧?那个框架我也研究过,不过发现了一个问题,那就是SocketAsyncEventArgs对象的不可重用性。
接收动作确实可以通过使用SocketAsyncEventArgs池达到资源重用的效果,但用于接收的SocketAsyncEventArgs此刻不可重用于发送动作。加之服务端需要广播,因此发送动作远远频繁于接收动作。
如果从资源池的角度考虑的话,服务端同一时刻执行的发送次数过万,需要预生成过万的SocketAsyncEventArgs对象,此时系统会直接报错。因此我能想到的办法只能是每当发送数据时,服务端临时生成一个SocketAsyncEventArgs对象。但经实验证明,临时生成SocketAsyncEventArgs对象所带来的性能消耗,甚至大于系统连续调用BeginSend时的性能消耗……
请问您有什么方法可以解决这个矛盾吗?可以简单的提点一下您是怎样实现服务端的广播机制的吗?感激不尽~~

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

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

Re: Re:C#异步Socket VS IOCP

parkycai: Re:C#异步Socket VS IOCP
因为你本机所以发包可以用同步吧, 不同机器甚至是在WAN上同步就要崩溃了
我最近也在测试C#开发TCP网络服...

您测试得到的服务端吞吐量是6M\s吗?我得到的结果是42M\s,比您的稍理想一点。
不晓得是不是我和您所用的测试机性能上的差异,按理说应该不会有这么明显差距。
您提到的应该也是.net3.5下的异步收发框架吧?我这边遇到的还是这个问题:SocketAsyncEventArgs对象的不可重用性。
服务端存在广播机制,因此发送动作执行次数远远大于接收动作。
接收动作确实可以通过使用SocketAsyncEventArgs池达到资源重用的效果,但用于接收的SocketAsyncEventArgs此刻不可重用于发送动作。我用的办法是每当发送数据时,服务端临时生成一个SocketAsyncEventArgs对象,但所带来的性能消耗甚至大于系统连续调用BeginSend时的性能消耗……
可以求教一下您是怎样解决这个问题的吗?非常感谢~

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-3-15 13:43:00 | 显示全部楼层

Re:C#异步Socket VS IOCP

今天在局网用两台机器测试了,50字节每个包,发包降到22W多个,CPU占用降到24%-28%左右,由于是100M局网,网络流量占用到了99%已经到极限了,我的逻辑不多,都是线程和队列的辅助,包没有解析只是转发广播,只是为了测IO能力。
我开始的做法是服务端侦听到连接后创建一个用户对象,这个对象包含两个SocketAsyncEventArgs(可以一直重用),一个用于发送一个用于接收,测试异步发送效果不理想,然后改成把要发送的包放入队列,再开一个线程从队列取出来同步发送,感觉效果不错。
目前测试的效果还可以,100M网络流量跑满的情况下还有70%的CPU资源可用于逻辑部分
你再仔细查下SocketAsyncEventArgs,它最大的特点就是可重用,如果每秒发包20W次,每秒创建和销毁20W个对象的开销是很大的

1

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-3-15 17:04:00 | 显示全部楼层

Re: C#异步Socket VS IOCP

按楼主的思路测试了一下,客户端创建6000个连接,每个连接每秒发一个50字节的包,服务端对收到的每个包随机选择30个客户端连接广播出去,截了个图,顺便问下有没朋友愿意用C++做个类似的测试,好对比一下

18

主题

116

帖子

218

积分

中级会员

Rank: 3Rank: 3

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

Re: Re:C#异步Socket VS IOCP

ozeo1121: Re:C#异步Socket VS IOCP
今天在局网用两台机器测试了,50字节每个包,发包降到22W多个,CPU占用降到24%-28%左右,由于是100M局网,网...

您测试得到的结果确实很理想,不过我有两个疑问,希望和您探讨:
1.服务端广播使用同步机制。
记得先前我也曾使用同步的方式进行过测试,但导致的结果是发送队列中阻塞的大量的数据包,客户端出现明显的延时现象。因为要捕获时间戳,所以我定义了简单的数据包结构并实现了封包和拆包逻辑,但个人感觉这部分逻辑应该不是导致数据包发送延迟的主要原因。根本原因,我想应该还是由于同步发送方法的阻塞性质导致的。
想请教您是如何克服这一点的?
2.带宽占用的问题
非常感谢您贴出了详细的测试截图。这里想请教您一个问题:您的50byte是指应用层的数据包大小(程序直接定义)还是网络层的数据包大小(可以用抓包软件测试得到)?如果是指在应用层定义的数据包大小,那我的测试结果和您的多少存在一些差异。
C#异步Socket:
连接数1000,客户端发包频率60byte/s,服务端广播比率1:30,服务端发送方式为异步BeginSend;
测试结果——客户端无延时,CPU>85%,带宽占用=42%
另,您推荐的C++测试,也就是IOCP框架:
连接数1000,客户端发包频率60byte/s,服务端广播比率1:30,服务端发送方式为异步WSASend;
测试结果——客户端无延时,CPU<15%,带宽占用=42%
IOCP框架在此基础上继续新增链接,当客户端链接数到达2500,也就是IOCP服务端每秒广播75000包,每包60byte的时候,带宽占用量到达100%。而测试数值 75000*60 比您测试得到的 180000*50 要小很多……
您确定广播队列中所有的数据包都发出去了吗?客户端确定未出现延时吗?

1

主题

7

帖子

9

积分

新手上路

Rank: 1

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

Re:C#异步Socket VS IOCP

你加我QQ吧,3223266
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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