如何在Meteor应用程序中查找内存泄漏?

8

我创建了一个小应用并使用Meteor Up将其部署到Ubuntu服务器上。每天的用户很少(<10),但是几天后,服务器的大量内存被使用。

因此,我认为我的代码中存在某个内存泄漏问题。

如何找出它?

非常感谢!


2
奇怪,我目前也遇到了同样的问题。我正在AWS Ubuntu实例上运行Meteor,并使用mupx进行安装。我刚刚在网上搜索答案。不知道为什么你被downvote了,我也在问自己如何追踪Meteor中的内存泄漏。Kadira显示内存使用量增加,但它不会告诉你原因。 - waldgeist
你能分享一下你的代码吗?这样我们才能找到实际的原因。 - Chetan
2个回答

0

最近几天我们遇到了内存泄漏问题,使用一个叫做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以及其他类似的工具在这种情况下通常是完全无用的,往往不能真正追踪到源头。


-2

是kadira告诉我内存使用过高,但并没有告诉我内存泄漏的具体位置。或者是我漏看了什么? - Jerome Martin
我认为kadira包已经死了。我提供的链接重定向到其他地方,所以我得到了负评。 - Ramesh Murugesan
不,你不能仅凭它来确定原因。Kadira 告诉你有问题存在,但并没有告诉你为什么。 - ataraxis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接