簡體   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