![如何以尽可能少的 CPU 和带宽消耗来 rsync 一个大文件?](https://linux22.com/image/1241962/%E5%A6%82%E4%BD%95%E4%BB%A5%E5%B0%BD%E5%8F%AF%E8%83%BD%E5%B0%91%E7%9A%84%20CPU%20%E5%92%8C%E5%B8%A6%E5%AE%BD%E6%B6%88%E8%80%97%E6%9D%A5%20rsync%20%E4%B8%80%E4%B8%AA%E5%A4%A7%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个 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/了解更多信息。