Broadcomの10Gネットワークカード、NetXtreme-E BCM57416を安価で2枚手に入れたので、NFS over RDMAを有効にしてみた。
まだ、10000base-T対応のスイッチングハブを個人で買うにはちょっと高いので、2つのNICをLANケーブルで直結して試した。
RDMA
RDMAとは、Remote Direct Memory Accessの略で、『ローカルのコンピュータのメモリから、異なるリモートのコンピュータのメモリへデータのDMA転送を行うこと』。OSをすっ飛ばしてデータ転送を行える。元々は、Infiniband上で高速転送を行うために開発されたようだ。
NIC用driver
まずはネットワークカード自体のドライバだが、bnxt_enが該当する。Ubuntu 20.04だと、自動で認識してくれた。
[ 1.527556] bnxt_en 0000:01:00.0 eth1: Broadcom BCM57416 NetXtreme-E 10GBase-T Ethernet found at mem e0510000, node addr 9c:dc:71:b6:b5:d0
[ 1.528469] bnxt_en 0000:01:00.0: 63.008 Gb/s available PCIe bandwidth (8.0 GT/s PCIe x8 link)
[ 1.554613] bnxt_en 0000:01:00.1 eth2: Broadcom BCM57416 NetXtreme-E 10GBase-T Ethernet found at mem e0500000, node addr 9c:dc:71:b6:b5:d8
[ 1.555833] bnxt_en 0000:01:00.1: 63.008 Gb/s available PCIe bandwidth (8.0 GT/s PCIe x8 link)
RoCE driver
続いて、RoCE(RDMA over Converged Ethernet、ロッキーと発音するらしい)用のドライバ。bnxt_reが該当する。こちらは、自動では入らないので、手動で行う。
$ sudo modprobe bnxt_re
このように認識される。
[ 412.826559] bnxt_re: Broadcom NetXtreme-C/E RoCE Driver
[ 412.898572] infiniband bnxt_re0: Device registered successfully
[ 412.934539] infiniband bnxt_re1: Device registered successfully
さらに、RPC/RDMA Transportモジュールを突っ込む。
$ sudo modprobe rpcrmda
こちらはこのように認識される。
[ 17.281994] RPC: Registered rdma transport module.
[ 17.281997] RPC: Registered rdma backchannel transport module.
これら2のドライバは、/etc/modules
へ書いておけば、次回起動時に有効にしてくれる。
bnxt_re
rpcrdma
nfs server
nfsサーバー側は、 /export
を公開としておく。なお、セキュリティとかは考慮していない。
$ cat /etc/exports
/export 192.168.0.0/255.255.255.0(rw,async,fsid=0,no_subtree_check,no_root_squash,insecure)
ここで、NFSサーバーを(再)起動する。
$ sudo systemctl start nfs-server
そして、RDMA転送用のポート番号を設定。20049がデフォルトのポート番号らしい。
# echo rdma 20049 > /proc/fs/nfsd/portlist
# cat /proc/fs/nfsd/portlist
rdma 20049
rdma 20049
tcp 2049
tcp 2049
なお、この設定を行っても、netstatの結果には20049番ポートは出てこない。
ここまでが、サーバー側の設定。
nfs client
NFSクライアント側は、以下のようにマウントする。
# mount -o rdma,port=20049 192.168.0.1:/ /srv
これで、ファイルをコピーしてみると、1.1GB/sくらい出た。
$ dd if=/srv/100G of=/dev/zero iflag=direct bs=32M
3200+1 レコード入力
3200+1 レコード出力
107374182500 bytes (107 GB, 100 GiB) copied, 95.0471 s, 1.1 GB/s
参考
- Broadcom® NetXreme-C および NetXtreme-E
ユーザー マニュアル - [GPUDirect SQL on NFS-over-RDMAを試す]
(https://kaigai.hatenablog.com/entry/2021/07/05/182217)