【问题标题】:What is the performance impact of the touch command or its equivalent system call?touch 命令或其等效系统调用对性能有何影响?
【发布时间】:2021-05-05 11:45:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我们已经有 50 年的时间来优化文件系统调用。你真的确定 touch 会成为瓶颈吗?此外,几十年来,文件系统写入被写入缓冲区并且缓冲区的内容偶尔同步,以防止快速更改,并且只做更少的更大的更改。这就是如果您不安全地拉动闪存驱动器可能会丢失数据的原因 - 缓冲区尚未写入,您在文件资源管理器中看到的是如果写入后将存在的数据。所以,我不确定为什么 touch 会对性能产生影响。
  • 这也只是关于传统驱动器。使用 SSD,您可以直接访问更少 - 它们有自己的内部控制器来优化写入。还有很多很多设置可能还有其他考虑因素 - 如果您有一个 RAID 设置,如果您使用具有内置冗余的某些文件系统,那么写入可能会更慢甚至更快。跨度>
  • 与所有性能问题一样,对其进行基准测试并亲自查看。
  • 对于 *nix;一个文件应该有 3 个时间戳——创建、最后修改和最后访问。为了提高性能,大多数人使用挂载选项禁用大多数文件系统的“访问时间”。使用touch() 将“修改时间”转换为“访问时间”会产生与不禁用“访问时间”类似的性能影响。您可能会找到有关启用/禁用“访问时间”的性能影响的信息(并将其用作对touch() 仿真的性能影响的估计);但你找到的任何东西都是系统特定的。
  • 请注意,您可能可以将其用作替代选项 - 例如如果您有一个专用于缩略图的小分区/文件系统,其中为该小文件系统(而不是任何其他文件系统)启用了“访问时间”,那么您将获得相同的最终结果,而无需额外系统调用的开销(touch())。在这种情况下,性能可能仍将由磁盘 IO(写入)主导,因此它可能不会产生太大影响(取决于操作系统如何进行写入缓冲)。

标签: node.js linux performance system-calls benchmarking


【解决方案1】:

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

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

如果您不能让内核在不需要额外系统调用的情况下为您执行此操作,则最好在打开文件后进行fstat 系统调用,并且仅在修改时间时触摸它以更新修改时间超过一天或一周。 (您关心的是一年的间隔,所以一周就可以了。)即手动实现 relatime 逻辑,但对于 mod time。

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


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

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

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

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

您可以想出一些方案,例如在双年度清理之前的一周启用 mod-time 更新,这样应该在缓存中保持热门的缩略图会更新其 modtime。但最好只使用 fstat / check / update ,因为这不应该是太多的额外负载。

【讨论】:

  • 与这些荒谬的 stackoverflow 规则相反,我会说“谢谢”,因为这是正常人所做的。感谢您提供详细的答案!最后,我检查了挂载选项,他们已经有了“relatime”,我对此进行了一些研究,这是准确性和性能命中之间的一个很好的折衷。一天的粒度就绰绰有余了,所以我只检查一次。
  • @SevenSystems:听说你已经有 relatime 很有趣。如果可以解决您的问题,请不要忘记使用投票箭头下方的复选框“接受”答案。
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 2021-03-18
  • 2020-09-29
  • 2015-08-29
  • 2015-02-08
  • 2016-11-18
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多