处理大量的临时小文件

我有一个networking服务器,保存caching文件,并保持7天。 文件名是md5散列,即正好32个hex字符,并保存在一个树形结构中,如下所示:

00/ 00/ 00000ae9355e59a3d8a314a5470753d8 . . 00/ 01/ 

你明白了。

我的问题是删除旧文件需要很长时间。 我有一个每天运行的cron作业

 find cache/ -mtime +7 -type f -delete 

这需要半天以上才能完成。 我担心可扩展性和这对服务器性能的影响。 此外,caching目录现在是我的系统中的一个黑洞,陷入偶尔无辜的dufind

LRUcaching的标准解决scheme是某种堆。 有没有办法将其扩展到文件系统级别? 有没有其他的方式来实现这一点,使其更容易pipe理?

这里是我考虑的想法:

  1. 创build7个顶级目录,每天一个,每天清空一个目录。 这样会将caching文件的查找时间增加7倍,当文件被覆盖时会使其变得非常复杂,而且我不确定删除时间会做什么。
  2. 将文件保存为带名称和date索引的MySQL表格中的blob。 这看起来很有希望,但实际上它总是比FS慢得多。 也许我做的不对。

有任何想法吗?

当你存储一个文件时,建立一个到日期而不是按名称组织的第二个目录结构的符号链接。

使用“name”结构检索文件,使用“date”结构删除它们。

假设这是ext2 / 3你尝试添加索引目录? 当你在任何特定的目录中有大量的文件时,查找将会非常缓慢地删除一些东西。
使用tune2fs -o dir_index启用dir_index选项。
安装文件系统时,请确保使用noatime选项,这会停止操作系统更新目录的访问时间信息(仍然需要修改它们)。
看着原来的帖子,好像你只有两层间接的文件,这意味着你可以在叶目录中有大量的文件。 如果有超过一百万个条目,您会发现搜索和更改非常缓慢。 另一种方法是使用更深层次的目录,减少任何特定目录中的项目数量,从而降低搜索和更新个别目录的成本。

Reiserfs在处理小文件方面相对高效。 你有没有尝试不同的Linux 文件系统 ? 我不知道删除性能 – 你可以考虑格式化(mkfs)作为单个文件删除的替代。 例如,您可以为每个工作日创建一个不同的文件系统(cache1,cache2,…)。

这个怎么样:

  • 有另一个文件夹叫,说,“ToDelete”
  • 添加新项目时,获取今天的日期,并在“ToDelete”中查找具有指示当前日期的名称的子文件夹
  • 如果不存在,请创建它
  • 将符号链接添加到您在当前文件夹中创建的项目
  • 创建一个cron作业,转到“ToDelete”中具有正确日期的文件夹,并删除所有链接的文件夹。
  • 删除包含所有链接的文件夹。

如何在你的数据库中使用散列作为关键的表。 其他字段将成为文件的名称。 这样,文件可以以与日期相关的方式存储以便快速删除,并且数据库可以用于以快速方式基于散列来查找文件的位置。