verbs インターフェースを使用してクライアントとサーバーの通信を実装 (Linux のみ)
verbs インターフェースを使用するアプリケーションを開発するには、サーバーとクライアントの間のリモート・ダイレクト・メモリー・アクセス (RDMA) 接続で使用される成果物を作成するために、一連のステップが必要とされます。 接続のクライアント・サイドとサーバー・サイドの両方のプロセスについて開発者をガイドするために、例を示します。
注:
以前非推奨であった RDMA 実装は、 IBM® SDK, Java™ Technology Edition, Version 8 から削除されました。


verbs API を使用すると、RDMA リソースがどのように作成されて使用されるかを制御することができます。 開発作業を開始する前に、Java アプリケーションの RDMA 通信、およびクライアントとサーバーの環境についてよく理解しておく必要があります。 以下のタイプの RDMA リソースが必要です。
- 保護ドメイン
- 接続 ID
- キュー・ペア
- 完了キュー
以下の図は、verbs API を使用するクライアントとサーバーの実装例を示しています。 クライアントとサーバーの両方のプロセスに共通する特定のステップについては、後出の図で詳しく説明しています。 これらの通信フローで使用される用語の詳細については、jVerbsプログラミング用語と成果物(Linuxのみ)を参照してください。

以下の図は、RDMA 構造を割り振る際に必要なプログラミング・ステップを詳しく説明しています。 この手順は、最初の図に「RDMA構造の割り当て」というラベルの付いた単一のステップとして示されています。この手順には番号1が付いています。

以下の図は、RDMA 構造を削除する際に必要なプログラミング・ステップを詳しく説明しています。 この手順は、最初の図に「割り当てられた構造を破棄する」というラベルの付いた単一のステップとして示されています。この手順には、番号2が付いています。

以下のセクションでは、図に示されたサーバーとクライアントの通信フローについて説明します。
サーバー・フロー
以下のイベントは、RDMA 接続のサーバー・サイドで発生します。
- イベント・チャネルが作成されます。
- 接続 ID が作成されて、イベント・チャネルとの関連付けが行われます。 任意の数の接続 ID をイベント・チャネルに関連付けることができます。
- サーバーが、クライアントからの接続要求を listen します。
- クライアントの接続要求を受信すると、要求について確認応答を送信します。 請求用イベント・タイプは
RDMA_CM_EVENT_CONNECT_REQUEST
です。 - クライアントから受信した各要求について、以下のステップが行われます。
- サーバーがクライアントの接続 ID を取得します。
- サーバーとクライアント間の接続が確立される前に、必要な RDMA 構造が割り振られます。 RDMA 構造を作成するためには、以下のステップが実行される必要があります。
- デバイスのコンテキストが取得されます。これは、デバイス、ポート、またはグローバル固有 ID (GUID) を照会するために使用できます。
- 保護ドメインが割り振られます。
- 完了イベントをポストするために完了チャネルが作成されます。
- 完了キューが作成されます。
- 完了キュー通知の作業要求が行われます。
- キュー・ペアが作成されます。
- データ転送用に、ダイレクト・バイト・バッファーが割り振られて登録されます。
- オプションで、完了キュー処理スレッドを開始することができます。 発生するイベントについて詳しくは、 完了キューの処理を参照してください。
- RDMA 構造の準備ができると、受信作業要求がサーバーによりポストされます。
- 作業要求が受け入れられると、接続が確立されたこと、および RDMA 送信要求または受信要求を受信する準備ができたことを確認するイベントが、クライアントに送信されます。 イベント・タイプは
RDMA_CM_EVENT_ESTABLISHED
です。 - 送信要求または受信要求がポストされます。これにより、サーバー・システムとクライアント・システム間のデータ転送が開始されます。
- 作業要求が完了すると、接続は切断されます。 イベント・タイプ
RDMA_CM_EVENT_DISCONNECTED
がサーバーに生成されます。 - データ転送用に作成された RDMA 構造は、以下の順序で削除されます。
- バッファーが、クリーンアップされて登録抹消されます。
- 完了キューが削除されます。
- 完了チャネルが削除されます。
- キュー・ペアが削除されます。
- クライアント・システムとの、これ以降の RDMA 操作からサーバーを切り離すために、接続 ID が削除されます。
- イベント・チャネルが削除されます。 イベント・チャネルは、すべての確認応答が受信されるまで削除することができません。
クライアント・フロー
以下のイベントは、RDMA 接続のクライアント・サイドで発生します。
- イベント・チャネルが作成されます。
- 接続 ID が作成されて、イベント・チャネルとの関連付けが行われます。 任意の数の接続 ID をイベント・チャネルに関連付けることができます。
- クライアントが、ConnectionID.ResolveAddress() メソッドを使用して、サーバー・システムのアドレスを照会します。 イベント・タイプ
RDMA_CM_EVENT_ADDRESS_RESOLVED
を受信すると、クライアントは確認応答を送信します。 - クライアントが、ConnectionID.ResolveRoute() メソッドを使用して、サーバー・システムの経路を照会します。 イベント・タイプ
RDMA_CM_EVENT_ROUTE_RESOLVED
を受信すると、クライアントは確認応答を送信します。 - クライアントとサーバー間の接続が確立される前に、必要な RDMA 構造が割り振られます。 RDMA 構造を作成するためには、以下のステップが実行される必要があります。
- デバイスのコンテキストが取得されます。これは、デバイス、ポート、またはグローバル固有 ID (GUID) を照会するために使用できます。
- 保護ドメインが割り振られます。
- 完了イベントをポストするために完了チャネルが作成されます。
- 完了キューが作成されます。
- 完了キュー通知の作業要求が行われます。
- キュー・ペアが作成されます。
- データ転送用に、ダイレクト・バイト・バッファーが割り振られて登録されます。
- オプションで、完了キュー処理スレッドを開始することができます。 発生するイベントについて詳しくは、 完了キューの処理を参照してください。
- 受信要求のポストがサーバーに対して行われます。
- 接続要求がサーバーに対して行われます。 イベント・タイプ
RDMA_CM_CONNECT_REQUEST
が生成され、サーバーに送信されます。 - クライアントは、サーバーからイベント・タイプ
RDMA_CM_EVENT_ESTABLISHED
を受信するまで待機します。 このイベントは、接続が確立されたこと、およびデータ転送を行う準備ができたことを示します。 - 送信作業要求または受信作業要求がポストされます。これにより、サーバーとクライアント・システム間のデータ転送が開始されます。
- 作業要求が完了すると、接続は切断されます。 イベント・タイプ
RDMA_CM_EVENT_DISCONNECTED
は、クライアントに生成されます。 - データ転送用に作成された RDMA 構造は、以下の順序で削除されます。
- バッファーが、クリーンアップされて登録抹消されます。
- 完了キューが削除されます。
- 完了チャネルが削除されます。
- キュー・ペアが削除されます。
- サーバーとの、これ以降の RDMA 操作からクライアントを切り離すために、接続 ID が削除されます。
- イベント・チャネルが削除されます。
完了キュー処理
以下の図は、オプションで完了キューを処理する際に必要なプログラミング・ステップを詳しく説明しています。 このプロセスは、最初の図で「完了キュー処理」のラベルの付いた単一ステップとして表示されており、3 の番号が付いています。

この図には、以下のステップが示されています。
- クライアントまたはサーバーが、getCQEvent() メソッドおよび pollCQEvent() メソッドを使用して、イベント・キュー・チャネルから
RDMA_CM_EVENT ESTABLISHED
タイプのイベントを取り出します。このイベントが処理のトリガーとなります。 - 作業完了が処理されます。
- 作業完了を確認するために確認応答が完了キューに送信されます。
- 完了キューが確認応答を受信したことを確認するために、完了キュー通知の要求が行われます。