6

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

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

每次实现尝试都可以通过本地发送和本地接收重复传递最多约 1000 条消息。之后,性能开始呈指数下降。1000 条消息需要百分之几秒,而 10,000 条消息可能需要 2-10 秒。

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

更新

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

4

2 回答 2

9

尝试使套接字的发送或接收缓冲区(服务器或客户端)足够大,以容纳您期望处理的流量。这是我自己的 UDP 多播服务器/客户端在服务器端的一些示例 C# 代码,dataSockSocket绑定到 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 多播传输速率以解决该问题(Stopwatch 在 while 循环中使用微秒级延迟)。

于 2009-11-05T16:07:12.257 回答
1

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

于 2009-10-31T03:56:07.780 回答