2009-10-31 57 views
6

我有一个简单的C#应用​​程序,它在单接收者,单发件人场景中使用UDP多播。目标是在本地网络环境中尽可能快地传递消息。负载下的UDP组播性能

我已经使用SocketAsyncEventArgs/SendAsync/ReceiveAsync,BeginSend/BeginReceive,线程/发送/接收,并尝试了PGM和UDP多播。

每次执行尝试都可以使用本地发送,本地接收的重复消息传送高达约1000条消息。之后,表现开始呈指数级下降。在1000条消息占用几百分之一秒的情况下,10,000条消息可能需要2-10秒的任何时间。

有没有人有高性能UDP/PGM多播的经验?什么是获得最大吞吐量的最佳设计?

更新

现在,它只是在本地运行一个程序 - 1个应用与1个发件人和1个接收器。测试消息是4个字节。

回答

9

尝试使您的套接字的发送或接收缓冲区(服务器或客户端)足够大,以适应您希望处理的流量。下面是我自己的UDP组播服务器/服务器端的客户端的一些C#示例代码,其中dataSock是我Socket绑定到UDP组播组:

dataSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, (NumberOfPackets * PacketSize) + SmallEpsilonForExtraHeadroom); 

还要确保与客户方的匹配设置SocketOptionName.SendBuffer您的服务器生产的缓冲区大小。

如果您还没有意识到,我还建议您使包大小小于MTU。默认情况下,MTU设置为1500字节。 (MTU是最大传输单元大小)

除非您也调整发送速率,以确保您的客户端能够跟上,否则您仍可能会丢弃数据包。您的网络硬件很可能是而不是这里的瓶颈。请参阅我的问题Need microsecond delay in .NET app for throttling UDP multicast transmission rate以解决该问题的答案(使用Stopwatch在while循环中执行微秒级延迟)。

+0

感谢您深思熟虑的信息。 – Anton 2009-11-06 16:37:46

+0

完全没问题。我现在也在与这个东西在战壕里。 :) – 2009-11-06 18:07:00

1

我不是这方面的专家,但它听起来像是你的网络容量受到冲击。您可能需要升级硬件才能获得更好的吞吐量。但是,如果不知道数据包的大小,网络带宽或有多少台机器正在尝试通信等,那只是一种猜测。