4

マルチキャストを使用してデータを送信する「パブリッシャー」アプリケーションがあります。このアプリケーションはパフォーマンスに非常に敏感です(マイクロ秒レベルで最適化しています)。この公開されたデータをリッスンするアプリケーションは、公開アプリケーションと同じマシン上にある可能性があります(多くの場合、そうです)。

最近、興味深い現象に気づきました。sendto()を実行する時間は、マシン上のリスナーの数に比例して増加します。

たとえば、リスナーがいない場合、sendto()呼び出しの基本時間は5マイクロ秒であるとします。リスナーを追加するたびに、sendto()呼び出しの時間が約2マイクロ秒増加します。したがって、リスナーが10個ある場合、sendto()呼び出しには2 * 10 + 5=25マイクロ秒かかります。

これは、データがすべてのリスナーにコピーされるまで、sendto()呼び出しがブロックされることを示唆しています。

リスニング側の分析もこれをサポートします。リスナーが10人いる場合、各リスナーは前のリスナーより2マイクロ秒遅れてデータを受信します。(つまり、最初のリスナーは約5マイクロ秒でデータを取得し、最後のリスナーは約23〜25マイクロ秒でデータを取得します。)

プログラムレベルまたはシステムレベルで、この動作を変更する方法はありますか?非ブロッキング/非同期のsendto()呼び出しのようなものですか?または、少なくともメッセージがカーネルのメモリにコピーされるまでブロックするだけで、すべてのリスナーを待たずにメッセージを返すことができます)?

4

2 に答える 2

0

マルチキャストループは非常に非効率的であり、高性能メッセージングには使用しないでください。送信ごとに指摘したように、カーネルはメッセージをすべてのローカルリスナーにコピーしています。

推奨されるアプローチは、別のIPC方式を使用して、共有メモリまたはUNIXソケットのいずれかである同じホスト上の他のスレッドおよびプロセスに配布することです。

たとえば、これは、同じZeroMQソケット上のPGMマルチキャスト接続の上にIPC接続を追加することにより、ZeroMQソケットを使用して簡単に実装できます。

于 2011-07-29T05:21:48.883 に答える
0

明らかな質問をして申し訳ありませんが、ソケットはブロックされていませんか?O_NONBLOCK(ポートのフラグのセットに追加します-を参照してくださいfcntl

于 2011-07-29T05:14:15.090 に答える