6

単一受信者、単一送信者のシナリオで UDP マルチキャストを使用する単純な C# アプリケーションがあります。目標は、ローカル ネットワーク環境でできるだけ速くメッセージを配信することです。

SocketAsyncEventArgs/SendAsync/ReceiveAsync、BeginSend/BeginReceive、Threads/Send/Receive を使用し、PGM と UDP マルチキャストの両方を試しました。

各実装の試行は、ローカル送信、ローカル受信で最大約 1000 件のメッセージを繰り返し配信する場合に問題なく機能します。その後、パフォーマンスは指数関数的に低下し始めます。1,000 件のメッセージには 100 分の数秒かかりますが、10,000 件のメッセージには 2 ~ 10 秒かかります。

高性能 UDP/PGM マルチキャストの経験がある人はいますか? 最大のスループットを得るための最適な設計は何ですか?

アップデート

現時点では、ローカルで実行されているプログラムは 1 つだけです。つまり、1 つの送信側と 1 つの受信側を持つ 1 つのアプリケーションです。テスト メッセージは 4 バイトです。

4

2 に答える 2

9

ソケットの送信または受信バッファー (サーバーまたはクライアント) を、処理する予定のトラフィック量に十分対応できる大きさにしてみてください。dataSockUDP マルチキャスト グループにSocketバインドされているサーバー側の自分の UDP マルチキャスト サーバー/クライアントからのサンプル C# コードを次に示します。

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 rateStopwatch 」を参照してください (マイクロ秒 単位の遅延には while ループを使用します)。

于 2009-11-05T16:07:12.257 に答える
1

私はこれについて専門家ではありませんが、ネットワークの容量にぶつかっているようです。スループットを向上させるには、ハードウェアをアップグレードする必要がある場合があります。しかし、パケットのサイズ、ネットワーク帯域幅、または通信しようとしているマシンの数などを知らなければ、それは単なる推測に過ぎません。

于 2009-10-31T03:56:07.780 に答える