我们使用 rsync 来同步两个 NFS 服务器的数据。一台 NFS 服务器位于东海岸,另一台位于西海岸。RTT约为110ms。
在东海岸 NFS 服务器上,我安装了西海岸 NFS 服务器安装点。
<server>:/home/backups on /mnt/backups type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5,clientaddr=x.x.x.x,local_lock=none,addr=y.y.y.y)
。
数据已经在两台服务器上,只是为了验证数据(例如同步文件夹以及何时不需要更改)。以下是验证 7GB 文件夹的东海岸服务器与西海岸服务器相同所需的时间。
以下大约需要8分钟才能完成超过7GB的数据。
rsync -r -vvvv --info=progress2 --size-only /<local_path>/ /<remote_path>/
以下(避免使用NFS挂载)大约需要15秒才能完成超过7GB的数据(同上)。
rsync -r -vvvv --info=progress2 --size-only /<local_path>/ <user>@<west_cost_NFS>:/<remote_path>/
同样,上面的内容不会移动任何数据,因为文件夹已经同步,它只是验证数据是否相同(基于文件的大小)。
我尝试-o async
在客户端和服务器上使用,但当我在客户端上运行“mount”时,/etc/exports
async
客户端永远不会显示。async
我认为async
是默认的。我尝试过将 rsize、wsize 也更改为更大的值,但性能并没有变得更好。我是否完全可以从 NFS 中获得更好的性能?
在我看来,你试图使用 rsync 是错误的。Rsync 的协议专为比较/同步两个独立服务器上的大型文件系统的确切场景而设计。它在本地和本地都尽力而为在进行中间比较之前,
其协议的设计使得一台机器上的 rsync 代理与另一台机器上的 rsync 代理进行通信,并且该协议旨在大幅减少完成任务所需的往返次数(和总数据)。
rsync 的设计目的是:
[fast] [slow SSH] [fast]
File system <----> rsync <----------> rsync <----> File system
Run Code Online (Sandbox Code Playgroud)
Rsync 针对两个代理之间的网络性能进行了优化,但它无法控制用于访问磁盘的协议。因此,当您挂载远程 NFS 文件系统时,您会更改网络访问配置文件:
[fast] [fast] [slow NFS]
File system <----> rsync <------> rsync <---------> File system
Run Code Online (Sandbox Code Playgroud)
Rsync 对此无能为力,因为它完全无法控制 NFS 协议。
这里的一个具体区别是,通过 NFS,每个文件都必须单独请求。要探索包含的文件树,/foo/bar/baz
您必须请求/
[wait],然后请求/foo
[wait],然后请求/foo/bar
[wait],最后请求/foo/bar/baz
。如果每个请求有 110 毫秒的延迟,那么延迟就是 330 毫秒,而且您只获得一个文件。
代理之间的 Rsync 协议没有此限制。在远程计算机上运行的代理会急切地编译远程文件系统中正在同步的每个文件和目录的列表,并发送所有内容。对于整个文件树只有一个请求!