rsync 挂起,除非我对 ext4 文件系统进行碎片整理

rsync 挂起,除非我对 ext4 文件系统进行碎片整理

我有一个正在运行的 XBian 服务器(Raspberry Pi 版本的 Debian)同步通过 inetd (不是本机守护进程)。我正在提供几个目录外部4文件系统(在 USB 磁盘上)作为单独的模块(相关模块大约有 100-500 GB 的数据和 1000-10000 个文件)。我注意到最近,当我更改文件系统的其他部分(即上传、复制等,不一定在上述目录中)时,对这些模块的 rsync 调用将会超时。

对于像这样的例行 rsync 命令rsync -vrt rsync://host:port/module ./,我不希望需要任何文件传输(即服务器和客户端位置都具有相同的数据),在 rsync 服务器日志文件中,我看到如下日志:

2014/12/15 22:59:59 [###] connect from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] rsync on share/ from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] building file list
2014/12/15 23:16:23 [###] rsync: read error: Connection timed out (110)
2014/12/15 23:16:23 [###] rsync error: error in socket IO (code 10) at io.c(785) [sender=3.1.1]

在客户端日志中,我看到如下日志(是的,相同的传输 - 服务器在 15 分钟后报告超时,而客户端在 30 分钟后报告错误):

2014/12/15 23:00:01 [###] receiving file list
2014/12/15 23:29:26 [###] rsync: read error: Connection reset by peer (104)
2014/12/15 23:29:26 [###] rsync error: error in rsync protocol data stream (code 12) at /usr/src/ports/rsync/rsync-3.0.9-1/src/rsync-3.0.9/io.c(764) [Receiver=3.0.9]

任何数量的问题都可能导致这样的情况,但在对我注意到的其他问题的几个文件进行碎片整理后,我还注意到我的 rsync 传输将再次开始成功完成。然后,在我上传更多文件(再次上传到 rsync 模块外部的目录)后,我会看到超时返回。现在,每当我看到我的日志有超时错误时,我都会进行碎片整理(使用e4碎片整理)我的系统然后可以再次成功运行 rsync 传输。

一些附加说明:

  • 我的 ext4 分区目前使用的可用空间不到 50%
  • 我对其他较小模块的 rsync 调用不会超时
  • 即使没有数据传输的调用(例如rsync -rt rsync://host:post/module)也会在这种状态下超时
  • 经过进一步测试,碎片整理后似乎可以运行同步在我需要再次进行碎片整理之前成功调用一次(是否同步调用实际上会导致文件碎片吗?)

为什么我的 rsync 设置每次都需要进行碎片整理,我该怎么做才能确保我的 rsync 不再因为这样的小不便而中断?

答案1

尝试tar对目录进行 /dev/null 而不是碎片整理...这肯定不会修改磁盘,但会缓存所有 inode。对于包含大量文件的大型目录,ext4 在哈希树中对它们进行索引,因此 readdir() 以基本上随机的顺序返回它们。尝试以相同的顺序 stat() 它们会导致大量查找,使其非常非常慢。

答案2

我一直在收集有关 ext3 和 ext4 中的日志系统的信息,以及维基百科中关于 ext4 的一章延迟分配和潜在的数据丢失,让我认为rsync这是碎片化的潜在原因。谷歌搜索那个弗雷兹让我来到这里,我实际上看到描述了我要问的过程的结果!tarto 的建议/dev/null似乎是一个很好的解决方案。阅读链接,找到有关延迟分配的更多信息。

相关内容