![通过 SSH 进行 Rsync 传输非常慢](https://linux22.com/image/617622/%E9%80%9A%E8%BF%87%20SSH%20%E8%BF%9B%E8%A1%8C%20Rsync%20%E4%BC%A0%E8%BE%93%E9%9D%9E%E5%B8%B8%E6%85%A2.png)
我正在对我的网站进行远程备份。整个目录大约有 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 万个文件中的每一个生成一个哈希值,并将其发送到网络上,才能发现是否有任何变化。
如果是我,我会把它包装成一个在源服务器上运行的脚本,
检查上次成功同步的开始时间 (tstart)
查找源中所有具有 mtime > tstart 的文件
将修改过的文件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),检查硬件故障