我创建了一个小应用并使用Meteor Up将其部署到Ubuntu服务器上。每天的用户很少(<10),但是几天后,服务器的大量内存被使用。
因此,我认为我的代码中存在某个内存泄漏问题。
如何找出它?
非常感谢!
我创建了一个小应用并使用Meteor Up将其部署到Ubuntu服务器上。每天的用户很少(<10),但是几天后,服务器的大量内存被使用。
因此,我认为我的代码中存在某个内存泄漏问题。
如何找出它?
非常感谢!
最近几天我们遇到了内存泄漏问题,使用一个叫做heapdump的包相对容易地找到了问题,你可以在这里找到它:https://www.npmjs.com/package/heapdump
它不是专门为Meteor设计的,而是为Node.js设计的。仔细阅读README以安装它。然后,在服务器上运行kill -USR2 <pid_of_meteor_app>
来获取第一个heapdump的好时机是当服务器上没有太多活动但内存正在泄漏。
一段时间后,当您发现内存增长了很多但没有逻辑解释时,请制作另一个heapdump并下载两个文件。
按F12打开您的浏览器(Chrome、Firefox、Edge等)的Web开发控制台,然后转到Memory
。导入两个heapdumps。
现在你需要找出这两个堆转储之间发生了什么变化,帮助我的是这篇文章,它让我了解如何做到这一点:https://www.useanvil.com/blog/engineering/isolating-memory-leak-in-node/
记住,你很可能正在寻找相同大小的内存保留,有时只是像我们的情况一样微小的几kb,但数量可能会达到数十万。所以按空间排序是一个好主意。
在我们的情况下,问题出在一个过时的包上,叫做tslib
,它在一天左右后就会占用所有的内存。我们使用的是2.3.1版本,所以我们去了https://github.com/microsoft/tslib/releases/tag/2.4.0并阅读了以下内容:
此版本包括__classPrivateFieldIn助手以及__createBinding的更新,以减少多个重新导出之间的间接性。
我们更新了这个包,它是另一个包的依赖项,问题就解决了。
Kadira、Monti APM以及其他类似的工具在这种情况下通常是完全无用的,往往不能真正追踪到源头。
有一个kadira包可以检查您的应用程序。请看一下https://kadira.io/