Node.js 内存飙涨以及 OOM 的问题,只要业务流量稍微复杂,一般都会遇到。如果是堆内内存,在 OOM 之前可以打一个 Heap Profiling 进行分析,如果是 OOM 之后,可以利用 llnode 对 corefile 进行分析,但如果是堆外内存飙涨呢?这一块内存通过 Chrome Devtool 工具是分析不出来的。
一年前看到内网有个团队做了个工具,叫做 andb,目前已经开源了,github.com/noslate-project/andb,使用它可以帮助我们找到堆外内存的泄漏源,分析起来尽管也不是很轻松,但在频繁 OOM 的场景下,还是有着不可缺失的重要价值的。它的内存分析思路大概是这样的:
1)找到 RSS 区的内存,通过 list 指令将每个内存 block 都打印出来,可以看到对应的地址区间以及大小
2)找到大内存地址块,使用 walk 指令打印详细的对象占用情况
3)通过 find ref 相关操作,一步步将大对象的父对象引用给挖掘出来,最后大概率可以找到业务代码的异常位置
这个操作是耗耐心,需要一个个地去向上排查内存引用堆栈,直到溯源到业务逻辑代码,在工具的体验上,我觉得还有机会做到可视化+自动化分析的,跟他们提过这个问题,只不过当下 Node.js 在业务的地位这几年肉眼可见地坍缩,人力投入也得不到保障,再加上这个工具场景偏小,真的要把体验做起来,还是有难度的。
如果你的业务是 Node.js 支撑,而且流量比较大,经常看到部分机器的内存在抖动,可以尝试下 andb,它有 lldb 和 gdb 两种模式,无论是堆内内存还是堆外内存的分析体验,相比市面上开源的其他工具,还是要好上不少的。#Web技术#