jVerbs の共通問題 (Linux のみ)

jVerbs インターフェースを使用して、 InfiniBandなどの高速ネットワーク・インフラストラクチャーを使用する Java™ アプリケーションを開発します。 jVerbs インターフェースを使用しているときは、以下の問題が発生する場合があります。

注: サービス・リフレッシュ 8 フィックスパック 30 の変更点の始まり以前非推奨であった RDMA 実装は、 IBM® SDK, Java Technology Edition, Version 8 から削除された。サービスリフレッシュ8 フィックスパック30の変更終了について

接続の試行中に接続イベント RDMA_CM_EVENT_REJECTED が生成される

このイベントは、実行されているサーバーがない場合、またはサーバーが他の処理中でビジーになっている場合に、クライアント側で生成されます。

この問題を回避するには、対象とするポート上でサーバーが確実に実行されているようにしてください。 また、障害が発生したら接続を再試行するように、アプリケーションを記述することも必要です。

命令コードIBV_WC_WR_FLUSH_ERRのキュー・ペア・エラー

送信と受信のバッファー・サイズが一致しない場合に、送信要求または受信要求で、リカバリーできないキュー・ペアのエラーが発生することがあります。 この問題を回避するために、通信プロセスにステップを追加することができます。

この問題は、受信バッファーのサイズが送信バッファーのサイズと一致しない場合に発生することがあります。 送信操作は、受信側と送信側のIBV_WC_REM_INV_REQ_ERR操作コードIBV_WC_LOC_LEN_ERRで失敗します。 このようなエラーにより、キューペアはエラー状態に移行し、さらにリクエストを送信または受信すると、オペコードIBV_WC_WR_FLUSH_ERRが生成されます。 このキュー・ペアはリカバリーできません。

この問題を回避するには、ポストされた受信バッファーの長さが、送信要求を保持できるだけの長さになるようにします。 長さが分からない場合は、送信前に必要な長さを伝えるようアプリケーションのプログラムを作成できます。 その一方で、受信できる適切なサイズを設定してバッファーを準備することができます。

命令コード IBV_WC_RETRY_EXC_ERR とともに作業完了イベントを受信する

クライアントまたはサーバーが、ポストされた要求 (送信または受信) に応答しませんでした。

一般に、この問題は、一方が送信要求を完了したものの、受信バッファーがまだポストされていない場合に発生します。 この状態では、送信側はこの作業完了イベントを受け取ります。

この問題を回避するには、データを送信する前に、データが受信されるようにバッファーを確実にポストするようにしてください。 データを複数回送信する場合は、すべての並列送信要求を保持できるだけのバッファーを受信側がポストしていることを確認してください。

ネイティブ OutOfMemory 例外が発生する

jVerbs インターフェースは、ダイレクト・バイト・バッファーを使用してデータを転送します。内部的には、ステートフル verbs メソッド操作のため、および複雑なデータ構造をネイティブ・コードに渡すためにダイレクト・バイト・バッファーを使用します。 したがって、ご使用のアプリケーションのメモリー要件をコンピューターが満たしていないと、ネイティブ OutOfMemory 例外を受け取る可能性があります。

この問題を回避するためには、以下のいずれかの解決策が役立つことがあります。
  • DBB.cleaner().clean() メソッドを使用することにより、ガーベッジ・コレクションの対象として使用済みバッファーにマークを付けます。
  • バッファーが使用されなくなったら、まだ完了していないポストなどによって再利用することを検討します。
  • -XX:MaxDirectMemorySize=<size>コマンド・ラインオプションを使用して、メモリ割り当てが指定されたサイズに達したときにガベージコレクションをトリガーします。
  • ステートフル verbs メソッドを 1 回作成した後、パラメーターが同じであれば、そのメソッドを何回も呼び出します。 メソッドを呼び出した後、割り振られたメモリーにガーベッジ・コレクションの対象としてマークを付けるために StatefulVerbMethod オブジェクトの free() メソッドを使用します。

メモリー破損

メモリー破損が発生する可能性があるのは、バッファーが異なる操作のために使用されると同時に、そのバッファーを使用してリモート読み取り、書き込み、または受信が進行中である場合です。

バッファーを再利用する前に、そのバッファーに対してポストされた操作の完了イベントを受信したことを確認してください。

getConnectionEvent(-1) メソッドまたは getCompletionEvent(-1) メソッドが永続的にブロックする

タイムアウトがないことを示す -1 をパラメーターとして getConnectionEvent(int timeout) または getCompletionEvent(int timeout) イベント・メソッドに渡すと、これらのメソッドは、イベントを待機しているチャネルが破棄されても、永続的にブロックします。

この問題は、基礎となる OFED 実装環境に関する既知の問題です。 この問題を回避するには、イベントを受信することが分かっている場合にのみ、-1 パラメーターを指定してこれらのメソッドを使用してください。 あるいは、タイムアウト値を指定するか、pollCQEvent() メソッドを使用します。