如何以尽可能少的 CPU 和带宽消耗来 rsync 一个大文件?

如何以尽可能少的 CPU 和带宽消耗来 rsync 一个大文件?

我有一个 500 GB 的文件,计划远程备份。该文件经常更改。我将把它从桌面同步到服务器。两者都可以运行 rsync 客户端或服务器。

正确的命令是什么?到目前为止,我尝试过的命令都花了很长时间,或者只是表现得很奇怪。

示例和结果:

rsync -cv --partial --inplace --no-whole-file /desktop/file1 myserver.com::module/file1 

似乎有效,但只有我做两次才有效 (?!)。而且很慢。

上述命令是否在两台计算机上执行校验和,还是仅在发送方计算机上执行校验和?否则是否正确?

答案1

它永远不会很快,因为 rsync 必须读取/校验整个文件,并且读取 500GB 将需要很长时间,除非你将它存储在 SSD 或其他地方。

尝试rsync -vhz --partial --inplace <file/server stuff>

-c意味着在进行任何传输之前,它会对整个文件进行校验,而不是使用时间戳来查看它是否已更改,这意味着要读取整个文件两次。如果时间戳没有更改(应该更改),那么您可以在touch运行 rsync 之前只读取文件。

如果没有脚本,您可以添加它--progress,这样您就可以看到它在运行时的运行情况。

答案2

虽然它不是 rsync,但根据您要执行的操作,它可能效果更好。我曾经执行过类似的备份任务,它的速度肯定更快。

使用 netcat 从一台机器到另一台机器建立 tar 管道。

在源计算机上:

tar -cpv --atime-preserve=system . | nc -q 10 -l -p 45454

您正在创建一个保留权限和时间的 tarball,然后将其通过管道传输到端口 45454 上的 netcat

在您的备份机器上

nc -w 10 X.X.X.X 45454 | tar -xpv

X.X.X.X= 源机器的本地 IP 地址。

对我来说,这个方法效果很好。它在有线局域网上的运行速度为 25-30 MB/s,而使用 rsync 时则为 2-3 MB/s。缺点是:它不同步,只是复制源上的内容。但是对于像您描述的备份(一个 500GB 的文件),它可以很好地工作。

您可能必须以 root 身份执行此操作以避免权限问题,或者您可能会很幸运。

FWIW,我最初是在这里了解到这一点的:http://www.screenage.de/blog/2007/12/30/using-netcat-and-tar-for-network-file-transfer/

答案3

为了避免网络开销,只需使用 rsync 协议而不是 SSH。默认情况下,rsync 在指定 URL(如 hostname:/path)时使用 SSH。改用 rsync://hostname/path 来使用更快的 rsync 协议。这样就不需要使用 tar/netcat 技巧了。rsync delta 算法应该快得多。

也可以看看https://gergap.wordpress.com/tag/rsync/了解更多信息。

相关内容