美文网首页我爱编程
一次nodejs内存泄漏故障分析

一次nodejs内存泄漏故障分析

作者: lxg1986 | 来源:发表于2018-03-28 15:27 被阅读42次

    公司目前项目用的是express、react、react-router、redux、redis等组建做的同构APP,同构APP带来的好处不多说了。
    这次主要是阐述一下怎么解决内存泄漏的心路历程。


    先贴一张阿里云的图片,分析一下CPU正常范围内波动,但是内存是从300M在两天的时间缓慢升到1.5G的,并且在用户请求下来后,内存还是一样的不会释放,这样在运行到第三天的时候,内存就会飙升到3G左右,虽然是一个8G的物理机,但这种内存下,浏览器的请求已经缓慢到不能忍受了,在运行一段时间后,CPU、内存都会超负荷,这时候网页请求就一点响应都没有了。

    image.png
    这个问题让我困扰了三五天的时间,每次都等到内存飙升到1.5G的时候,我们手动重启一下服务,这下内存一下被释放了,请求速度也像脱缰的野马,快到没朋友,网上也有资料说用用pm2设置自动重启,但是我们不能总是靠这种low逼的方式去隐藏这个问题,一点点排查问题吧。

    下面主要列出我解决这个问题的经过
    1、借助性能分析工具,比如node-heapdump,node-memwatch等等工具,然后借助chrome develop tool去做性能分析,但不知是我不会用还是不懂什么原因,就是分析不到那个泄漏点,这个方式以失败告终。
    2、去网上查可能泄漏的原因,比如闭包、循环引用、大量的loop,然后努力回忆代码的各种问题,貌似也没有这种问题,都在很谨慎的使用闭包,因为是同构APP,服务端会读到前端的很多代码,会不会是前端代码哪里写的不规范,这一通找,还没定位到。
    3、express middleware哪里没有写next导致请求无法释放,或者是没有某个请求下没有响应,然后把服务端代码一通检查,保证不管什么原因每个请求必须有res.send()或者res.json(),这个检查过程也让我们的代码更加健壮,所以感谢这次内存泄漏的问题。
    4、此时陷入一个绝境了,靠工具分析没有找到,或者是不会用工具?what the fuck!总之没找到。代码层面都排查一遍了,也没找到真正的原因,难道真的要靠不断重启来解决这个问题。只能去排查第三方包的问题了,然后突然想起前段时间用了一个https://www.npmjs.com/package/memory-cache组建,难道是这个问题?果断看源码,会不会因为这个memory-cache的缓存时长是用setTimeout的原因,这个定时器在并发下无法回收。然后果断去掉,把缓存用redis去管理,搞定后压测开始,妥妥的内存一直稳定在400M左右,并且升上去会隔一段时间会降低下来,有图为证。

    image.png

    相关文章

      网友评论

        本文标题:一次nodejs内存泄漏故障分析

        本文链接:https://www.haomeiwen.com/subject/axaycftx.html