触摸命令或其等效系统调用对性能的影响是什么



在一个可以动态生成缩略图的自定义开发的NodeJS web服务器(运行在Linux上(中,我想将这些缩略图缓存在文件系统上,并跟踪它们实际使用的时间。如果它们已经有一段时间(比如一年(没有使用了,我会认为它们是";孤儿;并将其删除。

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

我认为这将在高负载情况下对web服务器造成显著的性能打击;不必要的";文件系统写入,而除了日志记录,大多数请求将只包含读取。

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

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

您的文件系统是否安装了relatime?当文件打开时(即使是为了读取(,它每天最多更新一次atime。Linux上常见的另一个装载选项是noatime:从不更新atime。

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

经常访问的文件将不需要更新(而且您仍在为它们进行一次系统调用,再加上日期比较(。很少访问的文件将需要另一个系统调用和元数据写入。如果访问模式中的大多数访问都是重复地访问一组较小的文件,那么这应该是非常好的。


不能使用atime的可能原因包括:

  • 文件系统是用noatime安装的,不值得更改
  • 文件有时会被web服务器/CGI设置之外的其他程序读取。(例如,备份作业的作用不仅仅是比较大小/时间戳(

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

如果手动触摸一些";最热的";缩略图,这样你就可以错开删除时间,而不是在明年的这个时候出现大的负载高峰,你就可以了。和/或让你的删除者在文件系统中走得很慢,这样你不会一次删除大量经常需要的缩略图。

你可以想出一些方案,比如在每两年清理一次的前一周启用mod时间更新,这样应该在缓存中保持热度的缩略图就可以更新它们的mod时间。但最好一直只使用fstat/check/update,因为这不应该有太多的额外负载。

最新更新