3

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

問題の簡単な概要:

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

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

4

5 に答える 5

5

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

私は質問に答えるためにここに来ましたが、私のプログラムの優先度を上げることについての反応を見ました。そこで、3 つのプログラムすべてを開始し、タスク マネージャーに移動し、3 つすべてを「リアルタイム」の優先度 (他のプロセスはありません) に上げて実行しました。同じ 15 ~ 16 ミリ秒の間隔が得られました。

しかし、応答をありがとう。

于 2009-10-28T14:21:23.270 に答える
2

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

「ハードリアルタイム」の保証が必要な場合は、おそらくWindowsから離れる必要があります...

于 2009-10-27T14:55:38.933 に答える
0

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

アプリケーション/スレッドの優先度を上げることができます。

于 2009-10-27T23:51:28.733 に答える
0

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

于 2012-12-28T06:56:40.213 に答える