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からのリクエストに応じて質問を明確にしました。
バランスを取りたいキューの種類とその効果を明確にする必要があります。
さらに、サーバーで何を構成できるかについても言及する必要があります。あなたはVLANについて言及しました。サーバーでVLAN)を構成できないようです。
異なる方法で同じシステムにパケットを送信するいくつかの可能性があります。
ip link add type ipip
)そしていくつかのインターフェースを介してパケットを送信します。