繁体   English   中英

Chokidar Node.js package 从目录中的预先存在的文件中不必要地使用大量内存/RAM

[英]Massive memory/RAM usage with Chokidar Node.js package from pre-existing files in directory being watched unnecessarily

我在这个用例中使用了 Node.js package “chokidar”:

  • 我只是在看 Linux 上的单个目录,而不是递归的
  • 我只需要它来监视add事件,因为当文件以原子方式移动到监视目录时(一旦所有更改完成,它们就会从同一文件系统上的另一个目录移动)
  • 我根本不需要它来查看目录中预先存在的文件,只需注意应用程序启动后的新文件

问题:

  • 当我启动 node.js 应用程序时目录中有大量预先存在的文件(如 80k)时,Chokidar 似乎对所有文件都进行了监视,即使我根本不关心查看现有文件
  • 最初这达到了 kernel 手表限制,但我已经通过以下方式解决了这个问题:

...

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
  • 剩下的问题是所有这些预先存在的文件都在被监视,它无缘无故地使用了大量的 RAM,因为我根本不需要它来监视这些文件。
  • 有什么方法可以让 Chokidar 完全忽略所有这些预先存在的文件,并且只关注这个单个目录以仅为新文件add事件?
  • 我知道增加 Node 的 RAM 限制(在这种情况下无论如何都不起作用),但我觉得它不应该首先使用所有这些 RAM,我希望它在小型 VPS 上高效。 我想解决 RAM 使用问题,而不是一开始就给它更多的 RAM。

我正在使用这段代码:

chokidar.watch("/my-watched-dir", {
    ignoreInitial: true,
})
.on('add', (filepath) => {...}

我也尝试将depth选项设置为 0 和 1。

应用程序一启动,memory 的使用率就会攀升得非常高(甚至在第一个新文件出现之前第一次触发add事件)。

并且预存文件数较少时也没有问题,所以不存在应用启动后新文件吞吐量的问题。

据我所知,Linux平台上的chokidar等库会直接使用Node.js提供的fs.watch和fs.watchFile。

为了跨平台,这两个 API 始终侦听与路径相关的所有事件,因此答案是您不能将 chokidar 用于您的目的。

如果您希望使用更少的 memory,请手动轮询或使用可以直接访问 inotify 的本机 Linux 模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM