如何快速定位ssr服务端内存泄漏问题
背景
ssr服务和纯后端服务有些不一样,服务端需要去解析模板,生成HTML。解析模板的过程中,可能存在内存泄漏问题(前端代码部分造成的)
排查的困难点
- 不太容易从最近上线的代码中找到泄漏点
- 因为帮其他组的伙伴看内存泄漏问题,所以代码不太熟悉,代码提交有点多,时间线也比较长,不太好一个一个的去看
- ssr服务和纯后端服务有些不一样,ssr服务造成的泄漏点,很可能在前端代码部分
- 这样造成,不容易像纯后端代码一样,做单元压测,看内存情况
- 本地起dev会有个问题,会直接把node内存打满,导致根本没法测
- Node.js的代码在运行的时候,默认情况下最大能用的内存空间大概是1.4GB左右(受到v8引擎的限制)。dev环境的代码是没压缩的,而且有很多source map代码,导致很容易打满1.4G,导致直接卡死,没法测
- 并且dev代码会有很多噪声,导致不好排查泄漏问题(并且dev代码可能本身就有内存泄漏)
- 公司内部的平台能生成内存快照,但那个平台很不好用,生成一次快照的速度极慢。
解决方法
还是得本地用node --inspect,借助google的开发者工具,去看内存泄漏情况,也方便后续压测(不知道怎么用的话,可翻我以前的文章)
- 用build后的代码,直接build可能会不能用,要控制好环境变量,并且丑化压缩要关掉
- 比如,让一些环境变量(CDN域名等)指向本地,因为打的包在本地,没上传到CDN
- 本地模拟线上环境
- 比如本地起node服务(类似线上环境),去跑SSR
- (这个项目用的nuxt,可以直接nuxt start)
- 内存监控
解决过程
-
本地用node起服务,和 build 打包代码,就因项目而异了
-
内存如何监控?
- 用memory页签内的,第二个profiling type
- 用memory页签内的,第二个profiling type
-
去请求你本地起的服务,并查看泄漏情况,找到泄漏对象
-
代码内去找到对应对象
- eventBus会留在node内存里
- 解决之后,在压测一下,看看内存回收情况
总结一下如何快速定位内存泄漏问题
- 最好每次发版都要监控好内存的变动情况,这样可以第一时间确定好代码变动的范围,从而更容易找到内存泄漏的点
- 打build线上包,并且丑化压缩要关掉。去掉dev包的噪音
- 在本地用node --inspect把build包跑起来
- 压测,看内存回收情况
码字不易,点赞鼓励!