ethtoolフィルタを使用したNICキューのバランス

ethtoolフィルタを使用したNICキューのバランス

X540-AT2 NICを使用してLinux 4.4.0で実行されるマルチスレッドサーバーアプリケーションがあります(サーバーにはコアごとに1つのスレッドがあります)。 LinuxではRSSが有効になっているため、システムの各コアは1つのNIC受信キュー(16コア、つまり16 RXキュー)を使用します。

私の目標は、キューパケットが転送される必要がある別のホスト「ヒント」で実行されるクライアントアプリケーションを持つことです(たとえば、クライアントの指定された受信キューのロードバランシングなど)。

これを達成するために、私は成功せずにNICのフローコントローラテーブルを使用してきました(どんなアイデアがありますか?)。

  • VLANタグ付け:サーバーホストは各VLAN識別子を別々のRXキュー(使用ethtool --config-ntuple)に割り当て、クライアントアプリケーションは各パケットにVLANタグを割り当てて宛先受信キューを識別します(したがって、クライアントが方向バランスを取ることを望むことを達成します) )。

    残念ながら、サーバーはシステムに割り当てられたVLANを持たないプライマリNICインターフェイスでリッスンしているため、クライアントからパケットをまったく受信できません。パケットを受信した後にVLANタグがバランス要求にのみ使用されるようにドロップする方法はありますか?

  • TOSフィールド(IPv4ヘッダーのビット8-15):IPv4のTOSフィールドを使用して同じ操作を試みました。サーバーホストはethtoolを使用して各TOS値を別々のキューに渡し、クライアントはサーバーが目的の宛先受信キューに基づいてTOS値を持つように送信されたパケットを作成します。

    残念ながら、ethtoolはフィルタのTOS値を無視するようです(規則のTOSは常に0です)。

    $ sudo ethtool -U em2ストリームタイプtcp4 tos 1タスク10
    ID 2045のルールが追加されました。
    $ethtool --show-ntuple em2
    16個のRXリングが利用可能
    合計1つのルール
    フィルター: 2045
            ルールタイプ:IPv4経由のTCP
            送信元IPアドレス:0.0.0.0マスク:255.255.255.255
            宛先IPアドレス:0.0.0.0マスク:255.255.255.255
            TOS:0x0マスク:0xff
            ソースポート:0マスク:0xffff
            ターゲットポート:0マスク:0xffff
            VLAN Ethertype: 0x0 マスク: 0xffff
            VLAN: 0x0 マスク: 0xffff
            カスタマイズ:0x0マスク:0xffffffffffffffffff
            処置: キュー10に直接入力
    
  • user-def:TOSフィールドの「問題」を克服するためにuser-defを試してみましたが、最後の2バイトでのみ使用できるようです。

    $ sudo ethtool -U em2 ストリームタイプ tcp4 カスタム 2 タスク 10
    ID 2045のルールが追加されました。
    $ethtool --show-ntuple em2
    16個のRXリングが利用可能
    合計1つのルール
    フィルター: 2045
            ルールタイプ:IPv4経由のTCP
            送信元IPアドレス:0.0.0.0マスク:255.255.255.255
            宛先IPアドレス:0.0.0.0マスク:255.255.255.255
            TOS:0x0マスク:0xff
            ソースポート:0マスク:0xffff
            ターゲットポート:0マスク:0xffff
            VLAN Ethertype: 0x0 マスク: 0xffff
            VLAN: 0x0 マスク: 0xffff
            カスタマイズ: 0x2 マスク: 0xffffffffffffff00
            処置: キュー10に直接入力
    

    別のバイトを一致させようとすると無視されます(ユーザー定義は常に0で、マスクはいっぱいです)。

    $ sudo ethtool -U em2 ストリームタイプ tcp4 カスタマイズ 2m 0xf0ffffffffffffff タスク 10
    ID 2045のルールが追加されました。
    $ethtool --show-ntuple em2
    16個のRXリングが利用可能
    合計1つのルール
    フィルター: 2045
            ルールタイプ:IPv4経由のTCP
            送信元IPアドレス:0.0.0.0マスク:255.255.255.255
            宛先IPアドレス:0.0.0.0マスク:255.255.255.255
            TOS:0x0マスク:0xff
            ソースポート:0マスク:0xffff
            ターゲットポート:0マスク:0xffff
            VLAN Ethertype: 0x0 マスク: 0xffff
            VLAN: 0x0 マスク: 0xffff
            カスタマイズ:0x0マスク:0xffffffffffffffffff
            処置: キュー10に直接入力
    

上記の問題を解決する方法をご存知ですか? (すべてのVLANまたはTOSの方法が私に適しています)。

編集する:@Hauke Lagingの要求に従って質問を明確にしました。

ベストアンサー1

バランスを取りたいキューと達成したい効果が何であるかを明確にする必要があります。

また、サーバーで構成できることについても言及する必要があります。 VLANに言及しました。サーバーでVLANを設定できないようです。

異なる方法で同じシステムにパケットを送信する方法はいくつかあります。

  1. 別のTCP / UDPポートを使用してください(TCP / UDPを使用している場合)。これは、クライアントとサーバーの両方でDNATを使用してアプリケーションに対して透過的に実行できます。
  2. サーバーで別のIPアドレスを使用してください。これは、クライアントとサーバーの両方でDNATを使用してアプリケーションに対して透過的に実行できます。
  3. クライアントとサーバーにマルチトンネルインターフェイス()を作成し、マルチインターフェイスを介してip link add type ipipパケットを送信します。
  4. リスニングは、ifbデバイスとトラフィック調整(上記の「情報」ベース)を使用して実行できます。

おすすめ記事