处理大量临时小文件

时间:2008-11-03 09:31:35

标签: linux caching filesystems

我有一个Web服务器,可以保存缓存文件并将其保留7天。文件名是md5哈希值,即长度正好为32个十六进制字符,并保存在如下所示的树结构中:

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

你明白了。

我的问题是删除旧文件需要很长时间。我有一个日常的cron作业

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

需要半天以上才能完成。我担心可伸缩性及其对服务器性能的影响。此外,缓存目录现在是我系统中的一个黑洞,偶尔会捕获无辜的dufind

LRU缓存的标准解决方案是某种堆。有没有办法将其扩展到文件系统级别? 是否有其他方法以一种易于管理的方式实现这一点?

以下是我考虑的想法:

  1. 创建7个顶级目录,每周一个目录,每天清空一个目录。这会使缓存文件的查找时间增加7倍,使文件被覆盖时非常复杂,而且我不确定它对删除时间的作用。
  2. 将文件保存为带有名称和日期索引的MySQL表中的blob。这似乎很有希望,但在实践中它总是比FS慢得多。也许我做得不对。
  3. 有什么想法吗?

5 个答案:

答案 0 :(得分:15)

存储文件时,请创建指向按日期而非名称组织的第二个目录结构的符号链接。

使用“名称”结构检索文件,使用“日期”结构删除它们。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

Reiserfs在处理小文件方面相对有效。你尝试过不同的Linux file systems吗?我不确定删除性能 - 您可以考虑将格式化(mkfs)替换为单个文件删除。例如,您可以为每个工作日创建不同的文件系统(cache1,cache2,...)。

答案 3 :(得分:1)

这个怎么样:

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

答案 4 :(得分:0)

如何在数据库中使用哈希作为键。然后,另一个字段将是文件的名称。这样,文件可以以与日期相关的方式存储以便快速删除,并且数据库可以用于以快速方式基于散列查找该文件的位置。