最近、Linuxクラスターコンピューティングノードの1つでwatch -n 1 ipconfig
を実行し、48プロセスのMPI実行、複数のノードに分散しました。奇妙なことに、イーサネットパケットは正しくカウントされると(SSHセッションのために数kb/s)、IBアダプターはアイドル状態のままであるように見えます(RX/TXパケットとバイトに変更はありません)。
MPI over IBは間違いなくクラスターで機能しています(いくつかのチェックを行いましたが、そうでない場合はとにかく人々は気づいたでしょう)。さらに奇妙なことに、別のノードからInfiniBand-HCAにpingを実行すると、突然パケットがカウントされます。
確かに、IBに関する私の知識は非常に限られていますが、InfiniBandのパフォーマンスを向上させるための重要な側面の1つは、ハードウェアに直接実装することによって(カーネル)ネットワークスタックをバイパスすることによるものであることを知っています(またはそう思った-訂正してください私が間違っている場合!)。
私の説明では、パケットがカーネルに到達しないため、それぞれのレイヤーで情報が欠落しているため、カーネルがトラフィックを適切に傍受できないということです-これは合理的に聞こえますか?ただし、ICMPの場合に何が起こっているのかわかりません。たぶん、IPoIBを介して送信されたデータは、パケットカウントのそれぞれのカーネルルーチンをトリガーしますが、「IBネイティブ」プロトコル(動詞、RDMA)はトリガーしませんか?
残念ながら、私はインターネットでその問題に関する情報を見つけることができませんでした。
あなたはあなたの仮定に正しいです。 InfinibandでMPI)を実行する場合、通常はネットワークスタックをバイパスし、RDMA/Verbsインターフェイスを使用して完全なパフォーマンスを実現します。このインターフェイスを介して送信されるすべての通信は、IPoIBインターフェイスでは考慮されませんib0
例.
Infinibandカードが実行しているトラフィックを監視するには、/sys/class/infiniband/mlx4_0/ports/1/counters/
でカウンターを確認できます。残念ながら、これらはInfinibandですぐにいっぱいになる32ビットカウンターしかないため、64ビットカウンターを使用してファブリック内のパフォーマンスカウンターを収集できるperfquery
をインストールする必要があります。
ノード上でローカルにperfquery
を使用して単純なクエリを実行し、64ビットカウンターを取得するには、次のようにコマンドを発行できます。
perfquery -x
削除InfinibandデバイスのLIDを追加して、リモートマシンのパフォーマンスカウンターを取得することもできます。
perfquery -x -a 2
ここで、-a
はLID2のすべてのポートを示します。
PortXmitData
とPortRcvData
はレーン番号ごとであり、実際のバイト数を取得するには、通常は4を掛ける必要があることに注意してください。 -r
を追加して、カウンターをperfquery
にリセットすることもできます。これにより、1秒あたりの数値を簡単に計算できます。