RDMAプロトコルとは何ですか?
RDMAプロトコルでは、あるサーバーのメモリ位置から別のサーバーのメモリ位置へデータを交換するために、以下の大まかな手順が実行されます:
1. 接続の確立
– 2つのデバイスが、RDMA対応ハードウェア(例:RDMAをサポートするNIC)を使用して接続を確立します。
– 両方のデバイスがキューペア(送信キュー、受信キュー、完了キュー)を作成します。
2. メモリの登録
– 送信側および受信側のデバイスは、RDMAハードウェアに対してメモリ領域を登録します。
– 登録されたメモリ領域は「ピン留め」されるため、RDMA操作中はOSによって移動やスワップが行われることはありません。
3. メモリキーの交換
– デバイス間で、登録されたメモリ領域への直接アクセスを可能にするメモリキー(リモートメモリアドレスやアクセス権限など)が交換される。
4. データ転送
– 一方のデバイスが、両端のCPUを経由せずに、リモートデバイスのメモリから直接読み込み、または書き込みを行います。
– 中間バッファやカーネルのコンテキストスイッチが介在しないため、転送時の遅延は最小限に抑えられます。
5. 完了通知
– RDMAハードウェアは、操作が完了した際にアプリケーションに通知し、信頼性と一貫性を確保します。
6. 接続の切断
– データ交換が完了すると、RDMA接続が閉じられ、メモリ領域の登録が解除されます。
2つのデバイス間で交換されるさまざまな種類のパケットは、ベース・トランスポート・ヘッダー(BTH)にエンコードされます。データ交換については上記の4番目の項目で説明されているため、この点がパフォーマンステストにおいて特に重要となります。 データの交換は、IPv4またはIPv6のいずれかで行われ、信頼性のある接続(RC)、信頼性のあるデータグラム(RD)、信頼性のない接続(UC)、信頼性のないデータグラム(UD)の形式をとることができます。さらに、すべてのデータ交換は、SEND FIRSTフレーム、複数のSEND MIDDLEフレーム、およびSEND LASTフレームで構成されます。
これは、RC SEND 操作の場合について、以下の図 2 に示されています。また、この図では、BTH オペコードが 3 種類の RC SEND フレームをどのように符号化しているかも示されています。