一次nodejs内存泄漏故障分析

欢迎访问我的最佳实践网站

公司目前项目用的是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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,366评论 25 709
  • Address:https://www.zybuluo.com/XiangZhou/note/208532 Exp...
    天蠍蒗漫阅读 11,448评论 2 55
  • 作者:老周 湿热的天气,也挡不住我外出。乘坐408观光车到龙王庙看汛情。途经武汉关船码头,用手机隔着玻璃窗,拍摄下...
    wlilyw阅读 486评论 0 1
  • 减少dns查询,将要加载的东西,例如css、js等尽量放在一个域名下,减少dns查询次数 TCP连接复用keep-...
    zjh111阅读 126评论 0 0
  • 看着自己的名字第一次出现在画展上,总觉得有点不真实,我原以为这一步要在三十岁以后才有实现的可能,可生活就这...
    angela_luan阅读 249评论 0 2