使用Mallanox网卡基于RDMA挂载NFS
笔者的实验室于近期购置了8块nvme硬盘,通过pcie转接卡转接至一台服务器,并用ZFS组了RAID。为了能让实验室的其他服务器也能快速访问主机上的存储池,笔者去闲鱼套了两块ConnectX-4 CX4121A 10Gbe 的万兆网卡用来连接两台服务器,并配置了NFS Over RDMA。
闲鱼的卖家没有附带光模块,笔者随意买了两个华为的10G模块,大概15-20元一个。
安装驱动
前往nvidia的官网下载NVIDIA Firmware Tools (MFT),根据自己的系统选安装包,笔者实验室用的都是ubuntu,就下载了mft-4.25.0-62-x86_64-deb.tgz。
下载完后运行安装包内的install.sh
即可。
安装完后通过mst start
启动MST,然后用mst status
就能看到自己的卡了,此时电脑上应该也会多出光卡对应的NIC。
1 | # mst status |
如果网卡只用做服务器之间的互联,可以分别为两段的服务器配置静态IP和路由。
更新固件
前往nvidia的固件下载页下载对应的zip(注意区分自己的卡是以太网卡还是IB卡)。
找到自己的设备(/dev/mst
开头的),用flint -d <device_name> -i <binary image> burn
刷入固件。
安装MLNX_OFED
虽然笔者买的是以太网卡,但Mellanox的RDMA内核模块需要去给IB卡提供的MLNX_OFED
包里安装。MLNX_OFED
也可以在Nvidia官网下载。笔者直接下了最新的MLNX_OFED_LINUX-23.07-0.5.0.0-ubuntu22.04-x86_64.tgz,没有下LTS版本。
下载完解压后,运行里面的
1 | ./mlnxofedinstall |
即可。
随后还要手动安装里面的NFS-RDMA内核模块,一般这个包位于./DEBS/mlnx-**nfs**rdma-dkms_23.04-OFED.23.04.0.5.3.1_all.deb
的位置,也可以用find . | grep nfs | grep .deb
找到。随后dpkg -i ./DEBS/mlnx-**nfs**rdma-dkms_23.04-OFED.23.04.0.5.3.1_all.deb
即可。期间需要DKMS需要build内核模块,请耐心等待。
安装NFS Server
在服务器一端安装NFS Server
1 | apt install nfs-kernel-server |
在启动NFS之前需要mount相应的内核模块,以及把RDMA用的端口加进NFS的portlist:
1 | /sbin/modprobe rpcrdma |
如果想之后自动进行可以直接修改/lib/systemd/system/nfs-kernel-server.service
(主要是加ExecStartPre
和ExecStartPost
:
1 | [Unit] |
随后systemctl daemon-reload
并重启nfs服务。此时在NFS的监听端口里应该能看到普通nfs用的2049和RDMA的20049了:
1 | # cat /proc/fs/nfsd/portlist |
添加暴露的挂载目录
编辑/etc/exports
,如果对于ZFS文件系统,也可以直接执行如下命令(意思是允许7.0.115.0/24
访问pool-name
这个pool):
1 | zfs set sharenfs="[email protected]/24,no_root_squash,async" pool-name |
随后通过exportfs -v
检查,可以看到相应的目录已经被暴露了:
1 | # exportfs -v |
客户端操作
客户端在挂载前同样需要挂载rpcrdma,这个命令也可以写在systemctl的ExecStartPre=
里:
1 | modprobe rpcrdma |
随后进行挂载:
1 | mount 7.0.115.1:/data/pool-name /data/pool-name -o rdma,port=20049,async,noatime,nodiratime -vvvv |
如果一切没有问题则可以在/etc/fstab
里添加:
1 | 7.0.115.1:/data/pool-name /data/pool-name nfs rdma,port=20049,async,noatime,nodiratime 0 0 |
测速
用fio测试顺序写入速度:
1 | fio --name=testfile --directory=/data/pool-name/speedtest --size=2G --numjobs=10 --rw=write --bs=1000M --ioengine=libaio --fdatasync=1 --runtime=60 --time_based --group_reporting --eta-newline=1s |
可以看到写入速度能够跑满10G网卡(1078MiB/s
),同时测速时通过iftop在网卡上看不到任何流量,说明NFS的流量已经直接经过RDMA传输了。
1 | testfile: (groupid=0, jobs=10): err= 0: pid=3968057: Thu Aug 24 08:00:00 2023 |