linux - 处理大量临时小文件

标签 linux caching filesystems

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

有什么想法吗?

最佳答案

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

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

关于linux - 处理大量临时小文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/258212/

相关文章:

c++ - 在 Linux 中以 C/C++ 编程方式更改文件的创建时间戳

linux - Linux下文件排序

html - 加载缓存 list 文件

使用 capistrano 缓存文件部署 Laravel

filesystems - 在Nand Flash的整个生命周期中,读取操作是安全的吗?

database - Blob 和文件之间的区别

linux - 生成文件错误 : syntax error: unexpected word (expecting "fi")

linux - 如何组合两个 AWK 命令?

android - 缓存位图 - 检查当前 VM 预算

c# - 如何知道某个文件夹的文件是否正在被另一个进程使用?