2008-11-03 67 views
7

我有一个网络服务器,它可以保存缓存文件并保存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慢得多。也许我做得不对。

任何想法?

回答

15

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

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

+0

错误:)你击败了我。 +1这个答案。 – 2008-11-03 09:48:01

0

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

1

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

1

如何:

  • 呼吁,比如说另一个文件夹,“ToDelete”
  • 当您添加一个新的项目,得到今天的日期,并寻找在“ToDelete”子文件夹,有一个名字表示当前日期的
  • 如果它不存在,创建它
  • 添加符号链接到你在今天的文件夹中创建
  • 创建转到文件夹“ToDelete”,这是一个cron作业项目的尸体切换日期并删除所有链接的文件夹。
  • 删除包含所有链接的文件夹。
4

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