负载下的UDP组播性能

时间:2009-10-31 00:36:28

标签: c# udp multicast

我有一个简单的C#应用​​程序,它在单接收器,单发送方案中使用UDP多播。目标是在本地网络环境中尽快发送消息。

我使用过SocketAsyncEventArgs / SendAsync / ReceiveAsync,BeginSend / BeginReceive,Threads / Send / Receive,并尝试过PGM和UDP多播。

每次实施尝试都可以正常工作,通过本地发送,本地接收,可以重复发送大约1000条消息。之后,性能开始呈指数下降。在1000条消息需要几百分之一秒的情况下,10,000条消息可能需要2-10秒。

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

更新

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

2 个答案:

答案 0 :(得分: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以获取该问题的答案(在while循环中使用Stopwatch来获得微秒级的延迟)。

答案 1 :(得分:1)

我不是这方面的专家,但这听起来像是你的网络容量。您可能需要升级硬件以获得更好的吞吐量。但是,如果不知道数据包的大小,网络带宽,或尝试通信的机器数量等等,那只是猜测。