Mellanox ConnectX-3 VPIのセットアップ

サーバ、クライアント間の帯域を上げたくて、Mellanox ConnectX-3 VPIをセットアップした。 入手したのはMCX354A-FCBTで、スペック上40Gの帯域がある。

購入は、ebayでbrand newのものが送料含めて7000ほどで買えた。 また、接続用のケーブルはfiberjpで汎用のパッシブDACを2000円ほどで購入した。

インストール先は、ちょっと古めのサーバと第三世代ryzenを搭載したデスクトップ。 サーバの方はカードを挿入したらそのまま認識までした。

一方デスクトップ機の方は、そのままだと認識しなかった。 切り分けを行った結果、UEFIでPCIeのバージョンを3に固定することで認識した。 第三世代ryzenとX570チップセットだとPCIe4が使えるので、 NICマザーボードネゴシエーションがうまく行かないのかもしれない。 また、そのままだとLinuxのドライバの初期化が失敗する。 おそらくPCIeデバイスがそれなりにあるので、メモリの確保に失敗しているらしい。 MSI X570 Gaming Plusでは、「Above 4G memory/ Crypto Currency mining」をEnableにすると解決した。

あとは、OS側からNICファームウェアを更新する。 利用しているのはArch Linuxだが、ファームウェア更新用のソフトウェアの最新版がdebrpmでしか配布されていない。 これらのパッケージから取り出しても良かったが、OSS版が存在したのでそちらを使うようにした。

$ git clone https://github.com/Mellanox/mstflint.git
$ cd mstflint
$ ./autogen.sh
$ ./configure --disable-inband
$ make
$ make install

デフォルトだとInfiniBandのライブラリがないとビルドできないので、明示的に無効にする。

OSS版では、ツールセットの先頭にmstがつくので、手順のflintはmstflintと読み替える必要がある。 また、デバイスの指定はPCI ID(?)を利用する。

$ lspci|grep -i mellanox
2d:00.0 InfiniBand: Mellanox Technologies MT27500 Family [ConnectX-3]

$ mstflint -d 2d:00.0 q
Image type:            FS2
FW Version:            2.11.1280
Device ID:             4099
HW Access Key:         Disabled
<snip>
VSD:
PSID:                  ORC1090120019

セラーの説明ではHPのOEMとのことだったが、実際にはOracleのものらしい。 とはいえ、以降の手順では特に関係はない。

手順はこちらを参考にした。 この手順では、カスタムファームウェアを作ることなく、直接Mellanoxの最新ファームウェアを書き込む。

まずは、現在のファームウェアと設定をバックアップする。

$ mstflint -d 2d:00.0 ri orig_firmware.bin
$ mstflint -d 2d:00.0 dc orig_firmware.ini

次にファームウェアを書き込む。

$ mstflint -d 2d:00.0 -i fw-ConnectX3-rel-2_42_5000-MCX354A-FCB_A2-A5-FlexBoot-3.4.752.bin -allow_psid_change burn

    Current FW version on flash:  2.11.1280
    New FW version:               2.42.5000


    You are about to replace current PSID on flash - "ORC1090120019" with a different PSID - "MT_1090120019".
    Note: It is highly recommended not to change the PSID.

 Do you want to continue ? (y/n) [n] : y
Burning FS2 FW image without signatures - OK
Restoring signature                     - OK

成功したらリブートする。

リブート後にポートをEtherに設定する。

$ mstconfig -d 2d:00.0 set SRIOV_EN=1 LINK_TYPE_P1=2 LINK_TYPE_P2=2

Device #1:
----------

Device type:    ConnectX3
Device:         2d:00.0

Configurations:                              Next Boot       New
         SRIOV_EN                            False(0)        True(1)
         LINK_TYPE_P1                        VPI(3)          ETH(2)
         LINK_TYPE_P2                        VPI(3)          ETH(2)

 Apply new Configuration? (y/n) [n] : y
Applying... Done!
-I- Please reboot machine to load new configurations.

更に再起動することで、通常のNICと同様に利用できる。

iperfで速度計測した結果、MTU9000で13Gbpsほどの速度が出た。 CPUでサチっているようでカタログスペックは出ないものの、 10Gよりも速度は出ているので十分だろう。