gpt4 book ai didi

node.js - node js - 堆转储快照中的巨大 TLSWrap 对象

转载 作者:搜寻专家 更新时间:2023-10-31 23:47:32 24 4
gpt4 key购买 nike

我正在生产环境中运行 node.js express 应用程序。运行几个小时后,在堆快照中我可以看到每个 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 一路升级 Node

一些有趣的见解

  • 内存使用量的增长不是线性的,而是呈指数增长的,并且突然且非常快
  • 我有永久实例和自动缩放实例(相同类型),这种内存泄漏在所有机器上同时发生。
  • 在内存泄漏期间,流量(# 个请求)并不比平时高。
  • 我读到有时这些问题可能是在 uncaughtException 之后继续运行应用程序的结果,但我的 uncaughtException 处理程序只是记录错误然后立即调用 process.exit() - 不是吗这与 Node 崩溃时永远自动重启 Node 一样吗?
  • 我有另一个应用程序:
    • 从同一个 AWS EC2 AMI 运行。
    • 每秒有更多的请求。
    • 也有 uncaughtException 处理程序(使用 process.exit())。
    • 但根本没有内存泄漏!

有什么想法吗?谢谢,

最佳答案

我认为您的内存泄漏是由 TLSWrap 对象以外的其他原因引起的,可能在您的应用程序层中。

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

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

关于node.js - node js - 堆转储快照中的巨大 TLSWrap 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com