infinibandを自宅に導入 & Win-Ubuntu間でIBネットワーク構築(FDR 56Gbps/40GbE)
格安で超低遅延で高速なネットワークが組めるということで、自宅にinfinibandを導入してみました。
Windows 10 と Ubuntu 20.04 のマシンを直結してネットワークを構築します。
HCA(infinibandのカード)
メーカー
中古で転がってるのは大体Mellanox社製とそのOEMです。
その中でも中古相場的にはConnectX-3が一番お手頃でコスパよさそうでした。ConnectX-2はWindows 7までの対応です。
速度
ConnectX-3のHCAでは40GbpsのQDRと56GbpsのFDRで二種類あります。
Mellanoxから出てるやつだと、QDRなら型番のケツにQCBT、FDRはFCBTって書いてます。
OEM版は対応するやつをそれぞれ調べてみてください。
動作モード
VPI対応のHCAは、infinibandであることを捨ててEthernetモードに変身することもできます。
OEMとかによって変わるっぽいですが、FDRのカードだと56GbEか40GbEカードに化けることができる訳です。
接続
接続はPCIE Gen3のx8接続です。
今回使用したWindows側のRyzenマシンはGen2のx4しか空いてなかったので、最高20Gbpsしか出せません😭
参考 PCIEのレーンと帯域の関係
https://ja.wikipedia.org/wiki/PCI_Express#%E8%BB%A2%E9%80%81%E9%80%9F%E5%BA%A6
ブラケット
中古で出品されてるやつはブラケットが大体ロープロなので、普通のPCにつけるには外して何らかの手段で固定するか、3Dプリンターでフルハイトのブラケットを作る必要があります。
ブラケットの3Dモデルは誰かが作ってくれてます。
https://www.yeggi.com/q/mellanox+connectx+3/
消費電力
消費電力はMCX353A-FCBTの場合、パッシブケーブルでおよそ6~8Wです。普通の10GbE NICくらいですね。
それでもそれなりに熱いので風当てるか無理やり4cmファン付けるのがおすすめです。

ケーブル
ケーブルの種類
HCAのQDR、FDRで使うケーブルはQSFPかQSFP28があります。
規格上ではQSFPは40Gbps、QSFP28は100Gbpsまでとなっていて、端子には互換性があります。
FDRは56Gbpsなので一応QSFP28がいいのかもしれませんが、実際にはそんなに速度出ないのでQSFPで大丈夫です。
銅線?光ケーブル?
これらのケーブルは銅と光ケーブルの二種類あります。
QSFPで銅は5mくらいまでの短距離、光は100mくらいのちょっと長い距離に対応してます。
中古で手に入れようとするとおそらく銅ケーブルを買うことになると思います。
距離と速度はここを参照
http://www.viops.jp/ibday02-BASIC-xsigo.pdf
光の場合、両端についてるメディアコンバータの性能によってはQSFPでも40Gbpsは出ないかもしれません。
QSFPのSAS用として売られていたとすると24Gbpsまでしか出ないんですかね?(後述の通り実際は24Gbpsすら出ないので気にしなくていいと思いますが…)
http://www.aim-ele.co.jp/products/qsfp/
購入したもの
HCA
FDR 56Gbps/40GbE
Fujitsu CA05954-2101(MCX353A-FCBTのOEM)
ヤフオクで二枚4000円ほどでした
ケーブル
5mの銅線QSFPケーブル買いました。パッシブケーブルです。
SAS用って書いてました。ヤフオクで1500円ほど。
ファームウェアのアップデート
Windows側のマシンで作業しました。
Mellanox Firmware Toolsはここからダウンロードできます。
https://www.mellanox.com/products/adapter-software/firmware-tools
バージョン確認
管理者権限のCMDで実行してください。
(アプデ後に実行したのでバージョンは最新になってます)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | > cd "\Program Files\Mellanox\WinMFT" > mst status -v MST devices: ------------ mt4099_pci_cr0 bus:dev.fn=05:00.0 mt4099_pciconf0 bus:dev.fn=05:00.0 > flint -d mt4099_pci_cr0 query Image type: FS2 FW Version: 2.42.5000 FW Release Date: 5.9.2017 Product Version: 02.42.50.00 Device ID: 4099 Description: Node Port1 Port2 Sys image GUIDs: f45214030018c1d0 f45214030018c1d1 f45214030018c1d2 f45214030018c1d3 MACs: f4521418c1d0 f4521418c1d1 VSD: PSID: FJT1060100019 |
ファームウェアのダウンロード
OEM品だとMellanoxのファームウェアは通らないので、各社サイトからダウンロードします。
今回は富士通のOEM品なので富士通からダウンロードしました。
https://azby.fmworld.net/app/customer/driversearch/ia/drviadownload?driverNumber=F1025573
落としたファームウェア(242500F1.bin)は同じ階層に入れておきます。(C:\\Program Files\Mellanox\WinMFT)
バックアップ
1 2 | > flint -d mt4099_pci_cr0 ri org_fw.bin > flint -d mt4099_pci_cr0 dc org_fw.ini |
落としたファームのチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | > flint -i 242500F1.bin FS2 failsafe image. Start address: 0x0. Chunk size 0x80000: NOTE: The addresses below are contiguous logical addresses. Physical addresses on flash may be different, based on the image start address and chunk size /0x00000038-0x0000065b (0x000624)/ (BOOT2) - OK /0x0000065c-0x0000297f (0x002324)/ (BOOT2) - OK /0x00002980-0x00003923 (0x000fa4)/ (Configuration) - OK /0x00003924-0x00003967 (0x000044)/ (GUID) - OK /0x00003968-0x00003af3 (0x00018c)/ (Image Info) - OK /0x00003af4-0x00010e8b (0x00d398)/ (DDR) - OK /0x00010e8c-0x00011edf (0x001054)/ (DDR) - OK /0x00011ee0-0x000122af (0x0003d0)/ (DDR) - OK /0x000122b0-0x00050287 (0x03dfd8)/ (DDR) - OK /0x00050288-0x0005510b (0x004e84)/ (DDR) - OK /0x0005510c-0x000595df (0x0044d4)/ (DDR) - OK /0x000595e0-0x0005a0d7 (0x000af8)/ (DDR) - OK /0x0005a0d8-0x000891cb (0x02f0f4)/ (DDR) - OK /0x000891cc-0x0008cd77 (0x003bac)/ (DDR) - OK /0x0008cd78-0x000a1c6b (0x014ef4)/ (DDR) - OK /0x000a1c6c-0x000a1d73 (0x000108)/ (DDR) - OK /0x000a1d74-0x000a6df7 (0x005084)/ (DDR) - OK /0x000a6df8-0x000a85f3 (0x0017fc)/ (Configuration) - OK /0x000a85f4-0x000a8667 (0x000074)/ (Jump addresses) - OK /0x000a8668-0x000a8f9f (0x000938)/ (FW Configuration) - OK /0x00000000-0x000a8f9f (0x0a8fa0)/ (Full Image) - OK -I- FW image verification succeeded. Image is bootable. |
焼く
1 | > flint -d mt4099_pci_cr0 -i 242500F1.bin burn |
ネットワーク構築
infinibandでIP通信をするにはIPoIB(IP over infiniband)を設定します。
QDRは8b/10b変換をするため、実効転送レートは40Gbpsから32Gbps、
FDRは64b/66b変換なので、56Gbpsから54.55Gbpsになるらしいです。https://ja.wikipedia.org/wiki/InfiniBand#%E8%BB%A2%E9%80%81%E3%83%AC%E3%83%BC%E3%83%88
構成
今回はスイッチは使わずにPCを直結しました。
サーバー 192.168.250.10
Ubuntu Server 20.04
Core i3 6100T
ECC 2133MHz 4GB*4
PCIE 3.0 x8 に接続
クライアント 192.168.250.11
Windows 10 Pro
Ryzen 5 3600
3200MHz 8GB*2
PCIE 2.0 x4 に接続(20Gbps😭)
ネットワークを構築していきます
サーバー側(Ubuntu 20.04)
モジュールを追加します。
1 | $ sudo nano /etc/modules |
1 2 3 4 5 | mlx4_ib rdma_ucm ib_umad ib_uverbs ib_ipoib |
再起動したら、カーネル標準のドライバをインストールします。
1 2 | $ wget http://us.archive.ubuntu.com/ubuntu/ubuntu/pool/universe/libm/libmlx4/libmlx4-1_1.0.6-1_amd64.deb $ sudo sudo dpkg -i libmlx4-1_1.0.6-1_amd64.deb |
追加で必要なパッケージをインストールします。
1 | $ sudo apt install infiniband-diags opensm ibverbs-utils perftest |
infinibandネットワーク内では、どこか一か所でサブネットマネージャーと呼ばれるものを動作させる必要があります。
マネージドスイッチがあればそいつがやってくれますが、直結したりアンマネージドスイッチに繋ぐ場合はサーバー側で動作させます。
1 | $ sudo systemctl start opensm |
自動起動したかったのですが、enableを打ってもなんか失敗するので強引ですがcrontabに起動時実行するように設定しました。
1 2 | $ sudo systemctl enable opensm Failed to enable unit: Unit /run/systemd/generator.late/opensmd.service is transient or generated. |
1 2 | $ sudo crontab -e @reboot systemctl start opensm |
あとはip aするとibなんたらってデバイスが出てくると思うので、こいつをnetplanでアドレス振っておけば設定完了です。

クライアント側(Windows 10)
infinibandのドライバーは、OpenFabricsというところが標準版を出して、それを各社がカスタマイズしてリリースしてるらしいです。
WindowsではOpenFabrics版とMellanox版の2種類あります。
しかし、OpenFabricのほうは長らく更新されておらずWindows10では使えないためMellanoxのほうをインストールしました。
ここからダウンロードします。ConnectX-3,X-3 ProはWinOF、X-4,X-5はWinOF2を選んでください。
https://www.mellanox.com/products/adapter-software/ethernet/windows/winof-2
入れたらネットワークアダプターにIPoIBアダプターが出現するのでそこからアドレスを振っておきます。

pingを鯖に飛ばせたら設定完了です。
使ってみる
ベンチマーク
特に何もいじってない状態でiperf3を実行したところ、10Gbps前後でした。
なんか微妙です。

MS製のNtttcpでも計ってみると12Gbpsぐらいで若干向上しました。マルチコア使ってくれるからでしょうか?
https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-bandwidth-testing (Linux版は自分でコンパイル)
他のConnectX-3環境を構築した人の結果を見ても大体10Gbpsちょっとだったので、おそらくこんなもんなんでしょう。
10GbE NICよりは安いので検討の価値はあります。
infinibandが本領を発揮するのはやっぱりIPネットワークではなくMPIの並列計算とかなんですかね。機会があったら試してみたいです
MTUを増やす?
MTUを増やしてデカいパケットで送ればその分通信の制御回数が減るのでCPUの負荷が減って速度が向上します。多分。
infinibandの接続モードはconnnectedモードとdatagramモードがあります。
connectedモードではMTUを上げられますが、datagramと比べて若干遅延が増えます。
datagramではMTUが強制的に2044、connectedモードでは65520までに設定できます。
しかし!ubuntu側ではこの接続モード変更できるのですが、windows側のドライバに変える機能はなくdatagramモード固定のようです。(正確にはMellanox版にはなくて標準版のほうにしかない)
なので残念ながらMTUを増やしての検証はできませんでした。
最近のコメント