这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

nfs 命令

Linux nfs 相关命令

1 - nfs命令概述

常用nfs命令

安装

nfs 服务器和客户端的安装见 安装配置nfs文件共享

使用

列出远程nfs服务器上的挂载信息,然后在本地建立目录并挂载:

# 查看远程服务器的挂载情况
$ showmount --exports 192.168.0.40 
Export list for 192.168.0.40:
/mnt/d         192.168.0.0/16
/mnt/nfs-share 192.168.0.0/16

# 挂载到本地
$ mkdir -p /mnt/d
$ sudo mount -t nfs 192.168.0.40:/mnt/d /mnt/d

# 不使用时卸载
$ sudo umount /mnt/d

资料

2 - showmount命令

showmount用来显示nfs服务器的挂载信息

使用

$ showmount --exports 192.168.0.40 
Export list for 192.168.0.40:
/mnt/d         192.168.0.0/16
/mnt/nfs-share 192.168.0.0/16

资料

4 - NFSoRDMA

准备工作

正确安装网卡的 MLNX_OFED 驱动

注意在安装时,一定要加 --add-kernel-support 参数,否则只能重新安装。我之前安装 MLNX_OFED 驱动时没有加这个参数,因此不得不重新安装:

 sudo ./mlnxofedinstall --without-fw-update --force --add-kernel-support

这个命令会删除现有已经安装的驱动,然后重新安装

安装 rdma 相关的包

参考 redhat 的文档 通过 RDMA(NFSoRDMA)启用 NFS

在 nfs 服务器端和客户端都安装 rdma-core :

sudo apt install rdma-core

并确保 /etc/rdma/modules/rdma.conf 文件中没有注释掉 xprtrdmasvcrdma 这两行:

# NFS over RDMA client support
xprtrdma

# NFS over RDMA server support
svcrdma

确保 rdma 相关的 mod 正确装载

参考 oracle 的这个文档, Using the NFS over RDMA Client

在 nfs 服务器端,检查:

sudo modprobe svcrdma

在 nfs 客户端,检查:

sudo modprobe xprtrdma

备注: svcrdma 和 xprtrdma 似乎都只是 rpcrdma mod 的别名??

sudo modprobe -r xprtrdma
modprobe: FATAL: Module rpcrdma is in use.

安装

安装 VAST-NFS Client Driver

https://vastnfs.vastdata.com/docs/4.0/Intro.html

下载最新版本:

curl -sSf https://vast-nfs.s3.amazonaws.com/download.sh | bash

Checking latest version...
Downloaded: vastnfs-4.0.18.tar.xz

解压缩:

tar xvf vastnfs-4.0.18.tar.xz
cd vastnfs-4.0.18

编译:

./build.sh bin

......
dpkg-buildpackage: info: binary-only upload (no source included)
total 912
-rw-r--r-- 1 sky sky 933788 Aug 11 02:17 vastnfs-dkms_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0_all.deb
------------------------------------------------------------------

Output in dist/

total 912
-rw-r--r-- 1 sky sky 933788 Aug 11 02:17 vastnfs-dkms_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0_all.deb

注意这里,如果编译出来的文件名是类似上面的 “vastnfs-dkms_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0_all.deb”,是有问题的,需要重新安装。

这是因为 MLNX_OFED 驱动在安装是没有加 --add-kernel-support 参数。如果 MLNX_OFED 驱动在安装时有正确的加 --add-kernel-support 参数,则编译出来的文件名会类似 vastnfs-modules_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0.kver.5.4.0-156-generic_amd64.deb 这样带有 linux 内核的版本。

安装:

cd dist
# 注意这个文件是有问题的
# sudo apt install ./vastnfs-dkms_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0_all.deb
# 这个文件才是对的
sudo apt install ./vastnfs-modules_4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0.kver.5.4.0-156-generic_amd64.deb

......
compat_nfs_ssc.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.4.0-156-generic/updates/dkms/

depmod...

DKMS: install completed.

更新 initramfs:

sudo update-initramfs -u -k `uname -r`

update-initramfs: Generating /boot/initrd.img-5.4.0-156-generic

重启机器。然后检验:

$ cat /sys/module/sunrpc/srcversion
FAA3D4CDBA86B8279289A02

$ modinfo sunrpc | grep srcversion
srcversion:     FAA3D4CDBA86B8279289A02

两个 srcversion 要一致。

$ vastnfs-ctl status          

version: 4.0.18-vastdata-MLNX.OFED.LINUX-4.9-6.0.6.0
kernel modules: sunrpc rpcrdma compat_nfs_ssc lockd nfs_acl auth_rpcgss nfsd nfs nfsv3
services: rpcbind.socket rpcbind
rpc_pipefs: /run/rpc_pipefs

启动 nfs 服务器端

sudo vi /etc/exports

设置 nfs export 的内容,比如我这里要导出两个地址:

/mnt/data/share 192.168.0.0/16(fsid=0,rw,async,insecure,no_root_squash,no_subtree_check)
/mnt/data/pve-share 192.168.0.0/16(fsid=0,rw,async,insecure,no_root_squash,no_subtree_check)

重启 nfs-server :

sudo systemctl restart nfs-server

关键设置,在启动 nfs-server 之后再设置 rdma 的端口 20049:

# 还不能用 sudo,会宝座
sudo echo rdma 20049 > /proc/fs/nfsd/portlist
zsh: permission denied: /proc/fs/nfsd/portlist

# 要先 su 到 root
sudo su
# 看一眼现在的设置, rdma 20049 端口的设置在 restart nfs-server 之后就消失了
vi /proc/fs/nfsd/portlist
# 也不能通过 vi 命令来修改,会无法保存文件

# 可以这样修改
echo rdma 20049 > /proc/fs/nfsd/portlist

这个时候 /proc/fs/nfsd/portlist 文件的内容是这样的:

rdma 20049
rdma 20049
udp 2049
tcp 2049
udp 2049
tcp 2049

nfs 客户端mount

在 nfs 客户端执行命令,尝试 mount :

sudo mount -t nfs -o vers=3,proto=rdma,port=20049 192.168.99.100:/mnt/data/share /mnt/nfs-fast

如果 mount 命令一直卡住不返回,一般是 nfs 服务器端无法连接,在 ip 地址和路径没问题的情况下,最大可能性就是 20049 端口没有开启或者无法连接。

如果成功,此时就可以看到服务器端的文件被 mount 过来了。

验证

执行 dd 命令读取一个 100G 的大文件验证一下:

dd if=/mnt/nfs-fast/temp/test1.img of=/dev/null bs=8M
12800+0 records in
12800+0 records out
107374182400 bytes (107 GB, 100 GiB) copied, 72.2484 s, 1.5 GB/s

很遗憾,1.5GB/s 的速度明显不是 rdma 开启后应有的速度。

再次重复上面的测试,期间通过 top 命令查看 nfs 服务器端的 cpu 使用情况:

top - 06:56:12 up  3:15,  2 users,  load average: 0.90, 0.36, 0.14
Tasks: 259 total,   1 running, 258 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 10.2 sy,  0.0 ni, 88.5 id,  1.0 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :  31841.3 total,    261.1 free,   1129.2 used,  30451.0 buff/cache
MiB Swap:   8192.0 total,   8180.2 free,     11.8 used.  30244.3 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                
   5950 root      20   0       0      0      0 D  45.5   0.0   0:45.37 nfsd  
   5951 root      20   0       0      0      0 S  45.2   0.0   0:46.05 nfsd  
    153 root      20   0       0      0      0 S  32.2   0.0   1:10.76 kswapd0 
    744 root       0 -20       0      0      0 I   2.3   0.0   0:02.72 kworker/5:1H-ib-comp-wq 
   5949 root      20   0       0      0      0 S   1.0   0.0   0:00.91 nfsd  
     10 root      20   0       0      0      0 I   0.3   0.0   0:03.39 rcu_sched  

直接在 nfs 服务器端执行 dd 命令读取这个 100G 的大文件试试:

dd if=/mnt/data/share/temp/test1.img of=/dev/null bs=8M

12800+0 records in
12800+0 records out
107374182400 bytes (107 GB, 100 GiB) copied, 25.8021 s, 4.2 GB/s

可以看到读取的速度是 4.2 GB/s,可见ssd硬盘的读取速度(4.2 GB/s)远远大于 nfs 传输的速度(1.5 GB/s)。

推断:从传输速度上看,rdma 应该是没有开启。

期间通过 top 命令查看 nfs 服务器端的 cpu 使用情况:

top - 06:59:16 up  3:18,  2 users,  load average: 0.41, 0.40, 0.20
Tasks: 261 total,   2 running, 259 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  9.2 sy,  0.0 ni, 89.7 id,  0.9 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :  31841.3 total,    238.3 free,   1131.8 used,  30471.2 buff/cache
MiB Swap:   8192.0 total,   8169.7 free,     22.2 used.  30242.1 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   6046 root      20   0   13724   9896   1728 R  89.0   0.0   0:17.25 dd 
    153 root      20   0       0      0      0 S  23.0   0.0   1:29.40 kswapd0 
     10 root      20   0       0      0      0 I   0.3   0.0   0:03.57 rcu_sched    
   5866 root      20   0       0      0      0 I   0.3   0.0   0:01.62 kworker/u24:2-mlx4_en  
   5955 root      20   0       0      0      0 I   0.3   0.0   0:00.04 kworker/0:2-events  

发现和走 nfs 传输相比,服务器端的 cpu 消耗基本相当: 10.2 sy, 0.0 ni, 88.5 id9.2 sy, 0.0 ni, 89.7 id

推断:从nfs服务器端 cpu 占用上看,rdma 应该是开启了。

现在就有点矛盾了!

参考资料