touch 命令或其等效系统调用对性能有何影响?

What is the performance impact of the touch command or its equivalent system call?

在可以动态生成缩略图的自定义开发的 NodeJS Web 服务器(运行 on Linux)中,我想将这些缩略图缓存在文件系统上并跟踪它们实际何时用过的。如果它们在一段时间内(比如一年)没有被使用,我会认为它们是“孤儿”并删除它们。

为此,我考虑过每次客户端请求它们时 touch 它们,这样我就可以使用修改时间来检查它们上次使用的时间。

我认为这会在高负载情况下对 Web 服务器的性能造成重大影响,因为这是“不必要的”文件系统写入,而除了日志记录之外,大多数请求只包含读取。

有没有人对这可能产生的影响有多大以及是否值得进行任何基准测试?

它可能不是很好,并且可能值得避免在您打开文件时每次 更新。这就是发明 relatime / noatime 挂载选项的原因,以防止每次打开文件时更新现有的 Unix 访问时间戳。

你的文件系统是用 relatime 挂载的吗?当文件打开时(即使是阅读),每天最多更新一次。 Linux 上常见的另一个挂载选项是 noatime:从不更新时间。

如果你不能让内核在不需要额外系统调用的情况下为你做这件事,你最好在打开文件后进行 fstat 系统调用并且只触摸它来更新 mod 时间,如果 mod 时间早于一天或一周。 (您关心的是一年的时间间隔,所以一周就可以了。)即手动实现 relatime 逻辑,但是 mod 时间。

经常访问的文件不需要更新(而且您仍然需要为它们进行总共一次系统调用,外加一次日期比较)。很少访问的文件将需要另一个系统调用和元数据写入。如果您的访问模式中的大部分访问都是重复访问一小部分文件,这应该很好。


无法使用 atime 的可能原因可能包括:

  • 文件系统是用 noatime 挂载的,不值得更改
  • 这些文件有时会被您的网络服务器/CGI 设置以外的其他东西读取。 (例如,不仅仅是比较大小/时间戳的备份作业)

当然,另一种选择是 使用时更新时间戳,并且只需让缩略图在您的每周 cron 作业删除后每年重新生成一次。这可能没问题,具体取决于您的工作量。

如果您手动触摸一些“最热门”的缩略图以便错开它们的删除,而不是明年这个时候出现大的负载峰值,您可能会没事。 And/or 让你的删除器非常缓慢地遍历你的文件系统,这样你就不会一次删除一大批经常需要的缩略图。

您可以想出一些方案,例如在每两年一次的清理前一周启用 mod 次更新,这样应该在缓存中保持热状态的缩略图会得到 mod 次更新。但最好一直 fstat / check / update 因为这不应该是太多的额外负载。