大型目录的rsync更快,没有更改


13

我们使用rsync备份服务器。

不幸的是,某些服务器的网络速度很慢。

rsync最多需要五分钟才能检测到,巨大的目录中没有任何变化。这些巨大的目录树包含许多小文件(约80k文件)。

我猜想rsync客户端会为每个80k文件发送数据。

由于网络速度较慢,我希望避免发送有关每个文件的80k次信息。

有没有办法告诉rsync进行子目录树的哈希和?

这样,rsync客户端将只为一个巨大的目录树发送几个字节。

更新资料

到目前为止,我的策略是使用rsync。但是,如果其他工具更适合此处,我可以进行切换。(服务器和客户端)都在我的控制之下。

更新2

一棵目录树中有8万个文件。每个目录的文件或子目录数量均不超过2k

更新3

有关网络慢速的详细信息:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

tmp /列表文件的大小:2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

结论:scp具有相同的速度(不足为奇)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

速度:1.2MB / s


1
您可能会阅读zsync。我自己没有使用过它,但是从我阅读的内容来看,它在服务器端预渲染了元数据,并且可能会加快您的情况的传输速度。无论如何,可能值得测试。除此之外,我知道的唯一其他解决方案是一些san / nas解决方案随附的实时块级同步。
亚伦

Answers:


36

一些无关的要点:

80K是很多文件。

一个目录中有80,000个文件?默认情况下,没有操作系统或应用程序能够很好地处理这种情况。您只是偶然发现rsync存在此问题。

检查您的rsync版本

现代rsync处理大型目录要比过去更好。确保您使用的是最新版本。

即使是旧的rsync也可以通过高延迟链接很好地处理大型目录...但是80k文件并不大...它很大!

也就是说,rsync的内存使用量与树中的文件数成正比。大目录占用大量RAM。速度缓慢可能是由于两边都没有RAM。在观察内存使用情况的同时进行测试。Linux使用任何剩余的RAM作为磁盘缓存,因此,如果RAM不足,则磁盘缓存会更少。如果RAM不足,并且系统开始使用swap,则性能将非常糟糕。

确保不使用--checksum

--checksum(或-c)需要读取每个文件的每个块。您可能可以通过仅读取修改时间(存储在inode中)的默认行为来解决。

将作业分成小批。

有一些像Gigasync这样的项目,它们将“通过使用perl递归目录树,构建较小的文件列表以通过rsync传输来增加工作量”。

额外的目录扫描将产生大量开销,但也许将是一次净赢。

没有为这种情况设置操作系统默认值。

如果您使用所有默认值的Linux / FreeBSD / etc,则所有应用程序的性能都会很糟糕。默认值假定目录较小,以免在超大缓存上浪费RAM。

调整文件系统以更好地处理大型目录:大型文件夹会降低IO性能吗?

看看“ namei缓存”

类似于BSD的操作系统具有一个高速缓存,该高速缓存可加快查找索引节点的名称的速度(“ namei”高速缓存”)。由于rsync在每个文件上执行lstat(),因此正在为80k文件中的每个文件访问inode,这可能会浪费您的缓存,请研究如何调整系统上文件目录的性能。

考虑不同的文件系统

XFS旨在处理更大的目录。查看单个目录中的文件系统大量文件

也许5分钟是您可以做的最好的事情。

考虑计算要读取的磁盘块数,并计算您期望硬件能够读取这么多块的速度。

也许您的期望太高了。考虑一下在不更改文件的情况下执行rsync必须读取多少磁盘块:每台服务器将需要读取目录并为每个文件读取一个索引节点。假设没有任何缓存,因为8万个文件可能已经耗尽了缓存。假设数学运算简单,需要80k块。那大约是40M的数据,应该在几秒钟内就能读取。但是,如果需要在每个块之间进行磁盘搜索,则可能需要更长的时间。

因此,您将需要读取大约80,000个磁盘块。您的硬盘驱动器可以做到多快?考虑到这是随机I / O,而不是长时间的线性读取,因此5分钟可能非常好。那是1 /(80000/600),或者每7.5ms读取一次磁盘。您的硬盘驱动器快还是慢?这取决于型号。

对类似事物进行基准测试

另一种思考的方式是这样。如果没有文件更改,ls -Llr则执行相同数量的磁盘活动,但从不读取任何文件数据(仅读取元数据)。ls -Llr运行所需的时间是您的上限。

  • rsync(不更改任何文件)是否明显慢于ls -Llr?然后可以改进用于rsync的选项。可能-c已启用,或者是其他一些标志,它读取的不仅是目录和元数据(inode数据)。

  • rsync(不更改文件)的速度差不多ls -Llr吗?然后,您已尽可能最佳地调整了rsync。您必须调整操作系统,添加RAM,获得更快的驱动器,更改文件系统等。

与您的开发者交谈

80k文件只是不好的设计。很少有文件系统和系统工具能够很好地处理如此大的目录。如果文件名是abcdefg.txt,请考虑将其存储在abdc / abcdefg.txt中(请注意重复)。这会将目录分解成较小的目录,但是不需要对代码进行很大的更改。

另外...考虑使用数据库。如果目录中有80k文件,则开发人员可能正在解决他们真正想要的是数据库这一事实。MariaDB或MySQL或PostgreSQL将是存储大量数据的更好选择。

嘿,五分钟怎么了?

最后,5分钟真的那么糟糕吗?如果每天运行一次此备份,则5分钟的时间并不多。是的,我喜欢速度。但是,如果5分钟对您的客户来说“足够好”,那么对您来说就足够了。如果您没有书面的SLA,那么如何与用户进行非正式讨论以了解他们期望备份进行的速度有多快。

我假设您没有问这个问题,是否不需要提高性能。但是,如果您的客户对5分钟感到满意,请宣布胜利并继续进行其他需要您努力的项目。

更新:经过讨论,我们确定了瓶颈是网络。在放弃之前,我将推荐两件事:-)。

  • 尝试通过压缩从管道中挤出更多带宽。但是压缩需要更多的CPU,因此,如果您的CPU过载,则可能会使性能变差。尝试使用带有和不带有的rsync -z,并配置带有和不带有压缩的ssh。对所有4种组合进行计时,以查看它们是否有明显好于其他的组合。
  • 观察网络流量以查看是否有任何暂停。如果有停顿,您可以找到造成停顿的原因并在那里进行优化。如果rsync始终在发送,那么您确实处于极限。您的选择是:
    • 更快的网络
    • 除了rsync
    • 将源和目标移近一点。如果无法执行此操作,可以将rsync同步到本地计算机,然后rsync到真实目的地吗?如果系统在初始rsync期间必须停机,则这样做可能会有好处。

80K的文件很多。:一个目录树中有80k的文件。每个目录的文件/子目录数量均不超过2k。
guettli '16

检查您的rsync版本:完成,请确保未使用--checksum:完成。将工作分成几批:谢谢,我将看一下gigasync。在这种情况下,不设置操作系统默认值:完成(瓶颈是网络而不是操作系统)。查看“ namei缓存”:完成(它是net,而不是OS)。考虑一个不同的文件系统:再次是net,而不是OS。也许5分钟是您可以做的最好的事情。:我认为可能会更快。与您的开发人员交谈(使用DB):这将是一个巨大的变化。也许具有更好备份支持的文件系统可以解决该问题。
guettli

每个目录2k个文件要好得多。谢谢你的更新。您没有提到网络速度很慢。是低带宽,高延迟还是两者兼而有之?rsync通常在高延迟链接上表现良好(它是由在澳大利亚从事博士学位的人在与美国计算机打交道时开发的)。尝试在ssh上执行“ ls -lLR”,并花费多长时间来传输结果。“时间ssh remotehost'cd / dest && ls -lLR'> / tmp / list”。确保在本地主机上创建了/ tmp / list。
TomOnTime

是的,网络很慢。很可惜。
guettli

有多慢 如果使用“ scp”复制一个100M文件,需要多长时间?另外,“ time ssh remotehost'cd / dest && ls -lLR'> / tmp / list”的输出是什么?
TomOnTime

2

不,使用rsync是不可能的,并且在另一方面考虑,它的效率很低:

通常,rsync仅比较文件修改日期和文件大小。您的方法将强制它两次(在本地和远程系统上)读取并校验所有文件的内容两次,以查找更改的目录。


1
AFAIK rsync检查mtime和大小。如果两个都匹配,则不会再次传输文件(至少在默认设置下)。发送元组的哈希(文件名,大小,mtime)就足够了。无需校验内容。
guettli '16

是的,您是正确的,但是无论如何,请rsync不要这样做。
斯文

2

对于大量文件的同步(几乎没有什么改变),也值得noatime在源分区和目标分区上进行设置。这样可以节省每个未更改文件对磁盘的写访问时间。


是的,noatime选项很有意义。我们使用它已有几年了。我想需要替代rsync的方法。
guettli

2

您也可以尝试lsyncd,它仅在文件系统上检测到更改并且仅在更改的子目录上检测到时才进行rsync。我已经将它用于在体面的服务器上最多包含200万个文件的目录。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.