12.8. IPoIB の設定

12.8.1. IPoIB の役割について

「IP ネットワークと非 IP ネットワークの比較」で言及したように、ほとんどのネットワークは IP ネットワークですが、InfiniBand は違います。IPoIB の役割は、InfiniBand RDMA ネットワークの上に IP ネットワークエミュレーション層を提供することです。これにより、既存のアプリケーションが InfiniBand ネットワークで修正することなく実行できるようになります。しかし、これらのアプリケーションのパフォーマンスは、RDMA 通信をネイティブで使用するように作成されたアプリケーションの場合よりもかなり低いものになります。ほとんどのネットワークには最大級のパフォーマンスを必要とするアプリケーションと、低パフォーマンスを受け入れられるアプリケーションの 2 種類があります。後者は通常、RDMA 通信のような新しい通信方法を使用するように更新されないため、IPoIB はこれらのアプリケーション用に引き続き利用可能となっています。
iWARP および RoCE/IBoE のネットワークは実際には IP リンク層の上に RDMA 層のある IP ネットワークなので、IPoIB の必要はありません。このため、カーネルは iWARP や RoCE/IBoE RDMA デバイスの上に IPoIB デバイスを作成することは拒否します。

12.8.2. IPoIB 通信モードについて

IPoIB デバイスは、datagram または connected のモードで実行するよう設定できます。違いは、通信先のマシンで IPoIB 層が開こうとする queue pair のタイプです。datagram モードでは、信頼できない未接続の queue pair が開かれます。connected モードでは、信頼性のある接続済みの queue pair が開かれます。
datagram モードの使用時には、信頼性のない未接続の queue pair タイプが InfiniBand リンク層の MTU よりも大きいパケットを許可しません。IPoIB 層が、送信中の IP パケットに 4 バイトの IPoIB ヘッダーを追加します。このため、IPoIB MTU は InfiniBand リンク層の MTU より 4 バイト小さいものである必要があります。InfiniBand リンク層の MTU は通常 2048 バイトなので、datagram モードでの一般的な IPoIB デバイス MTU は 2044 バイトになります。
connected モード使用時には、信頼性のある接続済み queue pair タイプが InfiniBand リンク層 MTU よりも大きいメッセージを許可し、ホストアダプターが各末端でパケットのセグメント化と再構築を処理します。このため、connected モード時に InfiniBand アダプターが送信する IPoIB メッセージにはサイズ制限が課せられません。ただし、IP パケットには 16 ビットのサイズのフィールドしかないことから、最大バイト数は 65535 に制限されます。現実には、このサイズに適合しなくてはならない様々な TCP/IP ヘッダーも勘案する必要があるので、実際に許可される MTU はこれよりも小さくなります。このため、必要となる TCP ヘッダーすべてに十分なスペースを確保するために、connected モードでの IPoIB MTU は最大 65520 となります。
connected モードオプションでのパフォーマンスは通常高いものとなりますが、消費するカーネルメモリーも多くなります。ほとんどのシステムでは、メモリー消費量よりもパフォーマンスの方が重視されるため、より一般的に使用されるのは connected モードになります。
しかしシステムが connected モードで設定されていても、マルチキャストトラフィックは依然として datagram モードで送信する必要があり (InfiniBand スイッチとファブリックは connected モードではマルチキャストトラフィックを通過させることができません)、さらに connected モードで設定されていないホストとの通信時には datagram モードにフォールバックする必要があります。マルチキャストデータを送信するプログラムを実行する際は、これらのプログラムがインターフェース上で最大 MTU でマルチキャストデータの送信を試みるため、インターフェースを datagram 操作用に設定するか、マルチキャストアプリケーションが送信パケットサイズを datagram のパケットサイズに収まるように制限する必要があります。

12.8.3. IPoIB ハードウェアアドレスについて

IPoIB デバイスには、20 バイトのハードウェアアドレスがあります。非推奨の ifconfig ユーティリティーでは 20 バイトすべては読み取れないため、IPoIB デバイスの正しいハードウェアアドレスを見つけるために、これを使用しないでください。iproute パッケージの ip ユーティリティーは正常に機能します。
IPoIB ハードウェアアドレスの最初の 4 バイトは、フラグと queue pair 番号です。次の 8 バイトは、サブネットの接頭辞です。IPoIB デバイスは最初に作成される際に、デフォルトの 0xfe:80:00:00:00:00:00:00 というサブネット接頭辞が付けられます。このデバイスはサブネットマネージャーと連絡するまで、このデフォルトのサブネット接頭辞 (0xfe80000000000000) を使用し、その時点でサブネット接頭辞をサブネットマネージャーが設定したものに再設定します。最後の 8 バイトは、IPoIB デバイスの接続先となる InfiniBand ポートの GUID アドレスです。最初の 4 バイトと次の 8 バイトは時々変化するため、IPoIB インターフェースのハードウェアアドレスを指定する際には、これを使ったり適合対象としたりすることはありません。「70-persistent-ipoib.rules の使用」のセクションでは、udev ルールファイルの ATTR{address} フィールドの最初の 12 バイトを除外してアドレスを生成する方法を説明しています。こうすることで、デバイスの適合を確実にできます。IPoIB インターフェースを設定する場合は、設定ファイルの HWADDR フィールドに 20 バイトすべてを含めることができますが、適合に使用されるのは最後の 8 バイトのみで、これを使って設定ファイルで指定されたハードウェアを見つけます。ただし、TYPE=InfiniBand エントリーがデバイス設定ファイルで正しく記入されておらず、ifup-ib が IPoIB インターフェースを有効にする実際のスクリプトではない場合、設定で指定されたハードウェアをシステムが見つけられないというエラーが発生します。IPoIB インターフェースでは、設定ファイルの TYPE= フィールドは、InfiniBandinfiniband のどちらかである必要があります(エントリーは大文字と小文字を区別しますが、スクリプトはこれらの特定の表記を受け入れます)。

12.8.4. InfiniBand P_Key サブネットについて

InfiniBand ファブリックは、異なる P_Key サブネットを使うことで仮想サブネットに論理的にセグメント化できます。これは、イーサネットインターフェース上で VLAN を使用することに非常に似ています。すべてのスイッチとホストはデフォルトの P_Key サブネットのメンバーである必要がありますが、管理者は新たなサブネットを作成して、これらサブネットのメンバーをファブリック内のホストまたはスイッチのサブネットに限定できます。P_Key サブネットは、ホストがこれを使用する前にサブネットマネジャーで定義される必要があります。opensm サブネットマネジャーを使って P_Key サブネットを定義する方法については、「P_Key 定義の作成」を参照してください。IPoIB インターフェースの場合は、P_Key サブネットが作成されると、それらの P_Key サブネットのみを対象とした IPoIB 設定ファイルを追加で作成できます。各 IPoIB インターフェースはイーサネットデバイス上の VLAN インターフェースのように、同一リンクを共有するものの異なる P_Key の値を持つ IPoIB インターフェースとは完全に異なるファブリックにいるかのように動作します。
IPoIB P_Key インターフェースには特別な要件があります。すべての IPoIB P_Key の範囲は 0x0000 から 0x7fff で、0x8000 という高いビットは、P_Key のメンバーシップが部分的なものではなく完全なメンバーシップであることを示します。Linux カーネルの IPoIB ドライバーがサポートするのは P_Key サブネットの完全なメンバーシップのみなので、Linux が接続可能なサブネットでは常に高いビットの P_Key が設定されています。つまり、Linux コンピューターが P_Key 0x0002 に加わると、そのコンピューターの実際の P_Key 番号は 0x8002 となり、P_Key 0x0002 の完全なメンバーになったことを示します。このため、「P_Key 定義の作成」セクションの説明にあるように opensm partitions.conf ファイルで P_Key 定義を作成する際は、0x8000 以外で P_Key の値を指定する必要があります。ただし、Linux クライアント上で P_Key IPoIB インターフェースを定義する際には、ベースの P_Key の値に 0x8000 の値を追加します。

12.8.5. テキスト形式のユーザーインターフェース nmtui による InfiniBand の設定

テキスト形式のユーザーインターフェースツール nmtui を使うと、ターミナルのウィンドウで InfiniBand を設定できます。このツールを起動するには、以下のコマンドを実行します。
~]$ nmtui
テキスト形式のインターフェースが表示されます。無効なコマンドの場合は、使用法に関するメッセージが出力されます。
移動するには矢印キーを使用するか、Tab を押して次に進むか Shift+Tab を押して前に戻ります。Enter を押してオプションを選びます。Space バーは、チェックボックスのステータスを切り替えます。
メニューから 接続の編集 を選択します。追加 を選択すると 新規の接続 画面が開きます。
NetworkManager テキスト形式のユーザーインターフェースの InfiniBand 接続追加メニュー

図12.1 NetworkManager テキスト形式のユーザーインターフェースの InfiniBand 接続追加メニュー

InfiniBand を選択すると、接続の編集 画面が開きます。画面のプロンプトに従って設定を完了します。
NetworkManager テキスト形式ユーザーインターフェースで InfiniBand 接続を設定するメニュー

図12.2 NetworkManager テキスト形式ユーザーインターフェースで InfiniBand 接続を設定するメニュー

InfiniBand 用語の定義については、「InfiniBand タブの設定」を参照してください。
nmtui のインストール方法は「nmtui を使用した IP ネットワークの設定」を参照してください。

12.8.6. コマンドラインツール nmcli での IPoIB の設定

まず、デフォルトの IPoIB デバイスの名前変更が必要かどうかを判断します。必要な場合は、「70-persistent-ipoib.rules の使用」に記載の指示に従って、udev の名前変更ルールを使用してデバイスの名前を変更します。以下のように ib_ipoib カーネルモジュールを一旦削除してリロードすると、再起動せずに IPoIB インターフェースの名前変更ができます。
~]$ rmmod ib_ipoib
~]$ modprobe ib_ipoib
デバイスに必要な名前が付けられたら、nmcli ツールを使用して IPoIB インターフェースを作成します。以下に 2 とおりの方法を示します。

例12.3 2 つの別々のコマンドによる IPoIB の作成および修正

~]$ nmcli con add type infiniband con-name mlx4_ib0 ifname mlx4_ib0 transport-mode connected mtu 65520
Connection 'mlx4_ib0' (8029a0d7-8b05-49ff-a826-2a6d722025cc) successfully added.
~]$ nmcli con edit mlx4_ib0

===| nmcli interactive connection editor |===

Editing existing 'infiniband' connection: 'mlx4_ib0'

Type 'help' or '?' for available commands.
Type 'describe [>setting<.>prop<]' for detailed property description.

You may edit the following settings: connection, infiniband, ipv4, ipv6
nmcli> set infiniband.mac-address 80:00:02:00:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a3
nmcli> save
Connection 'mlx4_ib3' (8029a0d7-8b05-49ff-a826-2a6d722025cc) successfully updated.
nmcli> quit
あるいは、以下のように nmcli c addnmcli c modify を 1 つのコマンドで実行できます。

例12.4 1 つのコマンドによる IPoIB の作成および修正

nmcli con add type infiniband con-name mlx4_ib0 ifname mlx4_ib0 transport-mode connected mtu 65520  infiniband.mac-address 80:00:02:00:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a3
これで mlx4_ib0 という名前の IPoIB インターフェースが作成され、connected モードを使用するように設定されました。MTU は connected モードの最大値で、IPv4 および IPv6DHCP が使われます。IPoIB インターフェースをクラスタートラフィックに使用し、イーサネットインターフェースをクラスター以外の通信に使用する場合は、デフォルトルートと IPoIB インターフェース上のデフォルトネームサーバーの無効化が必要になる可能性があります。これは、以下のように実行できます。
~]$ nmcli con edit mlx4_ib0

===| nmcli interactive connection editor |===

Editing existing 'infiniband' connection: 'mlx4_ib0'

Type 'help' or '?' for available commands.
Type 'describe [>setting<.>prop<]' for detailed property description.

You may edit the following settings: connection, infiniband, ipv4, ipv6
nmcli> set ipv4.ignore-auto-dns yes
nmcli> set ipv4.ignore-auto-routes yes
nmcli> set ipv4.never-default true
nmcli> set ipv6.ignore-auto-dns yes
nmcli> set ipv6.ignore-auto-routes yes
nmcli> set ipv6.never-default true
nmcli> save
Connection 'mlx4_ib0' (8029a0d7-8b05-49ff-a826-2a6d722025cc) successfully updated.
nmcli> quit
P_Key インターフェースが必要な場合は、以下のように nmcli を使って作成します。
~]$ nmcli con add type infiniband con-name mlx4_ib0.8002 ifname mlx4_ib0.8002 parent mlx4_ib0 p-key 0x8002
Connection 'mlx4_ib0.8002' (4a9f5509-7bd9-4e89-87e9-77751a1c54b4) successfully added.
~]$ nmcli con modify mlx4_ib0.8002 infiniband.mtu 65520 infiniband.transport-mode connected ipv4.ignore-auto-dns yes ipv4.ignore-auto-routes yes ipv4.never-default true ipv6.ignore-auto-dns yes ipv6.ignore-auto-routes yes ipv6.never-default true

12.8.7. コマンドラインを使用した IPoIB の設定

まず、デフォルトの IPoIB デバイスの名前変更が必要かどうかを判断します。必要な場合は、「70-persistent-ipoib.rules の使用」に記載の指示に従って、udev の名前変更ルールを使用してデバイスの名前を変更します。以下のように ib_ipoib カーネルモジュールを一旦削除してリロードすると、再起動せずに IPoIB インターフェースの名前変更ができます。
~]$ rmmod ib_ipoib
~]$ modprobe ib_ipoib
デバイスに必要な名前が付けられたら、管理者は好みのエディターで ifcfg ファイルを作成し、デバイスを制御できます。静的 IPv4 アドレス指定の通常の IPoIB 設定ファイルは、以下のようになります。
~]$ more ifcfg-mlx4_ib0
DEVICE=mlx4_ib0
TYPE=InfiniBand
ONBOOT=yes
HWADDR=80:00:00:4c:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a1
BOOTPROTO=none
IPADDR=172.31.0.254
PREFIX=24
NETWORK=172.31.0.0
BROADCAST=172.31.0.255
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
MTU=65520
CONNECTED_MODE=yes
NAME=mlx4_ib0
DEVICE フィールドは、udev の名前変更ルールで作成されたカスタム名に合致する必要があります。NAME エントリーはデバイス名に合致する必要はありません。GUI 接続エディターが起動していれば、NAME フィールドは現在使用している接続に使用されている名前になります。InfiniBand オプションが正常に処理されるには、TYPE フィールドは InfiniBand である必要があります。CONNECTED_MODE は yesno で、yes の場合は connected モードが使用され、no の場合は datagram モードが使用されます (「IPoIB 通信モードについて」を参照)。
P_Key インターフェースの場合、以下のような設定ファイルになります。
~]$ more ifcfg-mlx4_ib0.8002
DEVICE=mlx4_ib0.8002
PHYSDEV=mlx4_ib0
PKEY=yes
PKEY_ID=2
TYPE=InfiniBand
ONBOOT=yes
HWADDR=80:00:00:4c:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a1
BOOTPROTO=none
IPADDR=172.31.2.254
PREFIX=24
NETWORK=172.31.2.0
BROADCAST=172.31.2.255
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
MTU=65520
CONNECTED_MODE=yes
NAME=mlx4_ib0.8002
すべての P_Key インターフェースファイルでは、PHYSDEV はディレクティブは必須となり、親デバイス名にする必要があります。PKEY ディレクティブは yes に、PKEY_ID はインターフェースの数 (0x8000 メンバーシップビットを追加したもの有りまたはなし) に設定する必要があります。ただし、デバイス名は、PKEY_ID を 4 桁の 16 進数で表したものに論理和を使用して 0x8000 メンバーシップビットを合わせたものにします。以下のようになります。
NAME=${PHYSDEV}.$((0x8000 | $PKEY_ID))
デフォルトでは、ファイル内の PKEY_ID は 10 進数として扱われ、16 進数に変換された後、論理和を用いて 0x8000 と合わされてデバイス用の適切な名前にします。ただしユーザーは、数字に標準 0x 接頭辞を追加して PKEY_ID を 16 進数で指定することもできます。

12.8.8. IPoIB 設定後の RDMA ネットワークテスト

IPoIB が設定されれば、IP アドレスを使用して RDMA デバイスの指定ができます。IP アドレスとホスト名を使用してマシンを指定することが一般的であるため、ほとんどの RDMA アプリケーションでは、接続するリモートマシンまたはローカルデバイスの指定にこの方法が優先されます。場合によっては、この方法が唯一の指定方法になります。
IPoIB 層の機能のテストには、標準 IP ネットワークテストツールを使って IPoIB デバイスの IP アドレスを提供できます。たとえば、IPoIB デバイスの IP アドレスの間で ping コマンドが機能させることができます。
Red Hat Enterprise Linux には qperfperftest という、2 つの異なる RDMA パフォーマンステストパッケージが含まれています。これらのうちのどちらかを使って RDMA ネットワークをさらにテストできます。
ただし、perftest パッケージの一部であるアプリケーション、または qperf アプリケーションを使用する場合は、アドレス解決に特別な注意があります。リモートホストは IP アドレスまたは IPoIB デバイスのホスト名を使用して指定されますが、テストアプリケーションは実際には異なる RDMA インターフェースを使って接続することが可能です。これは、ホスト名または IP アドレスを RDMA アドレスに変更するプロセスで、使用されるマシン 2 台の間で有効な RDMA アドレスのペアが許可されるためです。クライアントが複数の方法でサーバーに接続できる場合、プログラムは指定したパスに問題があれば、別のパスを選択することができます。たとえば、同じ InfiniBand サブネットに接続されているマシンにそれぞれ 2 つのポートがあり、各マシンの 2 つ目のポートに IP アドレスが提供された場合、プログラムは各マシンの 1 つ目のポートを有効な接続方法と判断し、それらを使用することになります。この場合、「初期の InfiniBand RDMA 操作のテスト」ibping で実行したように、どの perftest プログラムでもコマンドラインオプションを使ってどのカードとポートをバインドするかを指示することで、テストが必要な特定のポートで確実にテストを実行できます。qperf では、ポートへのバインディング方法は多少異なります。qperf プログラムは 1 台のマシン上でサーバーとして機能し、すべてのデバイス (RDMA 以外のデバイスを含む) をリッスンします。クライアントは、サーバーの有効な IP アドレスまたはホスト名を使って qperf に接続できます。qperf はまず、データ接続の開封を試み、クライアントのコマンドラインで提供された IP アドレスもしくはホスト名で要求されたテストを実行しますが、このアドレスに問題がある場合は、qperf はクライアントとサーバー間にあるいずれかの有効なパスでのテスト実行を試みます。このため、qperf が特定のリンク上でテストするには、qperf クライアントに -loc_id および -rem_id オプションを使用して特定リンク上でのテストを強制します。

12.8.9. GUI を使った IPoIB の設定

グラフィカルツールで InfiniBand 接続を設定するには、nm-connection-editor を使用します。

手順12.4 nm-connection-editor を使用して新規 InfiniBand 接続を追加する

  1. ターミナルで nm-connection-editor と入力します。
    ~]$ nm-connection-editor
  2. 追加 ボタンをクリックします。接続の種類の選択 ウィンドウが表示されます。InfiniBand を選択して 作成 をクリックします。InfiniBand 接続 1 の編集 ウィンドウが表示されます。
  3. InfiniBand タブで、InfiniBand 接続に使用するトランスポートモードをドロップダウンリストから選びます。
  4. InfiniBand MAC アドレスを入力します。
  5. 設定を確認してから 保存 ボタンをクリックします。
  6. 「InfiniBand タブの設定」を参照して、InfiniBand 固有のセッティングを編集します。

手順12.5 既存の InfiniBand 接続を編集する

既存の InfiniBand 接続を編集するには以下の手順に従います。
  1. ターミナルで nm-connection-editor と入力します。
    ~]$ nm-connection-editor
  2. 編集する接続を選択して、編集 ボタンをクリックします。
  3. 全般 タブを選択します。
  4. 接続名、自動接続の動作、および可用性のセッティングを設定します。
    編集 ダイアログの 全般 タブにある 5 つの設定は、すべての接続の種類で共通のものです。
    • Connection name - ネットワーク接続の分かりやすい名前をします。この名前は、Network ウィンドウメニューの接続名一覧に表示されます。
    • Automatically connect to this network when it is available - このチェックボックスを選択すると、NetworkManager が利用可能なときにこの接続に自動接続します。詳細は「control-center を使用した既存の接続の編集」を参照してください。
    • All users may connect to this network - このチェックボックスを選択すると、システムですべてのユーザーが利用できる接続が作成されます。この設定を変更するには root 権限が必要になる場合があります。詳細は「GUI を使用したシステム全体およびプライベート接続プロファイルの管理」を参照してください。
    • この接続を使用したときは自動的に VPN に接続する - このボックスを選択すると、この接続が利用可能な時に NetworkManager が自動で選択した VPN に接続します。ドロップダウンメニューから VPN を選択します。
    • ファイアウォールゾーン - ドロップダウンメニューからファイアウォールゾーンを選択します。ファイアウォールゾーンに関する詳細情報は、『Red Hat Enterprise Linux 7 セキュリティーガイド』を参照してください。
  5. 「InfiniBand タブの設定」を参照して、InfiniBand 固有のセッティングを編集します。

新規 (または修正した) 接続を保存して他の設定を行う

InfiniBand 接続の編集が終わったら、保存 ボタンをクリックしてカスタマイズした設定を保存します。
そして、以下のいずれかの設定をします。

12.8.9.1. InfiniBand タブの設定

新規の InfiniBand 接続をすでに追加している場合 (手順に関しては、手順12.4「nm-connection-editor を使用して新規 InfiniBand 接続を追加する」を参照)、InfiniBand タブを編集して、親インターフェースと InfiniBand ID を設定できます。
トランスポートモード
ドロップダウンリストから、Datagram または Connected モードを選択できます。他の IPoIB ネットワークで使用しているモードと同じものを選びます。
Device MAC アドレス
InfiniBand ネットワークのトラフィックで使用される InfiniBand 対応デバイスの MAC アドレスです。InfiniBand ハードウェアがインストールされていれば、このハードウェアのアドレスフィールドは事前に記入されます。
MTU
InfiniBand 接続で送信されるパケットに使用する最大転送単位 (MTU) のサイズをオプションで設定します。

12.8.10. 関連資料

インストールされているドキュメント

  • /usr/share/doc/initscripts-version/sysconfig.txt: 設定ファイルおよびそれらのディレクティブについて説明しています。

オンラインのドキュメント

https://www.kernel.org/doc/Documentation/infiniband/ipoib.txt
IPoIB ドライバーの説明で、関連する RFC の参照先も含まれています。