web-dev-qa-db-ja.com

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

Linux4.4.0でX540-AT2NICを使用してマルチスレッドサーバーアプリケーションを実行しています(サーバーにはコアごとに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 flow-type tcp4 tos 1 action 10 
     ID 2045 
     $ ethtool --show-ntuple em2 
     16RXリングのルールを追加利用可能
    合計1ルール
    フィルター:2045 
    ルールタイプ:TCP over IPv4 
     Src IPアドレス:0.0 .0.0マスク:255.255.255.255 
    宛先IPアドレス:0.0.0.0マスク:255.255.255.255 
     TOS:0x0マスク:0xff 
     Srcポート:0マスク:0xffff 
    宛先ポート:0マスク:0xffff 
     VLAN EtherType:0x0マスク:0xffff 
     VLAN:0x0マスク:0xffff 
    ユーザー-定義:0x0マスク:0xffffffffffffffff 
    アクション:キュー10 
    に転送します。
  • user-def:TOSフィールドの「問題」を克服するためにuser-defも試しましたが、最後の2バイトでしか使用できないようです。

     $ Sudo ethtool -U em2 flow-type tcp4 user-def 2 action 10 
     ID 2045 
     $ ethtool --show-ntuple em2 
     16のルールを追加使用可能なRXリング
    合計1ルール
    フィルター:2045 
    ルールタイプ:TCP over IPv4 
     Src IPaddr :0.0.0.0マスク:255.255.255.255 
    宛先IPアドレス:0.0.0.0マスク:255.255.255.255 
     TOS:0x0マスク:0xff 
     Srcポート:0マスク:0xffff 
    宛先ポート:0マスク:0xffff 
     VLAN EtherType:0x0マスク:0xffff 
     VLAN:0x0マスク:0xffff 
    ユーザー定義:0x2マスク:0xffffffffffffff00 
    アクション:キュー10に直接送信
    

    そして、他のバイトと一致させようとすると、それは単に無視されます(ユーザー定義は常にゼロで、マスクはいっぱいです):

     $ Sudo ethtool -U em2 flow-type tcp4 user-def 2 m 0xf0ffffffffffffff action 10 
     ID 2045 
     $ ethtool --show-ntuple em2 [.____のルールを追加しました。 ] 16個のRXリングが利用可能
    合計1ルール
    フィルター:2045 
    ルールタイプ:TCP over IPv4 
     Src IPアドレス:0.0.0.0マスク:255.255.255.255 
    宛先IPアドレス:0.0.0.0マスク:255.255.255.255 
     TOS:0x0マスク:0xff 
     Srcポート:0マスク:0xffff 
    宛先ポート:0マスク:0xffff 
     VLAN EtherType:0x0マスク:0xffff 
     VLAN:0x0マスク:0xffff 
    ユーザー定義:0x0マスク:0xffffffffffffffff 
    アクション:キュー10に直接送信
    

上記の問題をどのように解決できるか考えていますか? (VLANまたはTOSアプローチのいずれかが私にとってはうまくいくでしょう)。

編集:@ HaukeLagingからのリクエストに応じて質問を明確にしました。

2
Lluís Vilanova

バランスを取りたいキューの種類とその効果を明確にする必要があります。

さらに、サーバーで何を構成できるかについても言及する必要があります。あなたはVLANについて言及しました。サーバーでVLAN)を構成できないようです。

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

  1. 異なるTCP/UDPポートを使用する(TCP/UDPが使用されている場合)。これは、クライアントとサーバーの両方でDNATを使用することにより、アプリケーションに対して透過的に実行できます。
  2. サーバーで異なるIPアドレスを使用する。これは、クライアントとサーバーの両方でDNATを使用することにより、アプリケーションに対して透過的に実行できます。
  3. クライアントとサーバー上にいくつかのトンネルインターフェースを作成する(ip link add type ipip)そしていくつかのインターフェースを介してパケットを送信します。
  4. 入力キューイングは、ifbデバイスとトラフィックシェーピング(上記の「情報」に基づく)を使用して実行できます。
1
Hauke Laging