2015-10-29 3 views
9

Windows 7のZeroMQで、奇妙で説明できない現象が見られました.TCP経由でメッセージを送信しています。 (またはinproc、ZeroMQはWindowsでシグナリングに内部的にTCPを使用するため)。Windows7上のTCP/IPがウォームアップに500回送信するのはなぜですか?

この現象は、最初の500個のメッセージが遅く到着し、遅く到着し、待ち時間が着実に増加するという現象です。次に、CPU /ネットワークの競合によって引き起こされるスパイクを除き、レイテンシが低下し、メッセージが一貫して高速に到着します。

問題は、ここで説明されています。https://github.com/zeromq/libzmq/issues/1608

それは一貫して500件のメッセージです。遅れなく送信すると、メッセージは一括送信されるので、数千回の送信を超える現象が見られます。センドを遅らせるとグラフがよりはっきり見えます。センド間で50〜100ミリ秒も遅らせることさえ変わらない。

メッセージのサイズも無関係です。私は10バイトメッセージと10Kメッセージでテストしましたが、同じ結果が得られました。

最大レイテンシは常に2ミリ秒(2,000マイクロ秒)です。

Linuxボックスでは、この現象はありません。

私たちがやってみたいのは、この初期のカーブを取り除くことです。そのため、通常の低レイテンシ(約20-100usec)で新鮮な接続を維持します。


更新:問題は、のみのWindows 上を発生するようWindowsの10も8上に表示されません

+2

ワイルドハンチング:これがWin7のTCPオートチューニングに関連するのではないかと思います。http://www.sevenforums.com/network-sharing/74556-enable-disable-tcp-auto-tuning.html – keithmo

+0

私たちはそれをチェックしています。この現象は、Windows 10でもWindows 8でも起こりそうにないことが分かります。それで、実際にはWindows 7の自動チューニング機能になる可能性があります。 –

答えて

2

原因と回避策が見つかりました。これは、受信側でのバッファリングに起因するWindows 7(少なくとも)上のすべてのTCPアクティビティに関する一般的な問題です。あなたは "TCP slow start"の下の行にいくつかのヒントを見つけることができます。

新しい接続で、または接続がアイドル(150msec以上)の場合、受信バッファが着信パケットをバッファし、は、受信バッファがいっぱいになるまで、またはがアプリケーションにこれらを提供しない一部のタイムアウトが終了します(不明です)。

私たちがインタースレッドシグナリング用にTCPソケットを使用しているZeroMQの回避策は、新しい信号ペアに関するデータのダミーチャンクを送信することです。これは、TCPスタックを強制的に「正常に」動作させ、約100〜150マイクロ秒の一貫した待ち時間を見せます。

これは一般的に有用かどうかわかりません。ほとんどのアプリケーションでは、受信時に少し待つのが有益です。そのため、TCPスタックは呼び出し元のアプリケーションにもっと多くを提供できます。

しかし、小さなメッセージをたくさん送信するアプリでは、この回避策が役立ちます。

接続がアイドル状態の場合、スロースタートが再度発生するため、接続が重大な場合は100ミリ秒ごとにハートビートする必要があることに注意してください。

+1

リンクを提供できますか?あなたが記述した動作は、TCPスロースタートとは関係ありません。そして、より多くのデータを送信するよりも、確かに良い解決策になるはずです。 – EJP

+1

ZeroMQの問題は次のとおりです:https://github.com/zeromq/libzmq/issues/1608 –

+0

@PieterHintjens Pieter、なぜgithubのテストコードは低解像度のs_clockを使用するのですか? ZeroMQは約25nsステップアップのStopwatch.start()/ Stopwatch.stop()ユーティリティサービスを提供していますか?** ** – user3666197

関連する問題