さまざまなネットワーク トラフィックを持つリアルタイムの組み込み Linux アプリケーションを構築しています。一連のトラフィックのうち、2 つの接続はタイム クリティカルです。1 つは入力データ用で、もう 1 つは出力データ用です。私のアプリケーションでは、このトラフィックが他のタイム クリティカルでないトラフィックよりも優先される必要があります。
私は2つのことを気にしています:
- これら 2 つの接続の過負荷によりドロップされるパケットの数を最小限に抑えます。
- これら 2 つの接続で、デバイス (入力から出力) を介したレイテンシを最小限に抑えます。
私は Linux トラフィック制御について (ある程度!) 理解を深めており、送信されるデータの優先度はリモート デバイスが担当するため、主に送信トラフィックに適用されることを理解しています。アプリケーションをリアルタイム プロセスとしてセットアップし、アプリケーションを実行する優先度に関連する問題に取り組みました。
私は今、tcのセットアップに着手します。私のテストケースでは、これが私が使用するものです:
tc qdisc add dev eth0 root handle 1: prio bands 3 priomap 2 2 2 2 2 2 2 0 2 2 2 2 2 2 2 2
tc qdisc add dev eth0 parent 1:1 handle 10: pfifo
tc qdisc add dev eth0 parent 1:2 handle 20: pfifo
tc qdisc add dev eth0 parent 1:3 handle 30: pfifo
基本的には、優先度 7 のすべてのトラフィックを帯域 0 で送信し、その他のすべてのトラフィックを帯域 2 で送信するということです。
まず、私の予想を確認してみましょう。私が予想しているのは、優先度 7 のトラフィックは、他の優先度のトラフィックよりも常に先に送信される必要があるということです。これにより、そのようなトラフィックの遅延は、ボックス上の他のトラフィックの影響を比較的受けなくなりますよね? 私の mtu は 1500 に設定されており、インターフェイス経由で約 10 MB/秒を取得しています。バンド 2 トラフィックによって生じるバンド 0 の最大追加レイテンシは、1 パケット (<=1500 バイト)、または 150 マイクロ秒 (1500 バイト / 10 M バイト/秒 = 150 マイクロ秒) です。
これが私のテスト設定です:
2 つの Linux ボックス。ボックス 1 は、入力データをエコーする TCP サーバーを実行しています。ボックス 2 はボックス 1 に接続し、TCP 経由でパケットを送信し、遅延 (送信時間から受信時間) を測定します。
ボックス Linux ボックスに同じ tc セットアップを使用します。
アプリケーション (サーバーとクライアントの両方) で、次のようにソケットに SO_PRIORITY を設定しました。
int so_priority = 7;
setsockopt(m_socket.native(), SOL_SOCKET, SO_PRIORITY, &so_priority, sizeof(so_priority));
tc を使用して、トラフィックが帯域 0 を通過し、他のすべてのトラフィックが帯域 2 を通過することを確認します。
tc -s qdisc ls dev eth0
問題は次のとおりです。他にトラフィックがない場合、500 us の範囲の遅延が見られます。他のトラフィック (たとえば、100 MB のファイルをコピーする scp ジョブ) がある場合、レイテンシーは 10 ミリ秒以上に跳ね上がります。本当に奇妙なのは、私が行った tc の作業がまったく影響を与えていないことです。実際、帯域を交換すると (つまり、すべてのトラフィックが優先度の低い帯域 2 を通過し、その他のトラフィックが帯域 1 を通過します)、遅延に違いは見られません。
私が予想していたのは、ネットワーク上に他のトラフィックがある場合、10 ミリ秒ではなく、約 150 マイクロ秒の遅延の増加が見られるということです! ところで、ボックスに他の (非リアルタイム優先) プロセスをロードしても、レイテンシーや他のインターフェイスのトラフィックに影響しないことを確認しました。
もう 1 つの注目すべき点は、mtu を 500 バイトに下げると、レイテンシーが約 5 ミリ秒に減少することです。それでも、これは無負荷の場合よりも一桁悪いです。また、なぜ mtu を変更するとそれほど影響を受けるのに、tc を使用してプライオリティ キューイングを設定しても効果がないのですか?
tc が役に立たないのはなぜですか? 私は何が欠けていますか?
ありがとう!
エリック