【问题标题】:ENOMEM in Node.js caused by high virtual memory usageNode.js 中的 ENOMEM 由高虚拟内存使用引起
【发布时间】:2020-09-12 06:00:33
【问题描述】:

几个月来,我的生产 Node.js (v12) 应用程序中出现 ENOMEM 错误。

这个问题特别难以诊断,因为我的堆总是在 100MB 范围内,并且不会随着时间的推移而增加。因此不太可能发生节点内存泄漏。

但是,有时 VIRT 内存使用量(由 top cmd 报告)高达 15-20GB,此时节点开始抛出一些“spawn: enomem”错误。

据我所知,即使堆稳定在 100MB,节点也会保留大量虚拟内存。而且我无法诊断它是什么,因为节点首次亮相工具只允许我检查堆。

我在这个问题上花了将近 100 小时,所以任何见解/帮助都将不胜感激!

我试过了:

  • 手动设置 --max-old-space-size
  • 增加服务器上的 RAM
  • 将 SWAP 添加到我的服务器并允许 docker 使用该 SWAP
  • 使用 chrome 开发工具检查节点堆
  • 为我的 docker 容器设置内存限制
  • 移动到不同的进程管理器(pm2 而不是 supervisord)
  • 升级我所有的包并使用最新的 LTS 版本的节点
  • 阅读和理解节点 ENOMEM 的所有谷歌搜索结果
  • 了解 Node 如何管理其内存池,尤其是关于堆和 GC。
  • 深入了解虚拟、保留、交换和共享内存的 linux 内核概念。

感谢您的帮助!

【问题讨论】:

  • 我也遇到了同样的问题...如果有解决方案,我会在这里给您发短信。
  • 我也遇到了这个问题,我正在生成带有 FFMPEG 生成的大型 mp4 文件,但是当我使用完它们时也会删除它们,问题是内存使用量(docker stat)一直在累积,直到 ENOMEM 发生.我还注意到 /var/lib/docker/overlay2/LONG-HASH/diff 和 /var/lib/docker/overlay2/LONG-HASH/merged 保留了我的 .mp4 文件。浏览 docker 文档,他们说不要触摸 /var/lib/docker 文件,所以我不会,但仍然没有解决方案,这似乎很难调试。如果我遇到它,也会尝试发布解决方案。

标签: javascript node.js virtual-memory spawn enomem


【解决方案1】:

我们设法解决了这个问题。请记住,解决方案可能特定于我们自己的项目。

在大型文件数组 (20k+) 上使用包“imagemin”和“imagemin-jpegtran”和“imagemin-pngquant”时,我们设法一致地重现错误,并等待所有承诺以承诺结束。全部()。 VIRT 内存使用量飙升至 20GB+,执行后从未释放。

我们的解决方案是使用plimit 将并发承诺的数量限制为 5 或 10。在相同数量的图像 (20k+) 上,VIRT 内存使用量从未上升,RES 也没有上升,我们停止获取ENOMEM 错误。

希望这可以帮助那里的人?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2012-03-13
    • 2018-11-12
    • 2013-10-21
    • 2016-01-24
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多