我正在通过千兆位 LAN 传输大约 9TB 的数据。为了尽快完成此操作(我希望),我通过 NFS 将目标安装在源上,并在其上运行 rsync。
这是我的安装选项:
x.x.x.x:/mnt on /mnt type nfs (rw,noatime,nodiratime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=x.x.x.x,mountvers=3,mountport=56548,mountproto=udp,local_lock=none,addr=x.x.x.x)
这是我的 rsync 命令:rsync -avWH --progress ./ /mnt/
看看 nload,我发现单个文件的速度飙升至 900MBps,然后下降到 KBps 范围内的数字,然后回升。这是来自 nload 的图形,您可以在其中看到传输似乎停止了,中间文件。这些文件的大小通常为 5-6GB。 MTU为9000;交换机是 cisco 3750x,具有足够的背板速度。这些是 2 个不同主机上的 esxi 6.7 来宾。没有其他客人争夺网络资源。
该图像是正在发送的一个文件
基本上,我希望有一个设置是错误的,或者我可以更改一些设置以保持传输速度保持一致。
源上的 CPU 利用率约为 10%,目标上的 CPU 利用率约为 10%。奇怪的是,在目标上,iotop 显示来自 nfsd 的 99% I/O(有时),源显示来自 rsync 的 60-80% IO。这些是 7200RPM WD 红色硬盘。 w
答案1
不幸的是,最糟糕的事情就是rsync
跨 NFS 使用。 (或者安装到本地系统中的任何远程文件系统。)这会关闭几乎所有rsync
已知的效率增强功能。
对于如此多的数据,在系统之间传输数据的最快方法之一可能是将其转储到未加密的连接而不考虑目标系统上已有的内容。
一旦您至少拥有部分副本,最好的选择是rsync
在两台主机之间使用。这允许rsync
在每台主机上运行一个进程来考虑和比较差异。 (rsync
将完全跳过具有相同大小和修改日期的文件。对于其他文件,客户端和服务器组件将执行滚动校验和以确定仍需要传输哪些块。)
快速转储。此示例根本不使用身份验证或加密。不过,它确实应用了压缩,您可以通过省略这两个
-z
标志来删除压缩:在目标计算机上运行此命令以启动侦听服务器:
cd /path/to/destination && nc -l 50505 | pax -zrv -pe
在源机器上运行此命令以启动发送客户端:
cd /path/to/source && pax -wz . | nc destination_server 50505
某些版本
nc -l
可能需要使用标志指定端口,即nc -l -p 50505
。 Debian 上的 OpenBSD 版本(nc.openbsd
通过 链接/etc/alternatives
到/bin/nc
)则不然。传输速度较慢。此示例使用
rsync
overssh
,它提供身份验证和加密。不要错过/
源路径上的尾部斜杠 ( )。-z
如果您不想压缩,请省略该标志:rsync -avzP /path/to/source/ destination_server:/path/to/destination
您可能需要设置 SSH 证书以允许以 root 身份登录destination_server。-H
如果您需要处理硬链接,请添加该标志。
答案2
如果可能的话,最好直接在两台主机之间使用 rsync。请记住,rsync 的构建是为了优化网络 IO,但代价是增加磁盘 IO;当在 NFS 文件系统上使用 rsync 时,磁盘 IO 会转换为网络 IO,因此这是一个非常次优的解决方案。此外,如果 rsync 认为源和目标都是本地的,它会关闭优化并每次传输完整的文件,而不是使用仅发送差异的差分算法。
假设您有一个 5GB 的文件,源和目标之间的数据仅存在 1% 的差异。
- 在主机之间传输时,rsync会对源文件和目标文件进行校验,只传输差异部分;在目标上,使用旧文件和源中的新数据重新创建文件,然后替换旧文件。
- 在本地传输时,对每个文件进行校验和是没有意义的,这意味着您必须为示例文件读取 2 x 5GB 并写入 1 x 5GB。通过切换到整个文件模式,rsync 只需要读取 1 x 5GB 和写入 1 x 5GB。在本地磁盘上,这是完全有道理的,当一个磁盘是 NFS 时,网络带宽会飙升。
如果您可以直接使用 rsync 到服务 NFS 文件系统的主机,那么这样做,您将看到性能的巨大改进。