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

flo*_*ock 1 linux node.js express docker puppeteer

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

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

此应用程序的内存使用情况

首先,我以为我的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
Run Code Online (Sandbox Code Playgroud)

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

Md.*_*her 5

进一步分析问题

您需要实时监控活动。

我们没有代码,因此我们甚至不知道发生了什么。但是,您可以使用比或更高的工具,例如htopgtopnetdata和其他工具。topps

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

pm2 logs
Run Code Online (Sandbox Code Playgroud)

每次api调用都会花费您

尽早计算成本并做好相应准备,

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

确保关闭标签

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

在docker上应用哑哑初始化以避免虚假进程

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

阅读更多关于此SO答案的信息