node js - heapdump快照中的巨大TLSWrap对象

时间:2015-10-08 13:57:19

标签: node.js memory-leaks

我正在运行node.js表达生产应用程序。运行几个小时后,在堆快照中我可以看到每个worker有超过10个巨大的TLSWrap对象(这些是应用程序中最大的对象)。

一些技术方面

  • 我将永远使用群集模块(2名工作人员)。
  • 应用程序在AWS EC2大型实例内运行。
  • 每个请求的大多数任务都是从redis获取数据并将一些请求(事件)发送到另一台服务器。
  • 正常内存使用量:~450MB,突然几个小时后:3.5GB(然后有太多延迟,我的负载均衡器移除了这台机器)。见Memory usage graph
  • 正常CPU使用率:16%,在内存泄漏期间:99%。

我已经尝试了

  • 代码重构内存泄漏问题(闭包,大对象和最小字符串连接。
  • 从v0.12.7,v4.1.1,v4.1.2和v4.2.0一直升级节点

一些有趣的见解

  • 内存使用量的增长不是线性的,而是指数级的,并且突然发生非常快
  • 我有永久实例和自动扩展实例(相同类型),并且所有计算机上的同时发生此内存泄漏。
  • 内存泄漏时流量(#requests)不高于平常值。
  • 我读过有时这些问题可能是在 uncaughtException 之后继续运行应用程序的结果,但我的uncaughtException处理程序只记录错误,然后立即调用process.exit() - 是不是与节点崩溃时相同,永远会自动重启?
  • 我有另一个应用程序:
    • 从相同的AWS EC2 AMI运行。
    • 每秒请求数量较多。
    • 还有uncaughtException处理程序(带有process.exit())。
    • 但根本没有内存泄漏

有什么想法吗? 谢谢,

1 个答案:

答案 0 :(得分:3)

我相信你的内存泄漏是由TLSWrap对象以外的东西造成的,可能是在你的应用层。

根据最近关闭的节点问题https://github.com/nodejs/node/issues/4250,TLSWrap错误地将其大小报告为大数(指向int的指针)。 TSLWrap对象的实际大小要小得多。

我也在我的heapdumps中看到非常大的TLSWrap对象,但在升级到节点5.3.0(包括修复程序https://github.com/nodejs/node/pull/4268)之后,我可以确认它们现在在我的正确显示中非常小heapdumps。