测试nfs服务器的速度

本文测试nfs服务器的速度,并做一些必要的优化。


nfs客户端与服务器的交互过程

nfs客户端与服务器的交互过程如下:

graph TB
    subgraph nfs服务器与客户端交互
		客户端-->服务器
		服务器-->客户端
    end

其实很简单,就是用nfs协议互相传数据而已。


nfs速度测试

nfs本质上就将远程的磁盘映射到本地,让本地使用远程磁盘像在本地使用一样。

那测试速度,我们先测试系统在本地,将1G的数据写入磁盘的速度如何,你只需要执行如下命令就可以了。

$ time dd if=/dev/zero of=/root/nfs/a bs=8k count=102400

执行结果:

102400+0 records in
102400+0 records out
838860800 bytes (839 MB) copied, 0.650468 s, 1.3 GB/s

real    0m0.652s
user    0m0.033s
sys     0m0.613s

这里写了839M数据,写速度为1.3GB/s,注意是大写的GB,数据还是非常快的,达到每秒1.3GB。


远程服务器测试速度

我们在客户端挂载nfs,然后测试一下速度,肯定会比直接写本地磁盘要慢很多。

我们在一台主机上挂载了nfs提供的目录,两台实验机器在同一个内网中,目录挂载在/root/nfs-client目录中,执行上面同样的命令,就能测试出写速度了。

time dd if=/dev/zero of=/root/nfs-client/b bs=8k count=102400
102400+0 records in
102400+0 records out
838860800 bytes (839 MB) copied, 8.12278 s, 103 MB/s

real    0m8.124s
user    0m0.043s
sys     0m0.586s

我们发现速度只有103MB/s,说实话,速度不够理想,比起本地磁盘存储来说,慢了7倍。

当然我们可以做一些优化,例如先写内存,再写磁盘,这样可能会快一些。我们来试一下。


更改nfs服务器的写入规则

在nfs服务器上,编辑/etc/exports文件,如下:

more /etc/exports
/root/nfs   192.168.1.0/24(rw,sync,no_root_squash)

将同步写入内存和磁盘(sync),改为先写入内存,后写入磁盘(async),我们看一下这样,会不会快一点点呢?

/root/nfs   192.168.1.0/24(rw,async,no_root_squash)

重启nfs服务器:

exportfs -rv
# 先启动rpcbind,再启动nfs
systemctl restart rpcbind
systemctl restart nfs

重启后,客户端并不需要重新做任何配置,nfs照样使用。


重新做一次速度测试

执行命令:

time dd if=/dev/zero of=/root/nfs-client/d bs=8k count=102400
102400+0 records in
102400+0 records out
838860800 bytes (839 MB) copied, 7.35084 s, 114 MB/s

real    0m7.354s
user    0m0.047s
sys     0m0.610s

很遗憾,我们发现,现在速度变为114MB/s,比前面的103MB/s快了11MB/s,是快了一点点,但是也没快多少。是不是很遗憾呢?不过没关系,大多数情况下,这个速度其实是ok的。