7

我有一个 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 慢得多。也许我做得不对。

有任何想法吗?

4

5 回答 5

15

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

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

于 2008-11-03T09:45:18.780 回答
4

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

于 2008-11-03T10:13:24.447 回答
1

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

于 2008-11-03T09:42:22.293 回答
1

这个怎么样:

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

在您的数据库中拥有一个使用散列作为键的表怎么样。另一个字段将是文件的名称。这样,文件可以以与日期相关的方式存储以进行快速删除,并且数据库可用于基于散列以快速方式查找该文件的位置。

于 2008-11-03T09:35:37.643 回答