質問

どうぞ!できるだけリアルタイムに近い処理が必要なアプリケーションがあり、TCPとUDPの両方でこの異常な遅延の問題が発生し続けています。遅延は時計仕掛けのように発生し、常に同じ時間の長さです(主に15〜16ミリ秒)。マシン(ローカルローカル)およびネットワーク(2つあります)に送信するときに発生します。

問題の概要:

私は常にVS 2008 ProでコンパイルされたC ++のwinsockを使用していますが、TCPとUDPの両方を使用してさまざまな方法で送受信するためのプログラムをいくつか作成しました。さまざまな言語(MATLAB、C#、C ++)で記述された中間プログラム(ローカルまたはリモートで実行)を常に使用して、1つのプログラムから別のプログラムに情報を転送します。両方のwinsockプログラムは同じマシンで実行されるため、同じクロックからのTxとRxのタイムスタンプが表示されます。パケットのバーストが送信されるパターンが出現し、プログラムされた遅延がないにもかかわらず、次のバーストの前に約15〜16ミリ秒の遅延があります。時々、各パケットの間に15〜16ミリ秒パケットのバースト。その他の場合(まれに)〜47ミリ秒など、異なる長さの遅延が発生します。送信されたバースト間に同じ遅延パターンが示されているにもかかわらず、送信されているミリ秒以内にパケットを受信するように常に見えます。

WinsockまたはNICが各送信の前にパケットをバッファリングしている疑いがありますが、証拠が見つかりません。さまざまなレベルのトラフィックを取得する1つのネットワークへのギガビット接続がありますが、トラフィックがない(少なくともユーザーからの)プライベートネットワークと2ギガビット接続があるクラスターで中間プログラムを実行するときにも同じことを経験します。送受信プログラムで中間プログラムをローカルで実行すると、この遅延が発生します。

役に立ちましたか?

解決

今朝、Javaでサーバーを書き換えているときに問題を見つけました。 Windowsシステムクロックの解像度は15〜16ミリ秒です。つまり、送信時間と同じミリ秒を示すすべてのパケットは、実際には16ミリ秒間隔で異なるミリ秒で送信されますが、タイムスタンプは15ミリ秒から16ミリ秒ごとに増分するだけなので、同じように見えます。

質問に答えるためにここに来て、プログラムの優先度を上げることについての回答を見ました。そこで、3つのプログラムをすべて開始し、タスクマネージャーに入り、3つすべてを「リアルタイム」に上げました。優先順位(他のプロセスにはない)を実行しました。同じ15〜16ミリ秒の間隔を取得しました。

ただし、回答ありがとうございます。

他のヒント

バッファリングは常に含まれており、ハードウェア/ドライバ/ OSなどによって異なります。パケットスケジューラも大きな役割を果たします。

「ハードリアルタイム」が必要な場合保証されているので、おそらくWindowsに近づかないでください...

おそらく表示されるのは、スケジューラの遅延です。アプリケーションは、他のプロセスがタイムスライスを終了してCPUを放棄するのを待っています。マルチプロセッサWindowsの標準タイムスライスは15ミリ秒から180ミリ秒です。

アプリケーション/スレッドの優先度を上げてみてください。

ああ、そうだね。 Windowsとそのバッファ...送信側のSO_SNDBUFと受信側のSO_RCVBUFの値を調整してみてください。また、関連するネットワークハードウェア(ルーター、スイッチ、メディアゲートウェイ)を確認します。マシン間の遅延を可能な限り排除して、遅延を回避します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top