前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次 Node.js 内存溢出

一次 Node.js 内存溢出

原创
作者头像
腾讯IVWEB团队
修改2017-06-30 18:05:02
3.3K0
修改2017-06-30 18:05:02
举报
文章被收录于专栏:腾讯IVWEB团队的专栏

作者:何方舟

现象

之前有发现,录播 node 有异常关闭的情况。

我们在1月3日有一次发布,而1月5日凌晨突然挂掉。

分析服务器内存曲线。

[Fjt-p7ngh-64NuGK8Of5cv-Q7cTw]
[Fjt-p7ngh-64NuGK8Of5cv-Q7cTw]

对应的详细内存

[FnAziHxLwRyqnrVvLKqQ0cDo367H]
[FnAziHxLwRyqnrVvLKqQ0cDo367H]

可以发现服务器内存达到最大值 8G 后就挂掉了,根据发布后内存有明显的上升趋势,且 GC 回收不明显,

初步判定是由于内存泄露导致。

内存分析

我们使用 heapdump 这个库来帮助我们查看内存变量的情况。临时创建一个创建快照的请求地址。

代码语言:txt
复制
    server.route({
        method: ['GET', 'POST'],
        path: '/now.qq.com/p',
        handler: function (request, reply) {
            heapdump.writeSnapshot(function(err, filename) {  
              console.log('dump written to', filename);
            });
            reply('success')
        }
    });

heapdump 的 writeSnapshot 生成的内存快照文件,可以被 chrome 打开。

通过 ab 进行本地压测:

代码语言:txt
复制
ab -X 127.0.0.1:8080 -n 1000 -c 100  'http://now.qq.com/h5/record.html?_wv=16778245&_bid=2380&vid=1055_42515315844044863100000000000000&nocache=1'

这些内存快照使用方法可以参考这篇文章:http://taobaofed.org/blog/2016/04/15/how-to-find-memory-leak/

[Fh65yaf9KnK_QXtTbasD5KHJTya-]
[Fh65yaf9KnK_QXtTbasD5KHJTya-]

我们对程序开始时和压测结合后的内存快照进行对比,发现存在大量的 string,array 变量未被回收,而其他对象都没有出现明显的堆积。是令人疑惑的是,分析相关的 string 后发现,这些变量并不存在泄露的可能。

考虑到 v8 gc 的方式:

  • 一种是对新生代区的 Scavenge算法,速度块,
  • 一种是对老生区的标记清除算法,由于单线程的原因会导致应用被阻塞。

这些变量依旧存在的原因只可能处于已移到老生区,暂时未被 gc。

分析未宕机前的内存图

[Fmp3-VLOmDeLLCgcZVy0CU7Tu9b6]
[Fmp3-VLOmDeLLCgcZVy0CU7Tu9b6]

内存有一个很健康的折线,可以看出并不存在泄露问题。

但是内存总量却在一个很高值,服务器内存上限是 8G,也就是说内存总量一直处于一个很危险的值。

但是为什么之前没有出现宕机问题呢?

结合 12.15,12.31,1.5 的pv视图。

[FpsVCG9sRZQXpTTtwZyshnLohV6Y]
[FpsVCG9sRZQXpTTtwZyshnLohV6Y]
[FowlxbhFWpajCQo6XTJ1BKYs7z6Z]
[FowlxbhFWpajCQo6XTJ1BKYs7z6Z]
[Fjf_dXiJFHKGkiKW2pv54G8LTFe_]
[Fjf_dXiJFHKGkiKW2pv54G8LTFe_]

31日由于活动的原因,录播 pv 涨了三倍,这时可以是因为内存溢出引起的宕机。

结论

因为内存上限设置不合理,引起的内存溢出问题。

之前压测时候只关注了是否存在内存泄露与cpu占用,而忽视了内存占用这个问题。

对于部署服务时,要根据机器的内存上限以及机器CPU核心数合理的设置单服务器的内存上限值。

原文链接:http://ivweb.io/topic/58b50896bd9e855ec2371729

相关推荐

ECMAScript 2015 (ES6) in Node.js(译)

nodejs中错误捕获的一些最佳实践

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 现象
  • 内存分析
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档