ksmbd+smbdirect works!

ksmbd+smbdirectをdebian sid(bookworm)で試した話。RoCE?iWarp?IPoIBですが何か?

オークションで安く仕入れた(2枚で5,000円ほど)Mellanox ConnectX-3 VPIの通信速度は、ethernetモード(RoCE/iWarp)で動作させると40Gbps、infinibandモード(IPoIB)で動作させると56Gbpsになります。56Gbpsなら7GB/sほどで、PCIe 4.0 x4 M.2 nvme同等の速度になります。こんな速度で大容量データを転送すればパケット数が多くなりすぎて非効率で、パケットの転送にCPUを使用する通常のethernetの処理では、いわゆるIOPsが頭打ちして速度が出なくなってしまいます。CPUを経由しないRDMA、つまりsmbdirectでは、パケットの転送にCPUを使わないので通信速度を下げることなく効率よく転送することができます。

さて、infinibandの速度で恩恵を受けるためにはRDMAを有効にした転送が必要ですが、それには専用の機能やプログラムを使う必要があります。Windowsのファイル共有プロトコルであるSMBではSMBダイレクト(smbdirect)、iSCSIではiSERやSRP、NFSではNFSoRDMAなどです。

infinibandはsmbdirectを有効にしてナンぼ!ということでksmbdを入れて満足していましたが、実はそのままではsmbdirectは有効になりません。

debian sid(bookworm)ではそもそもカーネルモジュールのsmbdirectオプションが有効にされておらず、また、ConnectX-3ではlinuxの標準ドライバmlx4_coreにバグがあるらしく、ksmbdに「rdmaが有効なネットワーク」という検出をしてもらえません。そのため、ソース修正のうえ、モジュールの再コンパイルが必要です。

sudo apt install linux-source-5.18
cd $(mktemp -d)
tar xf /usr/src/linux-source-5.18.tar.xz
cd linux-source-5.18/fs
rm ksmbd -rf
git clone https://github.com/cifsd-team/ksmbd
cd ksmbd
##次に示すファイル修正を施す

https://unix.stackexchange.com/questions/657157/building-ksmbd-on-debian-buster-bpo/657174#657174

https://stackoverflow.com/questions/50361990/how-to-solve-kernel-configuration-is-invalid-issues

https://github.com/cifsd-team/ksmbd/issues/541

カードをinfinibandモードで動かせば、debianでは「ibp9s0」のようにibpで始まるデバイス名でシステムに登録される。transport_rdma.cのksmbd_rdma_capable_netdev()でデバイスのrmda利用可否を判断しているが、linux標準のmlx4_coreドライバがおかしいらしく、下記リンクの情報を参考に、ibpで始まるデバイスは無理やりrdma利用可能と扱ってあげることで、rdma(smbdirect)が利用可能となる。

//ksmbd_rdma_capable_netdev()関数内のif( rdma_capable == false) {以下を下記のように書き換える。
       if (rdma_capable == false) {
                struct ib_device *ibdev;

                ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN);
                if (ibdev) {
                        ksmbd_debug(RDMA, "Is IB Device");
//                        if (rdma_frwr_is_supported(&ibdev->attrs)){
                                ksmbd_debug(RDMA, "RDMA Capable");
                                rdma_capable = true;
//                        }
                        ib_device_put(ibdev);
                }else{
                        ksmbd_debug(RDMA, "Not RDMA Capable: %s", netdev->name );
                        if( strncmp( netdev->name, "ibp", 3 ) == 0 ){
                                ksmbd_debug(RDMA, "RDMA enabled for %s", netdev->name );
                                rdma_capable = true;
                        }
                }
        }

        return rdma_capable;
//無理やりCONFIG_SMB_SERVER_SMBDIRECTを有効にする
#ifndef CONFIG_SMB_SERVER_SMBDIRECT
#define CONFIG_SMB_SERVER_SMBDIRECT y
#endif
ksmbd-y +=      smb2pdu.o smb2ops.o smb2misc.o ksmbd_spnego_negtokeninit.asn1.o \
                ksmbd_spnego_negtokentarg.asn1.o asn1.o transport_rdma.o

#transport_rdma.oを上記に追記して強制的にsmbdirectを使用させる。

https://github.com/cifsd-team/ksmbd/issues/543#issuecomment-982496675

これらの準備の後、下記でモジュールがインストールされる。

cd ../..
cp /boot/config-5.18.0-3-amd64 ./.config
make oldconfig
#適当にenterを押す
make menuconfig
##ここでFile Systems -> Network File Systems -> SMB3 server support (EXPERIMENTAL) でSupport for SMB Direct protocolをチェック
##ここまで終了すればいったん保存してメニューを閉じる 
make fs/ksmbd/ksmbd.ko
##エラーが出ても無視する
cd fs/ksmbd
make
#エラーが出ても気にしない。ビルド途中にtransport_rdma.oが生成されること、ksmbd.koがビルドされることの2点が守られていれば成功。
sudo make install
sudo reboot

CFD販売の初期のPCIe 4.0 x4 M.2 SSDを使用している。ローカルで使用しているのと遜色ない速度が出た。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です