簡體   English   中英

Node.js 中的 ENOMEM 由高虛擬 memory 使用率引起

[英]ENOMEM in Node.js caused by high virtual memory usage

幾個月來,我的生產 Node.js (v12) 應用程序中出現 ENOMEM 錯誤。

這個問題特別難以診斷,因為我的堆總是在 100MB 范圍內,並且不會隨着時間的推移而增加。 因此節點 memory 泄漏的可能性不大。

但是,有時 VIRT memory 使用量(由 top cmd 報告)高達 15-20GB,這時節點開始拋出一些“spawn: enomem”錯誤。

據我所知,即使堆穩定在 100MB,節點也會保留大量虛擬 memory。 而且我無法診斷它是什么,因為節點首次亮相工具只允許我檢查堆。

我在這個問題上花了將近 100 小時,所以任何見解/幫助將不勝感激!

我試過了:

  • 手動設置 --max-old-space-size
  • 增加服務器上的 RAM
  • 將 SWAP 添加到我的服務器並允許 docker 使用該 SWAP
  • 使用 chrome 開發工具檢查節點堆
  • 為我的 docker 容器設置 memory 限制
  • 移動到不同的進程管理器(pm2 而不是 supervisord)
  • 升級我所有的包並使用最新的 LTS 版本的節點
  • 閱讀和理解節點 ENOMEM 的所有谷歌搜索結果
  • 了解 Node 如何管理其 memory 池,尤其是關於堆和 GC。
  • 深入了解 linux kernel 虛擬、保留、交換和共享 memory 的概念。

謝謝你的幫助 !

我們設法解決了這個問題。 請記住,解決方案可能特定於我們自己的項目。

在大型文件數組(20k+)上使用 package“imagemin”和“imagemin-jpegtran”和“imagemin-pngquant”時,我們設法始終如一地重現錯誤,並等待所有承諾完成 promise.all() . VIRT 內存使用量飆升至 20GB+,執行后從未釋放。

我們的解決方案是使用plimit將並發 Promise 的數量限制為 5 或 10。在相同數量的圖像(20k+)上,VIRT 內存使用量從未上升,RES 也沒有上升,並且我們停止收到 ENOMEM 錯誤。

希望這可以幫助那里的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM