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

pal*_*wim 6 ext4 rsync raspberry-pi defragmentation

我有一个 XBian 服务器(Debian 的 Raspberry Pi 版本)通过 inetd(不是本机守护程序)运行rsync。我在ext4文件系统(在 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]
Run Code Online (Sandbox Code Playgroud)

在客户端日志中,我看到这样的日志(是的,相同的传输 - 服务器在 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]
Run Code Online (Sandbox Code Playgroud)

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

一些额外的注意事项:

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

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

psu*_*usi 1

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