1

ルーターとして認定できる C++ アプリケーションに取り組んでいます。このアプリケーションは、特定のポートで UDP パケット (毎秒約 37 バイト) を受信し、それらを 10 ミリ秒以内に別の宛先にマルチキャストする必要があります。ただし、パケットの受信後、再送信が 10 ミリ秒の制限を超えて 100 ミリ秒に達することがあります。これらの立ち入り禁止の遅延はランダムです。アプリケーションは、同じイーサネット インターフェイスで受信しますが、別のポートで別の種類のパケット (毎秒約 100 バイトの最大 200 パケット) を受信します。これらの遅延ピークが少なすぎるため (10000 パケット中 2 パケット)、この後のフローが他のフローを混乱させているかどうかはわかりません。

これらの散発的な遅延の原因は何ですか? そして、それらを解決する方法は?

PS 私のアプリケーションは Linux 2.6.18-238.el5PAE で実行されています。遅延は、パケットの受信と送信の成功の間で測定されます!

より明確にするための画像: ここに画像の説明を入力

4

1 に答える 1

2

10 ミリ秒は、非リアルタイム OS にとって厳しい期限です。

  • SCHED_RR や SCHED_FIFO などのリアルタイム スケジューリング ポリシーのいずれかにプロセスを割り当てます (一部の読み取り)。sched_setscheduler()を介してコードで、またはchrtを介してコマンドラインから実行できます。同時に、優先度も調整します。

  • コードが必要以上に CPU を消費していないことを確認してください。そうしないと、システム全体のパフォーマンスに影響します。

  • RT_PREEMPT patchも必要な場合があります。

全体として、Linux でスケジュールするイーサネット トラフィックを生成するタスクは簡単ではありません。たとえば、高性能トラフィック ジェネレータであるBRUTEを参照してください。おそらく、そのコードや研究論文で役立つものを見つけることができます。

于 2012-09-17T09:51:02.667 に答える