第9章 InfiniBand および RDMA ネットワークの設定

9.1. InfiniBand および RDMA のテクノロジーについて

InfiniBand とは、2 つの全く異なることを指します。1 つ目は、InfiniBand ネットワーク用の物理的リンク層プロトコルです。2 つ目は、InfiniBand Verbs API と呼ばれる高レベルのプログラミング API です。InfiniBand Verbs API は、remote direct memory access (RDMA) テクノロジーの実装になります。
RDMA 通信は通常の IP 通信とは異なります。これは、通信プロセスでカーネル干渉を迂回し、その過程で通常はネットワーク通信の処理に必要な CPU オーバーヘッドを大幅に削減するためです。通常の IP データ送信では、マシン A 上のアプリケーション X がマシン B 上のアプリケーション Y にデータを送信します。この送信の一部として、マシン B 上のカーネルが最初にデータを受信し、パケットヘッダーの解読、データが アプリケーション Y に属することを判定、アプリケーション Y のウェイクアップ、アプリケーション Y によるカーネルへのシステムコールの読み込み待機を行います。その上でカーネルは、カーネル自体の内部メモリースペースからデータをアプリケーション Y が提供するバッファーに手動でコピーする必要があります。つまりこのプロセスでは、ほとんどのネットワークトラフィックはシステムのメインメモリーバスで少なくとも 2 回にわたってコピーされる必要があるということになります (1 回目はホストアダプターが DMA を使用してデータをカーネルが提供するメモリーバッファーにコピーし、2 回目はカーネルがデータをアプリケーションのメモリーバッファーにコピー)。またこのプロセスでは、コンピューターはカーネルコンテキストとアプリケーション Y のコンテキストを切り替えるために、何度もコンテキストを切り替える必要があるます。このため、ネットワークトラフィックが高速で流れている際には、システムに非常に高い CPU 負荷がかかります。
RDMA プロトコルを使用すると、ネットワークからいつパケットが届くか、そのパケットをどのアプリケーションが受信すべきか、アプリケーションのメモリースペースのどこにそのパケットが送られるべきかをマシン内のホストアダプターが判別できます。パケットをカーネルに送信して処理を行い、それからユーザーのアプリケーションメモリーにコピーする代わりに、パケットのコンテンツを直接アプリケーションのバッファーに配置してその他の干渉は不要になります。こうすることで、高速ネットワーク通信のオーバーヘッドが大幅に削減されます。ただしこれは、ほとんどの IP ネットワークアプリケーションの基礎となっている標準 Berkeley Sockets API を使うと実行できません。このため、独自の API である InfiniBand Verbs API を提供し、アプリケーションをこの API に移植した後に、RDMA テクノロジーを直接使用できるようになります。
Red Hat Enterprise Linux 7 では InfiniBand ハードウェアと InfiniBand Verbs API の両方をサポートしています。さらに、InfiniBand Verbs API を InfiniBand ハードウェア以外で使用可能にするサポート対象の 2 つのテクノロジーがあります。それらは iWARP (Internet Wide Area RDMA Protocol) と RoCE/IBoE (RDMA over Converged Ethernet、これは後に InfiniBand over Ethernet に名前変更) です。これらは両方とも通常の IP ネットワークリンク層を基礎テクノロジーとしており、その設定の大半は実際に本ガイドの 2章IP ネットワークの設定 で説明されています。ほとんどの場合、IP ネットワーク機能が適切に設定され、対象ハードウェアの適切なドライバーがインストールされていれば、RDMA 機能はすべて自動で現れます。カーネルドライバーは常に Red Hat が提供するカーネルに含まれていますが、マシンのインストール時に InfiniBand パッケージグループが選択されなかった場合は、ユーザースペースドライバーを手動でインストールする必要があります。

必要となるユーザースペースパッケージは以下のとおりです。

iWARP
Chelsio hardwarelibcxgb3 または libcxgb4。ハードウェアのバージョンによります。
RoCE/IBoE
Mellanox hardware: libmlx4 または libmlx5 (ハードウェアのバージョンによる)。さらに必要に応じて /etc/rdma/mlx4.conf を編集して、RoCE/IBoE の使用に合ったポートタイプを適切に設定します。また、/etc/modprobe.d/mlx4.conf を編集して、カードがプラグインされている Ethernet スイッチ上の no-drop サービスにどのパケット優先度を設定するかをドライバーに指示します。
(InfiniBand インストールで通常はインストールされる RDMA パッケージに加えて) これらのドライバーパッケージがインストールされれば、ユーザーは通常の RDMA アプリケーションの大半を利用して、アダプターで RDMA プロトコル通信が行われていることをテスト、確認できます。ただし、Red Hat Enterprise Linux 7 に含まれているすべてのプログラムが適切に iWARP や RoCE/IBoE デバイスをサポートするわけではありません。これは特に、iWARP 上の接続確立プロトコルが実際の InfiniBand リンク層接続とは異なるためです。問題のプログラムが librdmacm 接続管理ライブラリーを使用している場合、iWARP と InfiniBand の違いは表示されずに処理され、プログラムは機能します。アプリケーションが独自の接続管理を実行しようとすると、iWARP を明確にサポートする必要があり、これが行われない場合は機能しません。