Rsync通过SSH传输非常缓慢

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

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

进程运行超过48小时,只是挂起。

我已经在客户端(网站所在的web服务器)上运行了rsync进程的strace -p ,并且在一段时间之后,该进程定期停止在以= 0 (Timeout)结尾的select命令,然后继续。

 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) 

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

为什么会这样呢? 为什么这个过程需要很长时间,而且还没有达到目的? 那么strace中的0 (Timeout)是什么意思呢?

两台服务器都运行rsync 3.0.9,IO不会超载。

那么strace中的0(Timeout)是什么意思呢?

去阅读第5个parameter passing给select 。

显然,rsync(自己)不适合你select备份文件的方法。 它必须为500万个文件中的每一个文件生成一个哈希值,并通过networking发送这个哈希值来查找是否有任何改变。

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

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

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

  3. rsync将这些文件修改为备份服务器

例如

 #!/bin/bash touch newrun find /var/www -newer lastrun -exec rsync .... rm -f lastrun mv newrun lastrun 

你确定你有五十亿个文件吗?

我宁愿tgz和rsync的tgz,因为从src到dst的初始比较将永远如果你有一些“正常”的高清,没有高速的SAN或SSD。

你的stream程在哪里很慢? 在文件传输期间或在初始src < – > dst – 检查?(发送增量文件列表…)

如果可能,我会在两端检查IOWAIT。 如果机器有md-raid,cat / proc / mdstatus。 非常糟糕的io性能可能是一个重buildraid(但不太可能)的结果。

我想用一个单一的大文件传输 – 在rsync传输过程中打开--progress来检查networking速度。

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

  • 尝试rsync与-avzh –progress –stats
  • io在当地的performance
  • networking性能
  • hd / raid-status(SMART),检查有问题的硬件