Javascript Node.js中的ENOMEM是由高虚拟内存使用率引起的

Javascript Node.js中的ENOMEM是由高虚拟内存使用率引起的,javascript,node.js,virtual-memory,spawn,enomem,Javascript,Node.js,Virtual Memory,Spawn,Enomem,几个月来,我的production Node.js(v12)应用程序中一直出现ENOMEM错误 这个问题尤其难以诊断,因为我的堆总是在100MB范围内,并且不会随时间增加。因此,不太可能发生节点内存泄漏 但是,有时VIRT内存使用率(正如top cmd所报告的)会高达15-20GB,此时节点开始抛出一些“spawn:enomem”错误 据我所见,尽管堆的容量稳定在100MB,但节点还是保留了大量的虚拟内存。我无法诊断它是什么,因为节点首次出现工具只允许我检查堆 我在这个问题上花了将近100个小时

几个月来,我的production Node.js(v12)应用程序中一直出现ENOMEM错误

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

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

据我所见,尽管堆的容量稳定在100MB,但节点还是保留了大量的虚拟内存。我无法诊断它是什么,因为节点首次出现工具只允许我检查堆

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

我试过:

  • 手动设置——最大旧空间大小
  • 增加服务器上的RAM
  • 将交换添加到我的服务器并允许docker使用该交换
  • 使用chrome开发工具检查节点堆
  • 为我的docker容器设置内存限制
  • 转移到不同的流程经理(pm2而不是supervisord)
  • 升级所有my软件包并使用node的最新LTS版本
  • 阅读和理解node enome的所有google结果
  • 了解节点如何管理其内存池,特别是关于堆和GC
  • 深入研究linux内核的虚拟、保留、交换和共享内存的概念

谢谢你的帮助

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

在一个大的文件数组(20k+)上使用带有“imagemin jpegtran”和“imagemin pngquant”的包“imagemin”,并等待所有承诺以promise.all()结束时,我们设法一致地再现错误。 VIRT mem的使用量激增至20GB+并且在执行后从未释放

我们的解决方案是将并发承诺的数量限制在5或10个。在相同数量的图像(20k+)上,VIRT-mem的使用率从未上升,RES也没有上升,并且我们不再出现ENOMEM错误


希望这对其他人有所帮助我也面临同样的问题。。。如果有什么解决方案,我会在这里发短信给你。我也遇到了这个问题,我正在使用FFMPEG生成大型mp4文件,但在我使用完它们后也会删除它们,问题是内存使用量(docker stat)一直在累积,直到ENOMEM出现。我还注意到/var/lib/docker/overlay2/LONG-HASH/diff和/var/lib/docker/overlay2/LONG-HASH/merged保存在我的.mp4文件中。浏览docker文档,他们说不要触摸/var/lib/docker文件,所以我不会,但仍然没有解决方法,这看起来很难调试。如果我遇到它,我也会尝试发布一个解决方案。