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

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

InfiniBand とは、2 つの全く異なることを指します。1 つ目は、InfiniBand ネットワーク用の物理的リンク層プロトコルです。2 つ目は、InfiniBand Verbs API と呼ばれる高レベルのプログラミング API です。InfiniBand Verbs API は、remote direct memory access (RDMA) テクノロジーの実装になります。
RDMA は、いずれのコンピューターのオペレーティングシステムを呼び出さずに、あるコンピューターのメモリーから、別のコンピューターのメモリーへの直接アクセスします。この技術により、CPU の使用量が低いまま、スループットが高く、レイテンシーが低いネットワークが可能になります。これは、並行のコンピューターのクラスターが大量にある場合に特に役に立ちます。
通常の IP データ送信では、マシン A 上のアプリケーション X が、マシン B 上のアプリケーション Y にデータを送信します。この送信時に、マシン B 上のカーネルが最初にデータを受信し、パケットヘッダーを解読し、データがアプリケーション Y に属することを確認し、アプリケーション Y を起動し、アプリケーション Y がカーネルへのシステムコールの読み込みを実行するのを待ちます。そして、カーネルは、カーネルにある内部メモリー領域から、アプリケーション Y が提供するバッファーに、手動でデータをコピーする必要があります。つまり、このプロセスでは、ほとんどのネットワークトラフィックは、システムのメインメモリーバスで、コピーが少なくとも 2 回 (ホストアダプターが DMA を使用して、カーネルが提供するメモリーバッファーにデータをコピーし、カーネルが、アプリケーションのメモリーバッファーにデータをコピーする) 行われます。また、このプロセスでは、コンピューターが、カーネルコンテキストとアプリケーション Y のコンテキストを切り替えるため、コンテキストを何度も切り替える必要があります。このため、ネットワークトラフィックが高速で流れている場合は、システムにかかる CPU 負荷が非常に高くなり、その他のタスクが遅くなる可能性があります。
RDMA 接続は、通常の IP 接続とは異なります。通信プロセスでのカーネルの介入が回避され、その過程でネットワーク接続の処理に通常必要な 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 以外のハードウェアで使用できるようにする追加技術もあります。
  • Internet Wide Area RDMA Protocol (iWARP)
    iWARP は、インターネットプロトコル (IP) ネットワークでの効果的なデータ転送に対してリモートダイレクトメモリーアクセス (RDMA) を実装するコンピューターのネットワークプロトコルです。
  • RoCE (RDMA over Converged Ethernet) プロトコル (後に IBoE (InfiniBand over Ethernet) に名前が変更)
    RoCE は、イーサネットネットワークでリモートダイレクトメモリーアクセス (RDMA) を許可するネットワークプロトコルです。

前提条件

iWARP と RoCE の技術は、ともに通常の IP ネットワークリンク層を基盤技術としており、その設定の大半は3章IP ネットワークの設定で説明しています。ほとんどの場合、IP ネットワーク機能が適切に設定され、対象ハードウェアの適切なドライバーがインストールされていれば、RDMA 機能はすべて自動で現れます。カーネルドライバーは、常に Red Hat が提供する各カーネルに含まれていますが、マシンのインストール時に InfiniBand パッケージグループが選択されなかった場合は、ユーザー領域ドライバーを手動でインストールする必要があります。
Red Hat Enterprise Linux 7.4 以降、すべての RDMA ユーザー領域ドライバーは rdma-core パッケージに統合されました。サポートされる iWARP、RoCE、または InfiniBand ユーザー領域ドライバーをすべてインストールする場合は、root で以下のコマンドを実行します。
~]# yum install libibverbs
Priority Flow Control (PFC) および mlx4 ベースのカードを使用している場合は、/etc/modprobe.d/mlx4.conf を編集して、そのカードがプラグインしたイーサネットスイッチ上の no-drop サービスに設定するパケットの優先順位をドライバーに指示し、修正したファイルを追加するために initramfs を再構築します。新しい mlx5 ベースのカードは、スイッチと PFC 設定を自動ネゴシエートし、no-drop 優先度を通知するモジュールオプションは必要としません。
Mellanox カードを設定して、イーサネットモードでポートのいずれかまたは両方を使用するには、「Mellanox カードのイーサネット用の設定」を参照してください。
(InfiniBand インストールで通常はインストールされる RDMA パッケージに加えて) これらのドライバーパッケージがインストールされれば、ユーザーは通常の RDMA アプリケーションの大半を利用して、アダプターで RDMA プロトコル通信が行われていることをテスト、確認できます。ただし、Red Hat Enterprise Linux 7 に含まれているすべてのプログラムが適切に iWARP や RoCE/IBoE デバイスをサポートするわけではありません。これは特に、iWARP 上の接続確立プロトコルが実際の InfiniBand リンク層接続とは異なるためです。問題のプログラムが librdmacm 接続管理ライブラリーを使用している場合、iWARP と InfiniBand の違いは表示されずに処理され、プログラムは機能します。アプリケーションが独自の接続管理を実行しようとすると、iWARP を明確にサポートする必要があり、これが行われない場合は機能しません。