我有一个简单的C#应用程序,它在单接收方、单发送方场景中使用UDP多播。目标是在本地网络环境中尽可能快地获得消息传递。
我使用了SocketAsyncEventArgs/SendAsync/ReceiveAsync、BeginSend/BeginReceive、Thread/Send/Receive,并尝试过PGM和UDP组播。
每次实现尝试都可以用于重复消息传递,使用本地发送、本地接收的消息最多可达1000条。在那之后,性能开始指数下降。在1000条消息需要几百秒的情况下,10,000条消息可能需要2-10秒。
有人有高性能的UDP/PGM多播的经验吗?获得最大吞吐量的最佳设计是什么?
更新
现在,它只是一个本地运行的程序-一个应用程序,有一个发送者和一个接收者。测试消息为4个字节。
发布于 2009-11-05 16:07:12
尝试使套接字的发送或接收缓冲区(服务器或客户端)足够大,以适应您期望处理的通信量。下面是来自我自己的UDP组播服务器/客户机的一些示例C#代码,在服务器端,dataSock
是绑定到UDP组播组的Socket
:
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
来表示微秒级的延迟)。
发布于 2009-10-31 03:56:07
我不是这方面的专家,但这听起来像是你与你的网络容量的碰撞。您可能需要升级硬件以获得更好的吞吐量。但是,如果不知道数据包的大小、网络带宽或有多少台机器试图通信等等,那只是猜测而已。
https://stackoverflow.com/questions/1652965
复制相似问题