【发布时间】: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