我有一个 FreeBSD 存储服务器,通过 NFS 导出 ZFS 数据集,但小文件传输的性能低于可接受的限制。
一些背景信息:
- 导出通过 /etc/exports 处理,而不是通过 ZFS 中的 sharenfs 属性处理。
- 服务器有 128GB RAM 和 2x8 核 CPU
- NFS 服务器配置为使用 192 个线程(vfs.nfsd.maxthreads:192)
- zpool 涵盖 4x4TB 10k rpm SAS HDD,其中 SSD 作为 SLOG
我已经使用 fio 测试了系统性能,始终使用以下参数:
fio --ioengine=posixaio --bs=4k --directory=/mountpoint --refill_buffers --iodepth=1 --file_service_type=sequential --create_on_open=1 --fallocate=0 --unlink=1 --name=benchmark1 --rw=randwrite --numjobs=1 --nrfiles=500000 --filesize=20KB
测试本地服务器上的写入速度约为55MB/秒。
测试相同的工作负载通过 NFS仅表现出微不足道的表现6000kB/秒。客户端上的挂载选项如下:
myserver:/export/path on /mnt/tmp type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=clientip,local_lock=none,addr=serverip)
我还测试了单个大文件的顺序写入,以检查网络限制。对于此工作负载,我的速度为 123MB/s,这是由于 NFS 客户端受到千兆位以太网的限制。
我还测量了在 NFS (vfs.nfsd.async=1) 和 ZFS (zfs setsync=disabled /myzpool/dataset) 中禁用同步写入后的性能。如果没有同步写入,我会得到 9000kB/s 而不是 6000,这仍然是不可接受的。
我无法选择使用大于 1500 的 MTU,因为我无法访问建筑物中的某些路由器/交换机。
答案1
- 增加 NFS 读写缓冲区大小
sudo mount -o remount,rsize=262144,wsize=262144 myserver:/export/path /mnt/tmp
- 调整NFS线程数
sudo sysctl -w vfs.nfsd.maxthreads=256
- 优化 ZFS 设置
sudo zfs set recordsize=4K myzpool/dataset
答案2
3年零6个月前提问
async
和sync
是 nfs 服务器端导出选项,与客户端通过mount
.在服务器端执行exportfs -s
观察是否是sync
or async
,并通过 进行调整/etc/exports
。例如,您的/etc/exports
文件可以像这样简单
/data *(rw,async)
sync
如果您在和之间进行编辑,async
然后执行exportfs -arv
并验证更改,exportfs -s
那么您将立即观察到 NFS 上 2 倍的速度差异。这是我发现的最显着的 NFS 加速。请注意异步数据丢失的风险。
在rsize=1048576,wsize=1048576
客户端显示的mount
,我相信是你能得到的最大的今天,这是 NFS 版本 4.1/4.2 以及 RHEL 7.9 或 8.8 中的情况。如果有人知道更多请告诉我。默认情况下它被设置为最大值(至少在 RHEL 中),然后您只会减少它,因为......
从https://www.ibm.com/docs/en/aix/7.2?topic=client-read-write-size- adjustment
最后更新:2023-03-24;对于所有产品 / AIX / 7.2 减少 rsize 和 wsize 值可能会通过为每个 NFS 读取回复和写入请求发送更短的数据包来提高拥塞网络中的 NFS 性能。但是,这样做的副作用是需要更多数据包通过网络发送数据,从而增加网络总流量以及服务器和客户端上的 CPU 利用率。如果您的 NFS 文件系统通过高速网络(例如千兆位以太网)安装,则较大的读写数据包大小可能会增强 NFS 文件系统的性能。对于 NFS 版本 3 和 NFS 版本 4,当网络传输为 TCP 时,您可以将 rsize 和 wsize 值设置为高达 65536。默认值为 32768。对于 NFS 版本 2,rsize 和 wsize 选项的最大值为 8192,这也是默认值。
我不相信rsize
今天wsize
有千兆位和更好的网络有多大价值。如果您可以scp test.tar
在单个 1GB 或更大的文件中获得一致的 110 MB/秒或更大的速度,那么网络拥塞就不是问题;作为参考,通过 SSH 传输单个文件 scp(安全副本)的速度约为 112MB/秒,这是您在 1gigabit 网络上看到的最高速度。速度较慢可能有多种原因,而不仅仅是网络拥塞,因此请确保 nfs 服务器上的 cpu 和 i/o 负载最小。
根据我的经验,我无法vers=4.2
在 RHEL 7.9 中使 NFS 工作,只能在 RHEL 7.9 中工作,但在 RHEL 8.8 中vers=4.1
却能工作。vers=4.2
因此,您可能会在给定的 Linux 操作系统及其附带的 NFS 版本中遇到这种情况。文章指出 nfs 4.2 相对于 4.1 以及 nfs4 相对于 nfs3 的显着改进。我相信这些改进更多的是针对高流量环境,而不仅仅是通过 NFS 获得更高的 MB/秒单个文件复制速度。此外,可供选择的 3 个协议是udp
、tcp
、 和rdma
。 vers=rdma
将是最好的,因为它可以节省CPU周期,但您需要网络硬件{即infiniband}来支持它。我还没有亲自测试过RHEL 8.8vers=3
和vers=4.2
RHEL 8.8 之间是否存在单文件 NFS 速度差异。proto=tcp
和之间也没有区别,proto=udp
但原则上udp
应该比 更快udp
。我在 RHEL 8 中遇到了麻烦才能udp
找到答案。
在客户端使用fsc
文件系统缓存,因为安装选项可能会提高性能。通过将fsc
“present”视为“doing”的一个选项来验证它mount
。但对于零负载和单个 nfs 复制速度测试我认为这没有帮助。
我过去常常rsync -P
复制单个文件来获取 MB/秒的速度值。