NFSv3 与 NFSv4 性能下降

NFSv3 与 NFSv4 性能下降

我有两个无盘系统设置。它们都/home来自同一服务器的挂载目录。导出/home是 Kerberized 的并且工作没有问题,只有性能似乎是问题。所有东西都连接到同一个交换机,使用相同的电缆,端口配置相同,等等。fstab安装选项有点不同,因为 NFSv3 和 NFSv4 有不同的子集。

我将大约 25000 个小文件(小于 10kb)复制到/dev/shm/dir每个客户端上(在服务器和客户端之间进行物理复制),然后将rsync它们编辑到我的~.时间相差约 15 秒。有谁知道为什么会发生这种情况? NFSv4 比 NFSv3 慢吗?或者有什么特定的选择可以改善这种情况?我将非常感谢一些帮助。

服务器

Debian "Bullseye", 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12)
NFS Export: /home 1.2.3.4/24(rw,async,no_subtree_check,sec=krb5:krb5i:krb5p)

# cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2

使用 NFSv3 的客户端 1

Debian "Bullseye", 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12)

# cat /etc/fstab
5.6.7.8:/home  /home   nfs rw,nodev,nosuid,hard,nolock,proto=tcp,nfsvers=3,sec=krb5    0   0

# findmnt
└─/home   5.6.7.8:/home nfs   rw,nosuid,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=krb5,mountvers=3,mountport=40531,mountproto=tcp,local_lock=all

[client1] /dev/shm ➽ $ time rsync --links -r dir ~/dir1/
real    0m33,835s
user    0m0,582s
sys 0m6,062s

使用 NFSv4.2 的客户端2

Debian "Bookworm", 6.1.0-11-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-4 (2023-08-08)

# cat /etc/fstab
5.6.7.8:/home  /home   nfs rw,nodev,nosuid,ac,hard,proto=tcp,nfsvers=4.2,sec=krb5    0   0

# findmnt
└─/home   5.6.7.8:/home nfs4   rw,nosuid,nodev,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5,local_lock=none

[client2] /dev/shm ➽ $ time rsync --links -r dir ~/dir2/
real    0m48,155s
user    0m0,671s
sys 0m8,472s

编辑:9月10日 11:53

我读到了一些统计数据mountstats。另外,我安装了/homewith krb5p,结果发现加密不会对吞吐量产生任何明显的影响。方法论:

  • cat /proc/self/mountstats > /dev/shm/mountstats.start
  • 跑步rsync
  • mountstats mountstats --since /dev/shm/mountstats.start > nfs.mountstats.rsync.txt
  • mountstats iostat --since /dev/shm/mountstats.start > nfs.iostat.rsync.txt
NFSv3 client 

           ops/s       rpc bklog
        1874.078           0.000

read:              ops/s            kB/s           kB/op         retrans    avg RTT (ms)    avg exe (ms)
                   0.000           0.000           0.000        0 (0.0%)           0.000           0.000
write:             ops/s            kB/s           kB/op         retrans    avg RTT (ms)    avg exe (ms)
                 159.312         228.017           1.431        0 (0.0%)           0.720           0.843
NFSv4.2 client

           ops/s       rpc bklog
        1436.392           0.000

read:              ops/s            kB/s           kB/op         retrans    avg RTT (ms)    avg exe (ms)  avg queue (ms)          errors
                   0.025           0.062           2.449        0 (0.0%)           0.500           0.500           0.000        0 (0.0%)
write:             ops/s            kB/s           kB/op         retrans    avg RTT (ms)    avg exe (ms)  avg queue (ms)          errors
                 129.076         201.433           1.561        0 (0.0%)           0.322           0.407           0.061        0 (0.0%)

挂载统计信息

编辑:9月11日 9:33

我使用 Debian“Bookworm”12 制作了额外的 NFS 服务器,并在 nvme 驱动器上创建了一个简单的非 Kerberized NFS 4.2 共享。没有什么区别,同样rsync需要50秒左右。所以,这是不是显然是操作系统/内核/硬件问题,但它与 NFS 相关。

然后,我使用 NFSv3 挂载相同的共享,大约rsync花费了 26 秒。那么,与 NFSv3 相比,NFSv4 真的慢吗?

编辑:9月11日18:29(回应@ron的回答)

您是系统上唯一的另一个人吗(nfs 服务器和 nfs 客户端)

目前我有两种设置,一种与其他机器共享,但在测试时几乎没有人使用共享,并且 I/O 处于空闲水平。第二个设置是私有的。

是否有任何其他网络负载;

测试时不超过“空闲”流量。我们有 10 Gbps 核心光纤上行链路,工作站有 1 Gbps 上行链路。惠普企业交换机。为了最大限度地减少网络问题(我们也不希望通过路由器推送此流量),NFS 服务器和所有工作站都位于同一子网中并连接到同一交换机。这不是一个新设置,我只是尝试从 NFSv3 切换到 NFSv4。

您设置网络并完全控制交换机/路由器,>或者这一切都是由您从未见过的人设置和管理的

我控制硬件并进行设置。

也可能与 kerberos 安全设置一起......增加安全性以提高性能,从来没有人说过。

我尝试了 Kerberized 和非 Kerberized 挂载,两者都表明 NFSv3 比 NFSv4 更快。

我绊倒了这是偶然的。我们有近 200 个无盘启动工作站。总体来说一切正常。今年,当使用 NFSv4 设置新系统(最新的 Debian 12)时,我注意到复制解压的存档(带有大量小文件、图标、一些符号链接)有点长。所以我决定检查复制是否需要关于(我愿意不是关心小的变化)同时在以前的 NFSv3 系统上。事实证明,在 NFSv4 上需要更长的时间。我尝试过使用和不使用 Kerberos,始终使用 TCP ( proto=tcp)。

我认为等式中有很多变量,所以请让我们暂时忘记 Kerberos 等。我设置了这个私有系统:

  • 无 Kerberos
  • 服务器导出位于 NVME 驱动器上的单个目录
  • 客户端挂载导出的目录,没有 kerberos,只有nfsvers=4.2,ac,rw
  • 客户端和服务器都是具有 1 Gbps 以太网的 Dell 工作站
  • 客户端和服务器都连接到同一交换机并且位于同一子网(VLAN)中,因此网络流量中没有路由器
  • 客户端和服务器都运行相同的操作系统和内核:Debian 12“Bookworm”6.1.0-12-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.52-1 (2023-09-07)

然后我做了(几次)这个简单的测试:

大约花了50秒。

  • 然后我使用 NFSv3 重新安装了这个共享
  • 并重复相同的测试

大约花了30秒。

因此,相同的机器、相同的网络、没有 kerberos、相同的系统、相同的内核,只有 NFS 版本不同——并且存在很大的差异。这很有趣,我想知道发生了什么并学习一些东西。此时此刻,考虑到所有这些因素,我没有其他答案,只是 NFSv4 速度更慢。我发现了有关 NFSv4 性能的非常旧的文章,并预计此后发生了很多变化,但在本例中可能不是这样?

NFSv4 文件创建速度实际上大约是 NFSv3 文件创建速度的一半, https://www.linux.com/news/benchmarking-nfsv3-vs-nfsv4-file-operation-performance/

就我而言,我在挂载的 NFS 共享上创建了很多小文件。

为什么对许多小文件进行尝试很重要?因为学生使用 Git,大型 IDE 创建许多小文件,有时甚至数百个甚至更多,学生编译很多软件等等。并且有很多学生 - 成千上万的小文件。

9月12日10:55(测试结果)

我们在传输大文件方面从未遇到过任何问题,我们每天都会这样做,并且速度约为全上行速度。但无论如何我都用大文件进行了复制测试。/nvme是 NFS 共享。

/dev/shm ➽ $ dd status=progress if=/dev/zero of=test.file bs=1M count=6000
3488612352 bytes (3,5 GB, 3,2 GiB) copied, 1 s, 3,5 GB/s
6000+0 records in
6000+0 records out
6291456000 bytes (6,3 GB, 5,9 GiB) copied, 1,80348 s, 3,5 GB/s
[orange14] /dev/shm ➽ $ rsync --verbose --progress test.file /nvme/test.file

sent 6.292.992.082 bytes  received 35 bytes  105.764.573,39 bytes/sec
total size is 6.291.456.000  speedup is 1,00

我也复印了几份scp并记录了时间。

[orange14] /dev/shm ➽ $ time scp test.file /nvme/test.file6

real    0m59,463s
real    0m59,700s
real    0m59,780s

约为 105 MB/s。

至于使用更大内存的机器进行测试,我现在没有多余的服务器可以用于此目的,目前我没有那么多时间来进行 NFS 的此类详细测试。我对小文件重复了一些测试并绘制了它们。服务器和客户端都是 Dell 工作站,相同的操作系统,相同的内核,没有 Kerberos,只是简单的 NFSv3 或 NFSv4.2 共享。我一遍又一遍地复制同一个档案。

nfs测试

亲切的问候

答案1

... 25000 个小文件

我的第一个倾向是一般系统开销和文件系统 I/O,尽管它不是磁盘I/O 因为您是从 tmpfs 运行,所以是导致可变性的罪魁祸首,也可能与 kerberos 安全设置一起......从来没有人说过,增加安全性可以提高性能。

,除非你运行实时内核为了排除变异性,您会看到一些变异性。然后得出结论,因为 NFS v3 与 v4 或任何其他 NFS 参数可能大多不正确,您将追寻自己的尾巴。

你没有提到许多其他重要的事情 -

  • 您是系统上唯一的另一个人吗(nfs 服务器和 nfs 客户端)
  • 是否有任何其他网络负载;
  • 涉及的网络布局和硬件以及是否有可能产生影响?您设置网络并完全控制交换机/路由器,或者这一切都是由您从未见过的人设置和管理的

我对 debian 不熟悉,但是在 RHEL 中有调谐默认配置文件是吞吐量性能其中 * 广泛适用的调整,可在各种常见服务器工作负载中提供出色的性能。* 其他可能有益的配置文件是延迟性能,网络延迟, 或者网络吞吐量。这是我能告诉你的最好的信息,你需要对其进行更多研究:https://www.redhat.com/sysadmin/linux-tuned-tuning-profiles

https://www.redhat.com/sysadmin/linux-tuned-tuning-profiles

你说25,000 个文件,每个文件小于 10kb。总共大约 250MB,在我看来,用作参考太少了,除非您的两个系统在硬件上相同,在操作系统设置和配置上也相同,唯一的变量是 NFS v3 与 v4.0/4.1/4.2,否则您将用数字追你的尾巴。

无论如何,我试图了解挂载协议的 NFS v3 与 v4.0/4.1/4.2 以及 udp 与 tcp 之间是否存在性能差异。在相同的服务器上使用 RHEL 8.8,具有 Xeon 24 核 cpu 和 768GB 的​​ RAM,通过test.tar复制一个大小约为 25GB的文件rsync -P来显示速度,并使用它tmpfs来帮助排除磁盘 I/O,我没有看到性能上的差异,这是超过 100gbps 的 InfiniBand,使用 Mellanox 交换机,只有我在实验室环境中的服务器和网络上。在复制几分钟后,所有不同的 NFS 参数都能达到观察到的最大值约 490 MB/s,平均约 470 MB/s - 有趣的是,重新启动后,第一次复制可以达到速度慢至 340 MB/s,但进行后续复制时,我最终会达到 490 MB/s 的峰值。这就是我愿意花时间来了解我是否应该在集群设置中使用带有 UDP 的 NFS v3 与 v4.2 和 TCP 的情况;我确实发现proto=rdma我的一个文件副本的速度比 TCP 提高了 5% 到 15%;所以proto=rdma是最好的。在 1gbps 网络上,我发现的所有内容都在 nfs 服务器端async,而不是sync导致任何显着的速度提高,在 infiniband 上它没有影响。您的 NFS 参数的某些组合是否会导致 NFS v4.2 比 v3 慢,我可能不知道。但要问NFS v4.2 比 v3 慢吗 根据我试图理解的内容,我会说不,并且根据 v3 的 nfs v.2 的改进记录,它应该会更好。pnfsnfs v4也支持。

我还发现 RHEL 7.9 和 8.8 在 infiniband 和 NFS 方面存在显着的速度差异; RHEL 8.8 中的ascp将达到 1.0 GB/秒,而 RHEL 7.9 中则低于 600 MB/秒,NFS 中也存在类似差异,其中 RHEL 8.8 更好,与rhel8.8nfs-utils-1.3相比。nfs-utils-2.whatever我不知道 debian、书呆子还是 Bullseye,如果您运行的操作系统和最新的 NFS 版本不同……在我看来,所有这些都很重要。 我希望看到更多发布的 ​​NFS v4.2 性能数据,作为管理员应该期望看到的数据,以了解配置是否正确或是否存在问题。

NFS 速度测试第一步的建议:

  • 制作一个test.tar文件;对于 1gbps 网络,我会将其设置为 2 到 10 GB 之间的任何位置
    • dd if=dev/zero of=test.tar bs=10G count=1
    • du -sh test.tar
  • 用于rsync -P <source> <destination>将 `test.tar 复制到 nfs_server 和 nfs_client 或从 nfs_server 和 nfs_client 复制
    • 观察报告的最大速度
    • 完成后观察平均报告速度
    • 观察第二次和后续调用,因为第一次可能是与 NFS 无关的首次开销;您必须进行 3 次或更多后续尝试以确保时代的发展。
  • mount -t tmpfs -o size=100G tmpfs /scratch在 nfs_server 和 nfs_client 上执行 a 操作,并test.tar在向每个系统复制或从每个系统复制时将其定位到那里,以帮助排除磁盘 I/O。相应地调整大小,我假设使用具有 128GB 以上 RAM 的服务器。你显然希望这个 tmpfs 比你的大test.tar
  • exportfs -s在服务器端注意同步或异步等导出选项
  • mount在客户端注意挂载选项,例如 nfsversprotomountprotoofudp|tcp|rdma
  • 注意一个scp 安全副本作为健全性检查,在两个系统之间通过 ssh 进行传输,在 1gbps 网络上,传输速度应约为 112 MB/秒,如果不是,并且明显低于约 105 MB/秒,则不会因其他原因而减慢速度,因此不要期望 NFS 能够以 100% 的速度运行。 10gb test.tar 以 112 MB/秒的速度运行应该需要 89 秒。我也通过 samba 复制到 Windows 10 电脑上看到了这一点。
  • 所有这些都是为了让同类之间的比较变得简单,从这里开始,第 2 步将安排一个场景,其中您有许多较大的文件与许多较小的文件。

相关内容