マルチキャストを使用してデータを送信する「パブリッシャー」アプリケーションがあります。このアプリケーションはパフォーマンスに非常に敏感です(マイクロ秒レベルで最適化しています)。この公開されたデータをリッスンするアプリケーションは、公開アプリケーションと同じマシン上にある可能性があります(多くの場合、そうです)。
最近、興味深い現象に気づきました。sendto()を実行する時間は、マシン上のリスナーの数に比例して増加します。
たとえば、リスナーがいない場合、sendto()呼び出しの基本時間は5マイクロ秒であるとします。リスナーを追加するたびに、sendto()呼び出しの時間が約2マイクロ秒増加します。したがって、リスナーが10個ある場合、sendto()呼び出しには2 * 10 + 5=25マイクロ秒かかります。
これは、データがすべてのリスナーにコピーされるまで、sendto()呼び出しがブロックされることを示唆しています。
リスニング側の分析もこれをサポートします。リスナーが10人いる場合、各リスナーは前のリスナーより2マイクロ秒遅れてデータを受信します。(つまり、最初のリスナーは約5マイクロ秒でデータを取得し、最後のリスナーは約23〜25マイクロ秒でデータを取得します。)
プログラムレベルまたはシステムレベルで、この動作を変更する方法はありますか?非ブロッキング/非同期のsendto()呼び出しのようなものですか?または、少なくともメッセージがカーネルのメモリにコピーされるまでブロックするだけで、すべてのリスナーを待たずにメッセージを返すことができます)?