我有两个无盘系统设置。它们都/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
。另外,我安装了/home
with 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)
然后我做了(几次)这个简单的测试:
- 获取包含要复制到的文件的存档
/dev/shm
。这个:https://github.com/vinceliuice/Tela-icon-theme/archive/refs/tags/2023-06-25.tar.gz - 解压存档
rsync --links -r unpacked_archive /path/to/mounted/nfsshare/dest
大约花了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 共享。我一遍又一遍地复制同一个档案。
亲切的问候
答案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 的改进记录,它应该会更好。pnfs
nfs 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
在客户端注意挂载选项,例如 nfsvers
和proto
和mountproto
ofudp|tcp|rdma
- 注意一个
scp
安全副本作为健全性检查,在两个系统之间通过 ssh 进行传输,在 1gbps 网络上,传输速度应约为 112 MB/秒,如果不是,并且明显低于约 105 MB/秒,则不会因其他原因而减慢速度,因此不要期望 NFS 能够以 100% 的速度运行。 10gb test.tar 以 112 MB/秒的速度运行应该需要 89 秒。我也通过 samba 复制到 Windows 10 电脑上看到了这一点。 - 所有这些都是为了让同类之间的比较变得简单,从这里开始,第 2 步将安排一个场景,其中您有许多较大的文件与许多较小的文件。