作者:何方舟
之前有发现,录播 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 的方式:
这些变量依旧存在的原因只可能处于已移到老生区,暂时未被 gc。
分析未宕机前的内存图
内存有一个很健康的折线,可以看出并不存在泄露问题。
但是内存总量却在一个很高值,服务器内存上限是 8G,也就是说内存总量一直处于一个很危险的值。
但是为什么之前没有出现宕机问题呢?
结合 12.15,12.31,1.5 的pv视图。
31日由于活动的原因,录播 pv 涨了三倍,这时可以是因为内存溢出引起的宕机。
因为内存上限设置不合理,引起的内存溢出问题。
之前压测时候只关注了是否存在内存泄露与cpu占用,而忽视了内存占用这个问题。
对于部署服务时,要根据机器的内存上限以及机器CPU核心数合理的设置单服务器的内存上限值。
相关推荐
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。