一次 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 条评论
登录 后参与评论

相关文章

来自专栏python成长之路

udp服务端收发数据流程

1468
来自专栏IT技术精选文摘

LVS集群中的IP负载均衡技术

1.前言 在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟...

2337
来自专栏JAVA技术zhai

垂直打击之JVM剖析

Java是目前软件开发领域中使用最广泛的编程语言之一。Java应用程序在许多垂直领域(银行、电信、医疗保健等)中都有广泛使用。Refcard的目的是,帮助开发者...

1244
来自专栏owent

ptmalloc,tcmalloc和jemalloc内存分配策略研究

最近看了glibc的ptmaoolc,Goolge的tcmalloc和jemalloc,顺便做了一点记录。可能有些地方理解地不太对,如有发现还请大神指出。

1521
来自专栏匠心独运的博客

消息中间件—Kafka数据存储(一)

摘要:消息存储对于每一款消息队列都非常重要,那么Kafka在这方面是如何来设计做到高效的呢? Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(pa...

672
来自专栏云计算

重新审视分布式(微服务)体系结构中的全局数据一致性

早在2015年的时候,我写了几篇文章,介绍如何通过搭载标准Java EE事务管理器以获得跨分布式服务的数据一致性(查看原文请点击这里,基于Spri...

1312
来自专栏Janti

你可以这么理解五种I/O模型

因为项目需要,接触和使用了Netty,Netty是高性能NIO通信框架,在业界拥有很好的口碑,但知其然不知其所以然。

1335
来自专栏wannshan(javaer,RPC)

zookeepr--概览

zk 一个分布式应用协调服务 zk是一个分布式,开源的,分布式协调服务,他提供了一组简单的原生接口,分布式应用可以基于它实现,高水准的同步,集群,配置管理和命名...

3438
来自专栏IT技术精选文摘

系统负载能力浅析

一. 衡量指标 用什么来衡量一个系统的负载能力呢?有一个概念叫做每秒请求数(Requests per second),指的是每秒能够成功处理请求的数目。比如说...

1755
来自专栏沃趣科技

ASM 翻译系列第七弹:高级知识 How many partners?

原作者:Bane Radulovic 译者: 庄培培 审核: 魏兴华 DBGeeK社群联合出品 ASM的数据冗余机制是通过将extent的镜像副本复...

3419

扫码关注云+社区