2013-04-29 81 views
5

自动修剪超过20分钟的文件,数百万小文件大容量存储(平均约50 KB)的好策略是什么?我需要从Web服务器写入并访问它们。小文件大容量存储策略

我正在使用ext4,并且在删除(计划在cron中)时,[flush-8:0]显示为创建负载的进程时,HDD使用率高达100%。此负载会干扰服务器上的其他应用程序。当没有删除时,最大硬盘利用率为0-5%。情况与嵌套和非嵌套目录结构相同。最糟糕的部分是,看起来峰值负载下的质量去除比插入速度慢,所以需要去除的文件数量越来越大。

我试过更改调度程序(截止日期,cfq,noop),但没有帮助。我也尝试设置ionice来删除脚本,但它也没有帮助。

我已经尝试过使用MongoDB 2.4.3的GridFS,它很好地执行,但在批量删除旧文件的过程中很糟糕。我试着在日志关闭的情况下运行MongoDB(nojournal),并且没有为删除和插入(w = 0)写入确认信息,它没有帮助。只有在没有删除操作的情况下,它才能快速而平稳地运行。

我还试图在MySQL 5.5存储数据,在BLOB列,在InnoDB表,与InnoDB引擎设置为使用innodb_buffer_pool = 2GB,innodb_log_file_size = 1GB,innodb_flush_log_on_trx_commit = 2,但性能比较较差,HDD负载总是在80%-100%(预计,但我不得不尝试)。表仅使用BLOB列,DATETIME列和CHAR(32)latin1_bin UUID,索引位于UUID和DATETIME列,因此没有空间进行优化,所有查询都使用索引。

我已经看过pdflush设置(Linux flush过程,在大量移除过程中创建负载),但更改值无助于任何事情,因此我恢复为默认设置。

无论我运行自动修剪脚本的频率如何,每1秒钟,每1分钟,每5分钟,每30分钟都无关紧要,它无论如何都会显着中断服务器。

我试图存储inode值,当删除时,通过先将它们与inode号码排序来逐个删除旧文件,但它没有帮助。

使用的CentOS 6 HDD是SSD RAID 1

什么将是我的工作好和明智的解决方案,解决了自动修剪性能问题?

+1

您是否已经基于创建时间尝试将文件“分”到目录中?也许用'rm -rf'去除完整的目录会有所帮助。 – 2013-04-29 06:00:45

+0

rm -rf因“参数列表太长”错误而失败。 – Atm 2013-04-29 06:24:18

+1

'rm -rf files_2013_Apr_29_0940'不是那么大,是吗?或者在1秒的粒度中,列表将有60个条目。当然,我们必须跟踪目录映射的文件名。最后一个可能必须有60多个子目录 - “数百万个文件”除以20 * 60至少是833个文件/目录。 – 2013-04-29 06:47:33

回答

1

由于数据和元数据都需要在磁盘上被破坏,删除是一种性能滋扰。

他们真的需要成为单独的文件吗?旧文件是否真的需要删除,还是可以覆盖它们?

如果答案是“不”的这些问题第二,试试这个:

  • 记住,测试版大约按年龄排序的文件列表。也许按文件大小来分块。
  • 当你想写入一个新文件时,找到一个最好大于你要替换的旧文件。而不是吹走旧文件,truncate()它到适当的长度,然后覆盖其内容。确保你更新你的旧文件列表。
  • 清理一段时间内没有被明确替换的真正旧东西。
  • 有一个索引到这些文件可能是有利的。尝试使用一个带有符号链接的tmpfs到真实文件系统。

通过将文件分块到可管理大小的子目录中,您可能会也可能不会在此方案中获得性能优势。

如果你没事多的东西在同一个文件是:

  • 保持类似大小的文件一起通过存储每一个作为偏移成同样大小的文件的数组。如果每个文件都是32k或64k,请保留一个文件充满32k块和一个充满64k块的文件。如果文件的大小是任意的,则取两个下一个幂。
  • 通过跟踪每个文件的陈旧程度,您可以在此处执行延迟删除操作。如果你正在尝试写入某些东西,请覆盖它而不是附加到文件的末尾。

另一种思考:你通过truncate()荷兰国际集团的所有文件的inode中为了一个长度为0,然后unlink()荷兰国际集团他们得到性能上的优势?无知使我无法知道这是否确实有帮助,但它似乎将保持数据整合在一起,并且元数据的编写类似。

还有一个想法:XFS的写入排序模型比data=ordered的ext4要弱。 XFS上速度够快吗?

+0

在启用了delaylog选项的XFS上似乎相当快。 – Atm 2013-05-06 17:56:13

2

如果大量移除数百万个文件会导致性能问题,您可以通过一次性“移除”所有文件来解决此问题。而不是使用任何文件系统操作(如“删除”或“截断”),您可以创建一个新的(空的)文件系统来替代旧的文件系统。

要实现这个想法,你需要将你的驱动器分成两个(或更多)分区。在一个分区已满(或20分钟后)后,您开始写入第二个分区,同时使用第一个分区进行只读。再过20分钟后,您卸载第一个分区,在其上创建空的文件系统,再次安装它,然后开始写入第一个分区,同时使用第二个分区进行只读。

最简单的解决方案是只使用两个分区。但是,这种方式不会非常有效地使用磁盘空间:您可以在同一个驱动器上存储少两倍的文件。有了更多的分区,您可以提高空间效率。

如果由于某种原因需要在一个地方存储所有文件,请使用tmpfs来存储指向每个分区上文件的链接。这需要从tmpfs大规模移除数百万个链接,但这样可以缓解性能问题,因为只应移除链接,而不是文件内容;这些链接也只能从RAM中删除,而不能从SSD中删除。