排查容器node进程内存泄漏
-
给docker-compose文件添加如下内容,允许内部执行gcore命令
cap_add: - SYS_PTRACE security_opt: - seccomp:unconfined -
在docker内安装gdb,便于使用gcore命令
sudo apt install gdb -
通过top找到node进程PID,然后执行gcore命令
gcore <PID>- 此命令可能造成进程阻塞,生产环境慎用
-
从docker中取出生成的
core.<PID>文件,用宿主机分析,这里必须保证宿主机也安装有相同大版本的node -
宿主机需要安装lldb和llnode
- 安装前置的lldb
sudo apt-get install lldb- 目前会自动安装lldb-14
- 安装llnode
sudo npm install -g llnode- 这里可能需要链接github,可能需要时间比较长,或者会失败
- 安装前置的lldb
-
启动llnode分析
llnode node -c core.<PID> -
进入后,可以执行以下命令
v8- 查看所有可用子命令
v8 findjsobjects- 找到内部所有js对象,并输出每一种类以及总的Byte数
v8 findinstances xxx- 可以把xxx替换为上面输出的js对象名,比如Object之类的,可以列出所有js对象地址
v8 findrefs js对象地址- 可以找出引用这个对象的实体,比如找到某个数组的地址,数组内包含几千个这样的对象