专栏首页腾讯IVWEB团队的专栏一次 Node.js 内存溢出
原创

一次 Node.js 内存溢出

作者:何方舟

现象

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

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

分析服务器内存曲线。

对应的详细内存

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

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

内存分析

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

    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 进行本地压测:

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/

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

考虑到 v8 gc 的方式:

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

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

分析未宕机前的内存图

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

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

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

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

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

结论

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

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

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

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

相关推荐

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2019TLC大会精彩回顾—大前端·信息流

    2019年8月17日,第三届TLC大会在科兴科学园国际会议中心完美落下帷幕。作为一年一度的技术盛会,本次大会云集国内外19名技术专家,现场参会人数超过600人,...

    腾讯IVWEB团队
  • 【译】模拟鼠标移动

    本文采用意译,可能会与原文的表达有所不同,如果想看原文,请点击这里,或者复制链接 https://css-tricks.com/simulating-mouse...

    腾讯IVWEB团队
  • 前端弹幕实现

    目前视频播放平台弹幕几乎都是使用js操作dom的方式实现,由于篇幅的原因这次只展示js操作dom的实现方案。

    腾讯IVWEB团队
  • 《深入理解 Java 虚拟机》学习 -- Java 内存模型

    在硬件中,为了解决处理器与内存的速度矛盾,在两者之间使用了高速缓存,但也引入了新的问题:缓存一致性。

    希希里之海
  • Memcached内存机制Memcached特点内存分配机制 - SlabAllocation内存使用机制 - LRU(Least Recently Used)优化思路

    Memcached特点 协议简单,基于文本行的协议 基于Libevent的时间处理 内置内存存储方式 分布式缓存服务器(采用一致性哈希算法实现的客户端分布式,而...

    Clive
  • 内存溢出和内存泄漏

    通俗的讲就是设备内存不够了。就好比我们的手机,运行内存是4G的,当我们运行了太多的程序时,在运行其他的软件时就会很卡或者提示xx运行停止。

    卡二条的技术圈子
  • 聊一聊内存管理(一)

    在我们的日常生活中,经常会遇到这样的对话。当电脑运行程序变得很慢很卡的时候,就会听到身边的朋友建议我们去增加电脑的内存。这是为什么呢?内存在计算机体系结构中起了...

    算法与编程之美
  • spring boot 引起的 “堆外内存泄漏”

    发现配置的4G堆内内存,但是实际使用的物理内存高达7G,确实有点不正常,JVM参数配置是“-XX:MetaspaceSize=256M -XX:MaxMetas...

    纯洁的微笑
  • JVM学习系列学习三

        在Java中,创建的所有引用对象类型,都在堆内存中。堆内存中的数据由GC对其进行管理的。其实堆内存也是GC主要管理的地方。

    凯哥Java
  • liteos内存(三)

    内存管理模块管理系统的内存资源,它是操作系统的核心模块之一。主要包括内存的初始化、分配以及释放。

    233333

扫码关注云+社区

领取腾讯云代金券