express.js api应用程序中的内存泄漏

时间:2018-09-17 12:59:50

标签: node.js linux express docker puppeteer

我正在运行一个express.js应用程序,该应用程序用作REST api。一个端点启动了puppeteer,并通过几个过程测试了我的网站。

启动应用程序并持续使用端点后,我的docker容器每小时都会耗尽内存,如下所示。

Memory usage of this app

首先,我以为我的puppeteer / headless chrome中存在内存泄漏,但是随后我监视了进程中的内存使用情况,没有可见的内存泄漏,如您在此处看到的那样:

     0.00 Mb COMMAND 
   384.67 Mb /var/express/node_modules/puppeteer/.local
   157.41 Mb node /var/express/bin/www 
   101.76 Mb node /usr/local/bin/pm2
     4.34 Mb /var/express/node_modules/puppeteer/.local
     1.06 Mb ps 
     0.65 Mb bash 
     0.65 Mb bash 
     0.31 Mb cut 
     0.31 Mb cut 
     0.13 Mb dumb

现在,我没有任何想法可能是什么问题了。有谁知道RAM消耗可能来自何处?

2 个答案:

答案 0 :(得分:5)

进一步分析问题

您需要实时监控活动。

我们没有代码,因此我们甚至不知道发生了什么。但是,您可以使用htopgtopnetdata之类的更高级的工具以及topps以外的其他工具。

登录pm2可能还会告诉您更多有关事情的信息。在这种情况下,日志将比流程管理器拥有更多的数据。确保彻底调查日志以查看脚本是否负责以及是否引发错误,

pm2 logs

每次api调用都会使您花费

及早计算成本并进行相应的准备,

  • 如果有1个通话,则每次准备拥有100Mb-1GB或更多。就像浏览器选项卡一样,它将花费您。只要打开标签页,费用就会存在。
  • 如果目标网站很沉重,那么它将花费更多。诸如Youtube之类的某些网站显然会花费您更多。
  • 在“浏览器”选项卡中运行的任何脚本都会占用CPU和内存。
  • 假设每个进程造成300MB内存,如果您没有正确关闭进程并开始进行API调用,则只有10个API调用将能够轻松使用3GB内存。它可以很快加起来。

确保关闭标签页

自动化任务是否成功,请确保正确使用browser.close()以确保其使用的资源免费。大多数时候,我们忘记了这么小的事情,而这却使我们付出了代价。

在docker上应用哑哑初始化以避免幻影进程

如果您有一个产生新进程的进程,并且没有实现好的信号处理程序来捕获子信号并停止子进程,则可以使用dumb-inittini之类的东西停止等。

详细了解此SO answer

答案 1 :(得分:1)

我已经解决了问题。这是由底层的Kubernetes系统引起的,该系统未在该特定容器上配置资源限制。因此,容器可以消耗尽可能多的内存。

现在我限制为2GB,它看起来像这样: enter image description here