4

最近我开始了我的第一个项目node.js,我可以肯定地说我很喜欢它。所有模块都非常强大;但是,似乎我有一个“轻微”的内存泄漏,导致我的服务器在大约一个小时后崩溃(达到 99-100% 的 CPU)。我一直在尝试解决这个问题一段时间。

幸运的是,经过一番搜索,我找到了一个流行的工具,叫做memwatch. 我当然安装了模块,并开始记录我的服务器进程的内存使用/存储。

最终,在查看日志后,我找到了可能的原因。

  {
    "what": "String",
    "size_bytes": 9421368,
    "size": "8.98 mb",
    "+": 16635,
    "-": 533
  }

当然,在 30 秒内,这个小虫子就增加了 9mb(非常不寻常)。很高兴知道我的内存泄漏似乎是 type string,但是我到底该去哪里呢?有什么方法可以得到更准确的结果吗?

我查看了我的代码,但我的代码中确实没有一个string可能会像这样增长。有没有可能这个字符串实际上不是我的代码的一部分,而更多的是节点或 Socket.IO 模块的一部分?

4

3 回答 3

3

正确的做法。使用 StrongOps(以前的 Nodefly)来分析内存。隔离泄漏对象的类型。查看堆保留大小以及实例计数。随着工作负载稳定而不断增长的实例数量将指向一些确凿的证据。

我相信 StrongOps 在后台使用 memwatch + 一些 V8 分析器/GC 代码。更好的自动化。见链接 - http://strongloop.com/node-js-performance/strongops/

然后使用他们的联合创始人(核心贡献者 Ben Noordhuis)编写的 node-heapdump 模块将泄漏隔离到收集对象、GC 根和代码行。

请参阅 Ben 的博客 - http://strongloop.com/strongblog/how-to-heap-snapshots/

于 2014-01-30T05:50:52.263 回答
0

您可以使用node-heapdump模块,对 V8 堆进行转储以供以后检查,这样您将能够看到更准确的结果。

制作堆转储后,使用 Chrome DevTools 对其进行分析:

https://developers.google.com/chrome-developer-tools/docs/javascript-memory-profiling

于 2014-01-29T10:25:20.980 回答
0

正如 Shubhra 所建议的,另一个帮助您诊断内存泄漏的工具是 StrongOps 监控的堆分析器。您可以在此处通过几个步骤轻松开始:http: //docs.strongloop.com/display/DOC/Setting+up+StrongOps+monitoring

在此处输入图像描述

这将节省您挖掘日志的时间,并让您了解应用程序堆中随着时间的推移发生的情况,并将字符串与其他可能导致内存泄漏的罪魁祸首进行比较。

您可以在此处找到更多信息:http: //docs.strongloop.com/display/DOC/Profiling#Profiling-Memoryprofiler

于 2014-01-30T18:52:07.173 回答