为什么 rsync 比 NFS 快?

grs*_*grs 44 linux ubuntu optimization nfs rsync

几天前,我注意到一些很奇怪的事情(至少对我而言)。我运行 rsync 复制相同的数据,然后将其删除到 NFS 挂载,称为/nfs_mount/TEST. 这/nfs_mount/TEST是从nfs_server-eth1. 两个网络接口上的 MTU 都是 9000,中间的交换机也支持巨型帧。如果我这样做,rsync -av dir /nfs_mount/TEST/我将获得 X MBps 的网络传输速度。如果我这样做,rsync -av dir nfs_server-eth1:/nfs_mount/TEST/我的网络传输速度至少为 2X MBps。我的 NFS 挂载选项是nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

底线:两种传输都通过相同的网络子网、相同的线路、相同的接口、读取相同的数据、写入相同的目录等。唯一不同的是,一个是通过 NFSv3,另一个是通过 rsync。

客户端是 Ubuntu 10.04,服务器是 Ubuntu 9.10。

为什么 rsync 快得多?如何使 NFS 匹配该速度?

谢谢

编辑:请注意我使用 rsync 写入 NFS 共享或 SSH 到 NFS 服务器并在本地写入。两次我都这样做rsync -av,从明确的目标目录开始。明天我将尝试使用普通副本。

Edit2(附加信息):文件大小范围为 1KB-15MB。文件已经被压缩,我试图进一步压缩它们但没有成功。我tar.gz从那个dir. 这是模式:

  • rsync -av dir /nfs_mount/TEST/ = 最慢的传输;
  • rsync -av dir nfs_server-eth1:/nfs_mount/TEST/= 启用巨型帧的最快 rsync;不使用巨型帧会慢一点,但仍然比直接使用 NFS 快得多;
  • rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/ = 与其非 tar.gz 等效项大致相同;

使用cp和 进行测试scp

  • cp -r dir /nfs_mount/TEST/= 比 略快,rsync -av dir /nfs_mount/TEST/但仍然比 慢得多rsync -av dir nfs_server-eth1:/nfs_mount/TEST/
  • scp -r dir /nfs_mount/TEST/= 整体最快,略胜一筹rsync -av dir nfs_server-eth1:/nfs_mount/TEST/
  • scp -r dir.tar.gz /nfs_mount/TEST/ = 与其非 tar.gz 等效项大致相同;

结论,基于此结果:对于此测试,使用 tar.gz 大文件或许多小文件没有显着差异。打开或关闭巨型帧也几乎没有区别。cp并且scp比它们各自的rsync -av等价物更快。无论使用何种方法,直接写入导出的 NFS 共享都比通过 SSH 写入同一目录慢得多(至少 2 倍)。

在这种情况下,cp和之间的差异rsync不相关。我决定尝试cpscp只是为了看看他们是否表现出同样的模式,他们这样做- 2倍的差异。

在我使用rsynccp在这两种情况下,我无法理解是什么阻止了 NFS 通过 SSH 达到相同命令的传输速度。

为什么写入 NFS 共享比通过 SSH 写入同一个地方慢 2 倍?

EDIT3(NFS服务器的/ etc / exports中的选项)rw,no_root_squash,no_subtree_check,sync。客户端的的/ proc /坐骑显示:nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp

谢谢你们!

Mas*_*imo 23

NFS 是一种共享协议,而 Rsync 是针对文件传输进行了优化;当您先验地知道您的目标是尽可能快地复制文件而不是提供对它们的共享访问时,可以进行许多优化。

这应该会有所帮助:http : //en.wikipedia.org/wiki/Rsync

  • @lsd - ssh 压缩通常默认关闭,不推荐用于 rsync。允许 rsync 使用选项 `-z`、`--compress-level` 和 `--skip-compress` 压缩数据将获得比使用压缩传输更好的性能。 (5认同)
  • 如果您事先知道数据(您通常会这样做),您可以使用选项`-e "ssh Compression=no"` 有选择地关闭压缩,以获得更快的传输速度。这将防止它压缩可能已经压缩的文件。我注意到速度加快了很多次。 (2认同)

not*_*ter 23

也许不是传输速度变慢,而是写入延迟增加。尝试挂载 NFS 共享异步而不是同步,看看是否可以缩小速度差距。当您通过 ssh 进行 rsync 时,远程 rsync 进程会异步(快速)写入。但是当写入同步挂载的 nfs 共享时,写入不会立即得到确认:NFS 服务器会等待直到它们命中磁盘(或者更有可能是控制器缓存),然后再向 NFS 客户端发送写入成功的确认。

如果“异步”解决了您的问题,请注意,如果 NFS 服务器在写入过程中发生问题,您很可能最终会在磁盘上出现不一致的数据。只要这个 NFS 挂载不是这个(或任何其他)数据的主要存储,你可能会没事。当然,如果您在 rsync-over-ssh 运行期间/之后拔掉了 nfs 服务器上的插头(例如,rsync 返回“已完成”、nfs 服务器崩溃、写入缓存中未提交的数据现在丢失),您将处于同一条船上在磁盘上留下不一致的数据)。

尽管您的测试(rsyncing 新数据)不是问题,但请注意,在计算校验和并生成需要传输的文件列表时,在传输单个字节之前,通过 ssh 的 rsync 会对远程服务器产生显着的 CPU 和 IO 需求更新。

  • 更新:我的新测试表明,在同步与异步 NFS 导出选项的速度方面存在显着差异。使用 async 和 `rsync -av dir.tar.gz /nfs_mount/TEST/` 挂载 NFS 后,我获得了与 `rsync -av dir nfs_server-eth1:/nfs_mount/TEST/` 相同的传输速度。我会将这个答案标记为正确答案,但我很好奇是否可以进一步改进设置。谢谢!干得好! (3认同)

pcu*_*ite 5

Rsync 是一种文件协议,仅在文件之间传输更改的位。NFS 是一种远程目录文件协议,每次都处理所有内容……在某种程度上有点像 SMB。两者是不同的,用于不同的目的。您可以使用 Rsync 在两个 NFS 共享之间传输。

  • 我觉得对你投反对票有点不好,因为你没有说任何技术上的错误,但你似乎没有在讨论中添加任何内容,并且在提供了更具体的信息之后你进来了。此外,从他的帖子来看,作者似乎知道这些事情。 (6认同)