我有一个networking服务器,保存caching文件,并保持7天。 文件名是md5散列,即正好32个hex字符,并保存在一个树形结构中,如下所示:
00/ 00/ 00000ae9355e59a3d8a314a5470753d8 . . 00/ 01/
你明白了。
我的问题是删除旧文件需要很长时间。 我有一个每天运行的cron作业
find cache/ -mtime +7 -type f -delete
这需要半天以上才能完成。 我担心可扩展性和这对服务器性能的影响。 此外,caching目录现在是我的系统中的一个黑洞,陷入偶尔无辜的du
或find
。
LRUcaching的标准解决scheme是某种堆。 有没有办法将其扩展到文件系统级别? 有没有其他的方式来实现这一点,使其更容易pipe理?
这里是我考虑的想法:
有任何想法吗?
当你存储一个文件时,建立一个到日期而不是按名称组织的第二个目录结构的符号链接。
使用“name”结构检索文件,使用“date”结构删除它们。
假设这是ext2 / 3你尝试添加索引目录? 当你在任何特定的目录中有大量的文件时,查找将会非常缓慢地删除一些东西。
使用tune2fs -o dir_index启用dir_index选项。
安装文件系统时,请确保使用noatime选项,这会停止操作系统更新目录的访问时间信息(仍然需要修改它们)。
看着原来的帖子,好像你只有两层间接的文件,这意味着你可以在叶目录中有大量的文件。 如果有超过一百万个条目,您会发现搜索和更改非常缓慢。 另一种方法是使用更深层次的目录,减少任何特定目录中的项目数量,从而降低搜索和更新个别目录的成本。
Reiserfs在处理小文件方面相对高效。 你有没有尝试不同的Linux 文件系统 ? 我不知道删除性能 – 你可以考虑格式化(mkfs)作为单个文件删除的替代。 例如,您可以为每个工作日创建一个不同的文件系统(cache1,cache2,…)。
这个怎么样:
如何在你的数据库中使用散列作为关键的表。 其他字段将成为文件的名称。 这样,文件可以以与日期相关的方式存储以便快速删除,并且数据库可以用于以快速方式基于散列来查找文件的位置。