Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 小文件的大容量存储策略_Database_Linux_Performance_Optimization_Filesystems - Fatal编程技术网

Database 小文件的大容量存储策略

Database 小文件的大容量存储策略,database,linux,performance,optimization,filesystems,Database,Linux,Performance,Optimization,Filesystems,对于数百万个小文件(平均约50 KB)的大容量存储,自动删除超过20分钟的文件的好策略是什么?我需要从web服务器写入和访问它们 我目前正在使用ext4,在delete(在cron中调度)期间,HDD的使用率高达100%,其中[flush-8:0]显示为创建负载的进程。此负载会干扰服务器上的其他应用程序。没有删除时,最大硬盘利用率为0-5%。嵌套和非嵌套目录结构的情况相同。最糟糕的是,峰值负载期间的质量删除速度似乎比插入速度慢,因此需要删除的文件数量越来越大 我尝试过改变调度程序(截止日期、cf

对于数百万个小文件(平均约50 KB)的大容量存储,自动删除超过20分钟的文件的好策略是什么?我需要从web服务器写入和访问它们

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

我尝试过改变调度程序(截止日期、cfq、noop),但没有效果。我也尝试过将ionice设置为删除脚本,但也没有效果

我在MongoDB 2.4.3中试用过GridFS,它的性能很好,但在大量删除旧文件时却很糟糕。我尝试过在日志关闭(nojournal)的情况下运行MongoDB,并且没有对删除和插入(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


对于我的任务来说,有什么好的、合理的解决方案可以解决自动修剪性能问题呢?

删除是一种性能问题,因为数据和元数据都需要在磁盘上销毁

它们真的需要是单独的文件吗?旧文件是否真的需要删除,或者如果被覆盖是否可以

如果第二个问题的答案是“否”,请尝试以下方法:

  • 保留一个按年龄大致排序的文件列表。也许可以按文件大小将其分块
  • 当您要写入新文件时,请查找一个旧文件,该文件最好比您要替换的文件大。与其将旧文件吹走,不如将其截断为适当的长度,然后覆盖其内容。确保更新旧文件列表
  • 清理那些没有被明确替换过的旧东西
  • 在这些文件中建立索引可能是有利的。尝试使用一个
    tmpfs
    ,其中包含指向真实文件系统的符号链接
通过将文件分块到可管理大小的子目录中,您可能会也可能不会在该方案中获得性能优势

如果您对同一文件中的多个内容满意:

  • 通过将每个文件作为偏移量存储到大小相似的文件数组中,将大小相似的文件保存在一起。如果每个文件都是32k或64k,请将一个文件保留为32k块,将一个文件保留为64k块。如果文件的大小是任意的,则四舍五入到下一个二次方
  • 通过跟踪每个文件的过时程度,您可以在这里进行延迟删除。如果您正试图写入某个内容,但该内容已过时,请覆盖它,而不是附加到文件末尾
另一个想法是:通过
truncate()
按索引节点顺序将所有文件的长度设置为0,然后
unlink()
取消链接,是否会获得性能优势?无知使我无法知道这是否真的有帮助,但它似乎可以让数据归零,让元数据以同样的方式写入


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

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

要实现这个想法,您需要将驱动器拆分为两个(或更多)分区。在一个分区已满(或20分钟后)之后,您开始写入第二个分区,而第一个分区仅用于读取。再过20分钟,卸载第一个分区,在其上创建空文件系统,再次装载,然后开始写入第一个分区,而第二个分区仅用于读取

最简单的解决方案是只使用两个分区。但是这样你就不能很有效地使用磁盘空间:你可以在同一个驱动器上少存储两倍的文件。使用更多分区可以提高空间效率


如果出于某种原因,您需要将所有文件放在一个位置,请使用
tmpfs
存储指向每个分区上的文件的链接。这需要从
tmpfs
中大量删除数百万个链接,但这会缓解性能问题,因为只应删除链接,而不应删除文件内容;此外,这些链接只能从RAM中删除,不能从SSD中删除。

您是否已经尝试根据文件创建时间将文件“bucketing”到目录中?也许删除带有“rm-rf”的完整目录会有所帮助。rm-rf因“参数”而失败