通过 SSH 进行 Rsync 传输非常慢

通过 SSH 进行 Rsync 传输非常慢

我正在对我的网站进行远程备份。整个目录大约有 70GB,总共有大约 5,000,000 个文件。这是我在备份服务器上运行的命令:

rsync -ah -e ssh --delete --link-dest=/backups/2013.09.06 [email protected]:/var/www/backups/2013.09.07

进程运行超过 48 小时并且挂起。

strace -p我在客户端(网站所在的网络服务器)上运行了rsync 进程并发现,该进程会在select命令结束= 0 (Timeout)后定期停止一段时间,然后继续。

open("mysite/files/1694201", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=10083, ...}) = 0
read(3, "\r\n\320\224\320\265\321\201\321\217\321\202\321\214 \320\273\320\265\321\202, \321\210\320\265\321\201\321\202\321"..., 10083) = 10083
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999998})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\320\260\320\262\320\260\320\271\321\202\320\265...\320\232\320\270\320\264\320\260\320\271\321\202\320\265 \320\274"..., 4092) = 4092
select(2, NULL, [1], [1], {60, 0})      = 1 (out [1], left {59, 999999})
write(1, "\374\17\0\7", 4)              = 4
select(2, NULL, [1], [1], {60, 0})      = 0 (Timeout)

进程在最后一行挂起一分钟左右。

为什么会发生这种情况?为什么这个过程花费了这么长时间并且永远无法结束?0 (Timeout)strace 中的那些是什么意思?

两台服务器都运行 rsync 3.0.9,IO 没有过载。

答案1

strace 中的 0 (超时)是什么意思?

去阅读第五个参数已传递至选择

显然,rsync(单独使用)不适合您选择的文件备份方法。它必须为 500 万个文件中的每一个生成一个哈希值,并将其发送到网络上,才能发现是否有任何变化。

如果是我,我会把它包装成一个在源服务器上运行的脚本,

  1. 检查上次成功同步的开始时间 (tstart)

  2. 查找源中所有具有 mtime > tstart 的文件

  3. 将修改过的文件rsync到备份服务器

例如

#!/bin/bash

touch newrun
find /var/www -newer lastrun -exec rsync ....
rm -f lastrun
mv newrun lastrun

答案2

你确定你有 50 亿个文件吗?

我宁愿使用 tgz 和 rsync 而不是 tgz,因为如果你有某种“普通”的硬盘,没有高速 SAN 或 SSD,那么从 src 到 dst 的初始比较将需要很长时间。

您的进程在哪里变慢?在文件传输期间或初始 src<->dst 期间 - 检查?(发送增量文件列表...)

如果可能的话,我会检查两端的 IOWAIT。并且,如果机器有 md-raid,cat /proc/mdstatus。非常糟糕的 io 性能可能是重建 raid 的结果(但可能性很小)。

并且我想在 rsync-transfer 期间打开开关来传输单个大文件--progress以检查网络速度。

调试提示(你应该测试每一个可能的瓶颈,甚至只是为了确保:这不是问题)

  • 尝试使用 -avzh --progress --stats 进行 rsync
  • 本地 io 性能
  • 网络性能
  • hd/raid-status (SMART),检查硬件故障

相关内容