我有一个简单的 C# 应用程序,它在单接收方、单发送方场景中使用 UDP 多播。目标是在本地网络环境中尽可能快地传递消息。
我使用过 SocketAsyncEventArgs/SendAsync/ReceiveAsync、BeginSend/BeginReceive、Threads/Send/Receive,并尝试过 PGM 和 UDP 多播。
每次实现尝试都可以通过本地发送和本地接收重复发送最多约 1000 条消息。之后,性能开始呈指数下降。 1000 条消息需要百分之几秒,而 10,000 条消息可能需要 2-10 秒。
有没有人有高性能UDP/PGM多播的经验?获得最大吞吐量的最佳设计是什么?
更新
现在,它只是一个本地运行的程序——1 个应用程序,1 个发送方和 1 个接收方。测试消息为 4 个字节。
最佳答案
尝试使套接字的发送或接收缓冲区(服务器或客户端)足够大以容纳您期望处理的流量。以下是服务器端我自己的 UDP 多播服务器/客户端的一些示例 C# 代码,其中 dataSock
是我绑定(bind)到 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寻找该问题的答案(在 while 循环中使用 Stopwatch
以实现微秒级的延迟)。
关于c# - 负载下的 UDP 组播性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1652965/