无需Chrome Inspect,Node.js 8.16.1容器环境如何获取堆转储?
无需Chrome连接获取Node.js堆转储的方法(Node 8.16.1)
方法1:借助Node内置v8模块代码触发堆转储
在应用代码中添加信号监听逻辑,通过发送自定义信号触发快照生成:
const v8 = require('v8'); const fs = require('fs'); // 监听SIGUSR2信号生成堆快照 process.on('SIGUSR2', () => { const snapshotPath = `/tmp/heap-${Date.now()}.heapsnapshot`; const snapshotStream = v8.getHeapSnapshot(); const fileStream = fs.createWriteStream(snapshotPath); snapshotStream.pipe(fileStream); console.log(`堆快照已保存至 ${snapshotPath}`); });
修改代码重启应用后,在服务器执行以下命令触发快照:
# 获取容器内Node进程PID docker exec <容器名/ID> pgrep node # 发送SIGUSR2信号 docker exec <容器名/ID> kill -USR2 <Node进程PID>
最后将容器内的快照文件拷贝到宿主机:
docker cp <容器名/ID>:/tmp/heap-xxxxxx.heapsnapshot ./
方法2:使用node-heapdump第三方包
该包兼容Node 8版本,无需调试端口即可生成堆转储:
- 安装依赖:
npm install heapdump --save
- 在应用代码中引入包(默认监听SIGUSR2信号):
require('heapdump');
- 重启应用后,发送信号触发快照:
docker exec <容器名/ID> kill -USR2 <Node进程PID>
快照默认生成在应用工作目录,用docker cp命令导出即可。
方法3:容器内调用本地调试API生成快照
由于已用--inspect启动进程,可在容器内部通过本地调试端口调用API:
- 进入容器:
docker exec -it <容器名/ID> bash
- 安装
curl(若容器未预装):
# Debian/Ubuntu系容器 apt-get update && apt-get install curl -y # Alpine系容器 apk add curl
- 调用调试API生成快照:
# 创建调试会话,返回包含id的JSON curl -X POST "http://localhost:9229/json/new" -H "Content-Type: application/json" # 替换xxx为返回的id,下载快照 curl -X GET "http://localhost:9229/json/snapshot/xxx" > /tmp/heap-snapshot.heapsnapshot
完成后将快照文件拷贝到宿主机分析。
内容的提问来源于stack exchange,提问作者ataraxis
相关产品推荐
相关产品推荐

