我遇到了一个奇怪的问题。我通常用rsync
它来在服务器之间同步文件,但现在这个实用程序的行为很奇怪。
首先,这是我使用的命令:
server1# rsync -av -e ssh ./server1_dir/ [email protected]:/server2_dir/
它按预期启动同步过程,但没有同步任何文件,只同步了目录。实际上并不是所有目录,因为该rsync
过程挂起很长时间,导致超时错误。
如果我终止该进程并再次尝试,它根本无法启动。我看到的唯一消息是:
sending incremental file list
我首先想到的是防火墙。但两台服务器都没有安装防火墙。我甚至尝试手动编译最新rsync
版本,但没有成功。
有人能帮我解决这个问题吗?非常感谢。
更新。server1 上的 strace 输出
root@server1 [~]# ps auxf|grep [r]sync
root 13958 0.0 0.0 70676 1232 pts/0 S+ 23:29 0:00 | \_ rsync -avv -e ssh directory1 [email protected]:/home
root 13959 0.0 0.2 58436 3256 pts/0 S+ 23:29 0:00 | \_ ssh -l root 192.168.1.1 rsync --server -vvlogDtpre.isf . /root
root@server1 [~]# strace -p 13959
Process 13959 attached - interrupt to quit
select(7, [3 4], [], NULL, NULL
答案1
最后,问题解决了。虽然难以置信,但主网络接口上的 MTU 设置不正确。将 MTU 更改为 1460 后,同步过程已启动并立即完成。感谢大家的回答。
答案2
我最近遇到了同样的情况。两边的 strace 都显示它们在 select() 中等待另一边。然后我注意到服务器端在 netstat 中有一个很大的发送队列,所以我开始寻找网络级解决方案。我尝试像上面那样减少 MTU,但没有什么效果。然后我禁用了两边的 SACK,rsync 又开始工作了:
echo 0 > /proc/sys/net/ipv4/tcp_sack
有一些关于思科选择性确认和序列号随机化错误的讨论,这至少是造成这种差异的一个合理原因。