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を設定できないようです。
異なる方法で同じシステムにパケットを送信する方法はいくつかあります。
- 別のTCP / UDPポートを使用してください(TCP / UDPを使用している場合)。これは、クライアントとサーバーの両方でDNATを使用してアプリケーションに対して透過的に実行できます。
- サーバーで別のIPアドレスを使用してください。これは、クライアントとサーバーの両方でDNATを使用してアプリケーションに対して透過的に実行できます。
- クライアントとサーバーにマルチトンネルインターフェイス()を作成し、マルチインターフェイスを介して
ip link add type ipip
パケットを送信します。 - リスニングは、ifbデバイスとトラフィック調整(上記の「情報」ベース)を使用して実行できます。