2016-06-30 14 views
0

仲間のRDMAハッカーは、いつでも__ibv_get_cq_event()を呼び出すrdma_get_recv_comp()がタイムアウトしたことを知っていますか?rdma_get_recv_comp()または__ibv_get_cq_event()でスタックされないようにするにはどうすればいいですか?

私の問題は、ここに示すように、同じプログラムである: RDMA program randomly hangs

それは正常に動作しますが、それはランダムなクライアントが切断に対して堅牢ではありません。具体的には、強制的にクライアントを強制終了すると、サーバはrdma_get_recv_comp()/ ipv_get_cq_event()にスタックされます。

これはMellanox ConnectX-3のためのもので、デフォルトタイムアウトが2.14秒で再試行= 1であることを確認しました。しかし、ブロックモードのibv_get_cq_event()がタイムアウトになるかどうかはわかりません。 ibv_modify_qp()ドキュメントのタイムアウトの説明は、送信側だけがACKを待つので、タイムアウトは送信側(rdma_get_send_comp())にのみ適用されることを示唆しているようです。しかし、受信者にタイムアウトを許可することには何の問題もありません。

この場合、rdma_get_recv_comp()の内側にぶら下がっていると思われる場合、どのように回避したり、タイムアウトを実装したりできますか?

いくつかの可能性:よう

  1. 変更私のクライアントのシャットダウンシーケンスは、それがぶら下がって、サーバー上のrdma_get_recv_compを()残していないように、必要に応じて、送信するすべての実行しますか?

  2. 受ける補完

答えて

2

ibv_get_cq_event()ためのポーリングがタイムアウトしないことをループで)(rdma_get_recv_compを交換してください。完了イベント(作業要求が完了して完了キューエントリを生成したときに生成される)を待ちます。イベントが生成されない場合、受信が完了しなかったとしたら、あなたは永遠に待つでしょう。 QP(接続)がエラー状態に移行すると、ポストされたすべての受信はフラッシュ状態で完了しますが、すべての完了をポーリングする前にQPを破棄すると、それらはCQから削除されます。

クライアントが切断すると、相手側が必ず切断を検出するとは限りません。たとえば、クライアントがリブートしただけでRDMA CMが正常に切断されず、飛行中のセンドはありません。切断されたことに気付かないでしょう。何らかのキープアライブで対処することができます.0バイトのRDMA WRITEはNOPであるため、これにはうまくいきますが、接続に問題があれば失敗します。

また、サーバーがRDMA CMから切断通知を受け取ったときにQPを破棄することができない可能性があります。 QPを破壊する前に待つことをすべて待つように、接続構造に参照カウントを設定したいとします。

最後に、ibv_get_cq_event()をノンブロッキングで使用することができます。マンページには、基礎となる完了チャンネルファイル記述子にpoll()を使用して、タイムアウトのイベントを待機する例があります。

関連する問題