InfinibandをEther感覚で使い始めた人が泣かないためのLinuxでInfinibandを扱うナレッジです。
MellanoxがもともとRHELベースのシステムで使うことをメインにしているため、Debianで使おうとすると詳細なドキュメントがあるMellanox OFEDが使えず割と地獄を見たので備忘録です。
コンテンツ
Linuxで使うためのIBハードウェア選定
使うハードウェアは新しければ新しいほど良いとは思いますが、NFSoRDMA/SRPなどのストレージとして使うのであればConnectX-3あたりで十分です。
また、速度もFDRやEDRが使えるに越したことはありませんが、現実問題としてはQDRあれば十分です。
QDRの40Gbpsで10b8b税を払うと実効で32Gbpsとなり、IBのポート1つあたりPCIE3.0x4のNVMeの速度を得られることになります。
PCIE3.0x8の理論値が64Gbpsなので、QDR2ポートになると80Gbpsとなり帯域に対して80%と若干足りなくなりますが、RDMAとマルチパスが正しく使えればQDRでも実測51Gbpsくらい出ます。
PCIE x16スロットを使うことを前提とするならConnect-IBのOEMであるIBMのEC33というHCAがお得です。(2025/09現在)
ConnectX3でもFDRなものを揃えられれば、FDRからエンコードが10b8bから64b66bになりオーバーヘッドが20%から約3%となるので、1ポートあたり理論値32Gbpsから52Gbpsとなり向上幅は多いです。
ただし、FDRでリンクするにはケーブル自体にFDR対応というEEPROMが入ったケーブルが必要になるので、このケーブルの本数を揃えるのが地味にコストになります。
QDRで我慢するなら、たまに投げ売られているSASケーブルとしてのQSFPケーブルが使えるので、大幅にコストを抑えることができる可能性があります。
こちらの環境では、かなり昔にebayで捨て値で買った44本入りのX6559-R6をいまだに使っています。
5mという長さとケーブルの太さに若干後悔しているものの、利用上は特に問題は起きていません。(ケーブリングの問題は起きている)
流石にConnectX-2はPCIE2.0(QDR1ポート分でPCIE2.0x8と同等)と規格が古すぎるのでおすすめしませんが、Linuxでは未だに動くので、めちゃくちゃ安ければ1対1で繋いで検証するためのスターターキットとして使うことは可能だと思います。
ホントにおすすめしませんが、Infinihostという古代のHCAでもなんとLinuxでは未だに動くので、廃棄物の中にあるのを見つけたら試してみてもいいかもしれません。CX4ケーブルの入手性が問題になりますが…。
CPUなどについては、ストレージホストとして使う場合、RDMAの効果でCPUはそこまで使わないので、電力効率を考えなければXeon E3-v2やコア数が少なくてもクロックの高いXeon E5-v2あたりでも十分な速度が出ます。
どちらかというとPCIE3.0以上のレーン数をどれだけ持っているかと、aryncの場合バッファとして吸収できるメモリをどれだけ使えるか、という方が効いてくるので、メモリマシマシなXeon E5 v4か初代XeonSPあたりが安くていいでしょうか。
使い方にもよりますが、特にQD1の細かいIOが発生するとNFSの処理が1コアに偏るので少コア高クロックなCPUのほうがおすすめです。こちらの環境では256GBメモリを積んだXeon W-2225がメインのストレージマシンとして動いています。
どれだけ予算を組むかによりますが、自宅ラボでPVEでInfiniband+NFSoRDMAを使う というような用途をメインとする場合、中古市場で総合的に安くて不自由ないものとしてはだいたい以下のものになると思います。(2025/09時点)
Xeon E5 v4世代のおすすめ
Intel® Xeon® Processor E5-1630 v4 ( 4c 4.00 GHz)
Intel® Xeon® Processor E5-2643 v4 (6c 3.70 GHz )
Xeon SP 第一世代のおすすめ
Intel® Xeon® Gold 6144 Processor (8c 4.20 GHz )
Intel® Xeon® Gold 6128 Processor (6c 3.70 GHz )
Xeon SP 第二世代のおすすめ
Intel® Xeon® Gold 5222 Processor (4c 3.9GHz)
Intel® Xeon® Gold 6250 Processor (8c 3.9GHz)
ただし、第2世代自体中古市場であまり見ない/謎に高い傾向にあるためそこまでおすすめしません。
Epyc
第一世代以外の高クロックなやつ
追記:
今更ながらFDR環境ができたので色々試してみましたが、ブロックサイズが1Mとか大きいものであればXeon v4世代(2643v4)でもNFSoRDMAで100Gb出ることは確認しました。
ただ、QD1のIOPSに関してはやはりクロックとCPUの世代に比例するので、シングルスレッドが速いプロセッサがおすすめであることには変わりありません。
IBスイッチ
IBスイッチについては何でもいい/検証のための最小構成であれば直結でいいと思いますが、二束三文で手に入ることと消費電力が低いことからSX6025あたりが良いかと思います。
6025はSMを持っていない、いわゆるノンインテリハブに属するスイッチなのでIBにつながったホストの何処かでSMを動かす必要がありますが、IBファブリック上で高度なことをしないのであれば十分です。(むしろホームラボで遊ぶ分にはIB上で高度な管理機能が必要になるユースケースがないです。自分の知識不足もありますが。)
消費電力については、6025はパッシブケーブルを使いFDRで4ポートフルロードかけても50Wいかないくらいなので、帯域に対しての消費電力で言うとかなり効率が良いです。
DebianでIBを使う上で必要な/あると便利なツール
IBファブリック上にSMがいない場合は最低限どこかにSMが必要なので opensm が必須になります。
また、 ibstatや iblinkinfo などもあると便利なので infiniband-diags も最低限1ホストにいれることを推奨します。
opensmやiblinkinfoを使う場合、 ib_umad や ib_uverbs というカーネルドライバも必要になるので、読み込むようにしておきます。
IBをip通信に使いたい場合には ib_ipoib も必要になります。
とりあえずこの辺がないと始まらないので入れておきます。
root@dev:~# apt-get install opensm infiniband-diags root@dev:~# for m in ib_umad ib_uverbs ib_ipoib ; do modprobe $m ; echo $m >> /etc/modules ; done
SubnetManager (SM)について
SubnetManager(SM)はInfinibandを接続するファブリックの中に1インスタンスは必要になるものです。
SMはファブリックにどのようなスイッチが存在するか、そのスイッチはどのような構成か、そこに接続されるものは何か、という情報を管理します。
EtherでいうスイッチのMACアドレスを学習するFDBのようなものです。どのポートに何が刺さっているという管理がないと通信ができません。
SMはスイッチに内蔵されているものもありますが、LinuxであればOpenSMを入れることにより同様の機能を持てるので、ストレージ等のバックエンドとしてIBを使うのであれば非管理型のスイッチで問題ありません。
ちなみに管理型のスイッチだとサブネットの分割などができますが、EtherでいうポートベースVLANやSANでいうゾーニングがメインで、IBにタグVLAN的な機能はないです。
また、すでにサブネット上にSMがいる場合は、ドキュメント上ではスタンバイになる…らしいのですが、実際に使っていると「あと勝ちの原理」であとに起動したホストで優先的に起動され、それまで動いていたホストではSMが終了して二重起動しないような制御が入っているようにみえます。
この原理を利用して、SMが動いているホストを再起動したい場合は他のホストでSMを起動してSMのマスターを奪う運用をしています。
なお、今まで動いていた環境からSMがいなくなった場合、直ちに通信ができなくなるということはありませんが、次にケーブルを抜き差ししたときや新しいホストがスイッチに接続してきたときにリンクがアクティブになりません。
ibstatを実行したときにポートのステータスがActiveにならずPollingのままとなります。
SMの仕事内容を確認するにはiblinkinfoや ibnetdiscover コマンドでそれらの情報を確認できます。
root@dev:~# iblinkinfo
CA: MT4113 ConnectIB Mellanox Technologies:
0x5849560e6a1a0201 6 1[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 36[ ] "Mellanox 4036 # 4036-62B4" ( )
0x5849560e6a1a0209 5 2[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 18[ ] "Mellanox 4036 # 4036-62B4" ( )
CA: MT4113 ConnectIB Mellanox Technologies:
0x70106fffff9e2490 15 1[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 6[ ] "Mellanox 4036 # 4036-62B4" ( )
0x70106fffff9e2498 16 2[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 4[ ] "Mellanox 4036 # 4036-62B4" ( )
CA: MT25408 ConnectX Mellanox Technologies:
0x0010e00001488379 7 1[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 24[ ] "Mellanox 4036 # 4036-62B4" ( )
0x0010e0000148837a 8 2[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 2[ ] "Mellanox 4036 # 4036-62B4" ( )
Switch: 0x0008f105002062b4 Mellanox 4036 # 4036-62B4:
10 1[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 2 2[ ] "MT25408 ConnectX Mellanox Technologies" ( )
10 2[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 8 2[ ] "MT25408 ConnectX Mellanox Technologies" ( )
10 3[ ] ==( Down/ Polling)==> [ ] "" ( )
10 4[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 16 2[ ] "MT4113 ConnectIB Mellanox Technologies" ( )
10 5[ ] ==( Down/ Polling)==> [ ] "" ( )
10 6[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 15 1[ ] "MT4113 ConnectIB Mellanox Technologies" ( )
10 7[ ] ==( Down/ Polling)==> [ ] "" ( )
10 8[ ] ==( Down/ Polling)==> [ ] "" ( )
10 9[ ] ==( Down/ Polling)==> [ ] "" ( )
10 10[ ] ==( Down/ Polling)==> [ ] "" ( )
10 11[ ] ==( Down/ Polling)==> [ ] "" ( )
10 12[ ] ==( Down/ Polling)==> [ ] "" ( )
10 13[ ] ==( Down/ Polling)==> [ ] "" ( )
10 14[ ] ==( Down/ Polling)==> [ ] "" ( )
10 15[ ] ==( Down/ Polling)==> [ ] "" ( )
10 16[ ] ==( Down/ Polling)==> [ ] "" ( )
10 17[ ] ==( Down/ Polling)==> [ ] "" ( )
10 18[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 5 2[ ] "MT4113 ConnectIB Mellanox Technologies" ( )
10 19[ ] ==( Down/ Polling)==> [ ] "" ( )
10 20[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 1 1[ ] "MT25408 ConnectX Mellanox Technologies" ( )
10 21[ ] ==( Down/ Polling)==> [ ] "" ( )
10 22[ ] ==( Down/ Polling)==> [ ] "" ( )
10 23[ ] ==( Down/ Polling)==> [ ] "" ( )
10 24[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 7 1[ ] "MT25408 ConnectX Mellanox Technologies" ( )
10 25[ ] ==( Down/ Polling)==> [ ] "" ( )
10 26[ ] ==( Down/ Polling)==> [ ] "" ( )
10 27[ ] ==( Down/ Polling)==> [ ] "" ( )
10 28[ ] ==( Down/ Polling)==> [ ] "" ( )
10 29[ ] ==( Down/ Polling)==> [ ] "" ( )
10 30[ ] ==( Down/ Polling)==> [ ] "" ( )
10 31[ ] ==( Down/ Polling)==> [ ] "" ( )
10 32[ ] ==( Down/ Polling)==> [ ] "" ( )
10 33[ ] ==( Down/ Polling)==> [ ] "" ( )
10 34[ ] ==( Down/ Polling)==> [ ] "" ( )
10 35[ ] ==( Down/ Polling)==> [ ] "" ( )
10 36[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 6 1[ ] "MT4113 ConnectIB Mellanox Technologies" ( )
CA: MT25408 ConnectX Mellanox Technologies:
0x0010e00001746591 1 1[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 20[ ] "Mellanox 4036 # 4036-62B4" ( )
0x0010e00001746592 2 2[ ] ==( 4X 10.0 Gbps Active/ LinkUp)==> 10 1[ ] "Mellanox 4036 # 4036-62B4" ( )
root@dev:~# ibnetdiscover
#
# Topology file: generated on Fri Sep 5 21:11:13 2025
#
# Initiated from node 0010e00001746590 port 0010e00001746591
vendid=0x8f1
devid=0x5a5a
sysimgguid=0x8f105002062b5
switchguid=0x8f105002062b4(8f105002062b4)
Switch 36 "S-0008f105002062b4" # "Mellanox 4036 # 4036-62B4" enhanced port 0 lid 10 lmc 0
[1] "H-0010e00001746590"[2](10e00001746592) # "MT25408 ConnectX Mellanox Technologies" lid 2 4xQDR
[2] "H-0010e00001488378"[2](10e0000148837a) # "MT25408 ConnectX Mellanox Technologies" lid 8 4xQDR
[4] "H-70106fffff9e2490"[2](70106fffff9e2498) # "MT4113 ConnectIB Mellanox Technologies" lid 16 4xQDR
[6] "H-70106fffff9e2490"[1](70106fffff9e2490) # "MT4113 ConnectIB Mellanox Technologies" lid 15 4xQDR
[18] "H-5849560e6a1a0201"[2](5849560e6a1a0209) # "MT4113 ConnectIB Mellanox Technologies" lid 5 4xQDR
[20] "H-0010e00001746590"[1](10e00001746591) # "MT25408 ConnectX Mellanox Technologies" lid 1 4xQDR
[24] "H-0010e00001488378"[1](10e00001488379) # "MT25408 ConnectX Mellanox Technologies" lid 7 4xQDR
[36] "H-5849560e6a1a0201"[1](5849560e6a1a0201) # "MT4113 ConnectIB Mellanox Technologies" lid 6 4xQDR
vendid=0x2c9
devid=0x1011
sysimgguid=0x5849560e6a1a0201
caguid=0x5849560e6a1a0201
Ca 2 "H-5849560e6a1a0201" # "MT4113 ConnectIB Mellanox Technologies"
[1](5849560e6a1a0201) "S-0008f105002062b4"[36] # lid 6 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
[2](5849560e6a1a0209) "S-0008f105002062b4"[18] # lid 5 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
vendid=0x2c9
devid=0x1011
sysimgguid=0x70106fffff9e2490
caguid=0x70106fffff9e2490
Ca 2 "H-70106fffff9e2490" # "MT4113 ConnectIB Mellanox Technologies"
[1](70106fffff9e2490) "S-0008f105002062b4"[6] # lid 15 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
[2](70106fffff9e2498) "S-0008f105002062b4"[4] # lid 16 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
vendid=0x2c9
devid=0x1003
sysimgguid=0x10e0000148837b
caguid=0x10e00001488378
Ca 2 "H-0010e00001488378" # "MT25408 ConnectX Mellanox Technologies"
[1](10e00001488379) "S-0008f105002062b4"[24] # lid 7 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
[2](10e0000148837a) "S-0008f105002062b4"[2] # lid 8 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
vendid=0x2c9
devid=0x1003
sysimgguid=0x10e00001746593
caguid=0x10e00001746590
Ca 2 "H-0010e00001746590" # "MT25408 ConnectX Mellanox Technologies"
[1](10e00001746591) "S-0008f105002062b4"[20] # lid 1 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
[2](10e00001746592) "S-0008f105002062b4"[1] # lid 2 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
IPoIBについて
ib_ipoibモジュールを読み込むと ip lなどでibインターフェースが生えてくるので、IP通信をしたい場合はこのIFに対してIPアドレスを振ることができます。
root@dev:~# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
...
8: ibs15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/infiniband 80:00:02:08:fe:80:00:00:00:00:00:00:00:10:e0:00:01:74:65:91 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
altname ibp3s0
9: ibs15d1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/infiniband 80:00:02:09:fe:80:00:00:00:00:00:00:00:10:e0:00:01:74:65:92 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
altname ibp3s0d1
ただし、EtherではないのでVLANやLACPなどは使えません。チャンネルボンディングをしたい場合はmode1(act/backup)以外は利用できません。
iSERやNFSoRDMAを使う場合は直接のIP通信は行いませんがセッションの管理にIPoIBをつかいます。IPoIB自体は通常利用では10Gbpsくらいしか出ないので、1GbEよりは速いもののあまり期待してはいけません。
また、同じ10Gbpsの通信でも通常の10GbE NICの通信と比べてCPU負荷が高いですが、そういうものです。
LIDとSMID、GUIDについて
perfqueryなどでLIDなどが必要なことが少なからずありますが、これらはInfiniband特有の仕組みなので、Ether感覚で使うとわからずに泣くことになります。
ibstatを実行すると下記のような出力があります。
root@dev:~# ibstat
CA 'mlx4_0'
CA type: MT4099
Number of ports: 2
Firmware version: 2.11.1280
Hardware version: 1
Node GUID: 0x0010e00001746590
System image GUID: 0x0010e00001746593
Port 1:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 1
LMC: 0
SM lid: 1
Capability mask: 0x0251486a
Port GUID: 0x0010e00001746591
Link layer: InfiniBand
Port 2:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 2
LMC: 0
SM lid: 1
Capability mask: 0x0251486a
Port GUID: 0x0010e00001746592
Link layer: InfiniBand
まず、この各ポートにある Base lid というのは、SMが適当に空いてるIDを見つけて割り当てたIDとなり、DHCPで配布されたIPのようなものです。SMによってはもっと大きな値から始まることがありますが、OpenSMは1から始まるようです。
LIDは揮発性のもので、再起動中にIBサブネットに別のホストが参加/脱退すると前回とは別のものが割り当てられる可能性があります。また、シーケンシャルに割り当てられるという保証はありません。
SM lidというのは、SMが起動しているホストが持つLIDです。上記だとLID1でSMが動いているということになり、LID1は自分のポート1が持っているので、つまりSMのマスターはこのホストのポート1で動いていることになります。
他のホストから見てもSMがLID1で動いているということがわかります。このホストではBase LIDに15と16を割り当てられているようです。
root@pve01:~# ibstat
CA 'mlx5_0'
CA type: MT4113
Number of ports: 2
Firmware version: 10.14.1100
Hardware version: 0
Node GUID: 0x70106fffff9e2490
System image GUID: 0x70106fffff9e2490
Port 1:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 15
LMC: 0
SM lid: 1
Capability mask: 0x26516848
Port GUID: 0x70106fffff9e2490
Link layer: InfiniBand
Port 2:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 16
LMC: 0
SM lid: 1
Capability mask: 0x26516848
Port GUID: 0x70106fffff9e2498
Link layer: InfiniBand
GUIDについてはその名前のとおり、サブネット間でユニークなIDとなります。主に ibnetdiscoverをしたときにホストを見分けるときに使います。
sysimgguid は ibnetdiscoverをしたときに複数のHCA(カード)を持っていても一意なものとして識別できます。
Node GUID は ibnetdiscoverをしたときに caguid として表示され、これはポートをまたいでHCA固有のものとなります。 複数のHCAを持つとそれぞれのHCAごとに表示されます。
Port GUIDはその名の通りNICで言うMACアドレスのようなものになります。
root@dev:~# ibstat|grep -i guid
Node GUID: 0x0010e00001746590
System image GUID: 0x0010e00001746593
Port GUID: 0x0010e00001746591
Port GUID: 0x0010e00001746592
root@dev:~# ibnetdiscover |grep 0010e00001746590
# Initiated from node 0010e00001746590 port 0010e00001746591
[1] "H-0010e00001746590"[2](10e00001746592) # "MT25408 ConnectX Mellanox Technologies" lid 2 4xQDR
[20] "H-0010e00001746590"[1](10e00001746591) # "MT25408 ConnectX Mellanox Technologies" lid 1 4xQDR
caguid=0x10e00001746590
Ca 2 "H-0010e00001746590" # "MT25408 ConnectX Mellanox Technologies"
root@dev:~# ibnetdiscover |grep 1746593 -A 4
sysimgguid=0x10e00001746593
caguid=0x10e00001746590
Ca 2 "H-0010e00001746590" # "MT25408 ConnectX Mellanox Technologies"
[1](10e00001746591) "S-0008f105002062b4"[20] # lid 1 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
[2](10e00001746592) "S-0008f105002062b4"[1] # lid 2 lmc 0 "Mellanox 4036 # 4036-62B4" lid 10 4xQDR
上記の出力からわかることは、 Node GUID が 0010e00001746590のHCAはポート1がIBスイッチのポート20へ、ポート2がIBスイッチのポート1につながっている、ということがわかります。EtherでいうLLDPのようなものですね。
IBの場合LAGやVLANが存在せず、フラットなL2として使っているのでポートがどこかというのを気にせずに使っていますが、その結果バラバラのポートに繋がっているというのがよくわかります。
パフォーマンスモニタリングについて
いちばん簡単なのは atop を入れるとリアルタイムで通信がモニタリングできます。最初は色々あってこれが間違っているかと思いましたが、あっていました。atopを信じろ
IFB | lx5_0/1 というのがIBのポート1の使用帯域になります。
他の方法としては perfqueryがありますが、これはLIDとそのLIDがどのポートに割りあたっているかを知る必要があります。
ibstatを実行することによりLIDとそのポートがどれなのかというのを識別する方法について上の方で書いていますが、以下の場合はPort1にLID6が、Port2にLID5が割りあたっていることになります。
~# ibstat
CA 'mlx5_0'
CA type: MT4113
Number of ports: 2
Firmware version: 10.14.2066
Hardware version: 0
Node GUID: 0x5849560e6a1a0201
System image GUID: 0x5849560e6a1a0201
Port 1:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 6
LMC: 0
SM lid: 1
Capability mask: 0x2659684a
Port GUID: 0x5849560e6a1a0201
Link layer: InfiniBand
Port 2:
State: Active
Physical state: LinkUp
Rate: 40
Base lid: 5
LMC: 0
SM lid: 1
Capability mask: 0x2659684a
Port GUID: 0x5849560e6a1a0209
Link layer: InfiniBand
perfquery -x $lid1 $portnum をするとそのポートの詳細な値が出てきます。
root@dev2:~# perfquery -x 6 1 # Port extended counters: Lid 6 port 1 (CapMask: 0x1A00 CapMask2: 0x0000000) PortSelect:......................1 CounterSelect:...................0x0000 PortXmitData:....................2846531504504 PortRcvData:.....................2209524373911 PortXmitPkts:....................3680821541 PortRcvPkts:.....................3140372679 PortUnicastXmitPkts:.............3680819873 PortUnicastRcvPkts:..............3132313647 PortMulticastXmitPkts:...........1668 PortMulticastRcvPkts:............8059032 root@dev2:~# perfquery -x 5 2 # Port extended counters: Lid 5 port 2 (CapMask: 0x1A00 CapMask2: 0x0000000) PortSelect:......................2 CounterSelect:...................0x0000 PortXmitData:....................2802858100913 PortRcvData:.....................2179671795138 PortXmitPkts:....................3563833615 PortRcvPkts:.....................3067837969 PortUnicastXmitPkts:.............3563831960 PortUnicastRcvPkts:..............3059778859 PortMulticastXmitPkts:...........1655 PortMulticastRcvPkts:............8059110
PortXmitData と PortRcvDataが通信したデータになるのですが、IBの送受信データは4バイトになるので、1 PortXmitData=4byteとなります。
上記の perfquery -x 6 1のPortXmitDataは 2846531504504ですが、これをTBに直すと 2846531504504 * 4 /(1024^4)となり、起動から約10.3TB通信したことになります。
同様の内容は /sys/devices/PCIDEVNUM/infiniband/*/ports/*/counters/port_rcv_dataからも取得できます。
~# find /sys 2>/dev/null |grep "infiniband.*port_.*data" /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/infiniband/mlx5_0/ports/1/counters/port_xmit_data /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/infiniband/mlx5_0/ports/1/counters/port_rcv_data /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/infiniband/mlx5_0/ports/2/counters/port_xmit_data /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/infiniband/mlx5_0/ports/2/counters/port_rcv_data ~# cat /sys/devices/pci0000:64/0000:64:00.0/0000:65:00.0/infiniband/mlx5_0/ports/1/counters/port_xmit_data 2846637743298
非常に雑なスクリプトですが、perfqueryでモニタリングする場合は以下のようなスクリプトでモニタリングすることが可能です。2ポートHCAを想定していますが、lid1にibstatのlidを、lid1pにそのポートをいれるといい感じに表示されると思います。
#!/bin/bash
#
lid1=6
#port num of lid1
lid1p=1
lid2=5
#port num of lid2
lid2p=2
p() {
printf '%4s' $1
}
while : ; do
p1a=`perfquery -x $lid1 $lid1p`
p2a=`perfquery -x $lid2 $lid2p`
sleep 1
p1b=`perfquery -x $lid1 $lid1p`
p2b=`perfquery -x $lid2 $lid2p`
Tx1a=`echo "$p1a"|grep PortXmitData|grep -owE "[0-9]+"`
Tx1b=`echo "$p1b"|grep PortXmitData|grep -owE "[0-9]+"`
Tx2a=`echo "$p2a"|grep PortXmitData|grep -owE "[0-9]+"`
Tx2b=`echo "$p2b"|grep PortXmitData|grep -owE "[0-9]+"`
Rx1a=`echo "$p1a"|grep PortRcvData|grep -owE "[0-9]+"`
Rx1b=`echo "$p1b"|grep PortRcvData|grep -owE "[0-9]+"`
Rx2a=`echo "$p2a"|grep PortRcvData|grep -owE "[0-9]+"`
Rx2b=`echo "$p2b"|grep PortRcvData|grep -owE "[0-9]+"`
TxP1=$(( ( $Tx1b - $Tx1a ) * 4 / (1024*1024) ))
TxP2=$(( ( $Tx2b - $Tx2a ) * 4 / (1024*1024) ))
RxP1=$(( ( $Rx1b - $Rx1a ) * 4 / (1024*1024) ))
RxP2=$(( ( $Rx2b - $Rx2a ) * 4 / (1024*1024) ))
echo "Port1 :: Tx: `p $TxP1` MB/s, Rx: `p $RxP1` MB/s Port2 :: Tx: `p $TxP2` MB/s, Rx: `p $RxP2` MB/s Sum :: Tx: `p $(( $TxP1 + TxP2))` MB/s Rx:`p $(( $RxP1 + $RxP2))` MB/s "
done
ibnetdiscoverで自分以外のlidとポート番号を見つければ、他のホストの通信状況を見ることも可能です。
実行結果としては大体あっていると思います。
とりあえずこれだけわかればInfinibandをそれとなく使い始められると思います。
あくまで個人の家かつDebianという環境の上での検証結果なので、すべての環境で対応できるかは責任を持ちません。
また、私は仕事でInfinibandを触ったことはありません。すべて家の環境での検証結果です。
Related articles



コメントの追加