Dump类型
- Core dump: 进程快照
- Heap dump: 堆内存快照
- Thread dump: 线程快照,node暂时没有
详细信息可以参考文末链接
Dump作用
- Core dump: 分析CPU问题,比如CPU爆栈使用率达到或接近100%、程序异常退出等
- Heap dump: 分析内存问题,比如内存泄漏、大对象等
Dump准备
- 安装llnode
npm install -g llnode
- 安装chrome
Dump分析示例
Heap dump分析
- 模拟内存泄漏,分析heapdump找出该对象
示例a.node.js
// 模拟内存泄漏,分析heapdump,并找出该对象
require('heapdump');
const leaks = [];
function LeakingClass(){
this.name = Math.random().toString(36);
this.age = Math.floor(Math.random() * 100);
this.arr = new Array(10000);
}
setInterval(()=>{
for (let i = 0; i < 100; i++) {
leaks.push(new LeakingClass)
}
console.warn('Leaks: %d', leaks.length);
},1000);
// # --测试heapdump--
// node a.node.js # 控制台运行该程序
// ps aux|grep a.node.js # 查询进程ID
// kill -31 [PID] # 生成heapdump
在浏览器中运行上述程序,可以通过Chrome Dev Tools > Performance monitor
工具更直观查看内存泄漏情况
使用Chrome Dev Tools > Memory
工具对生成的heapdump进行分析,找出导致内存泄漏的大对象
Core dump分析一
- 模拟CPU使用过高,分析core dump找出执行耗时程序片段
示例b.node.js
// 模拟CPU使用过高,分析core dump找出执行耗时程序片段
// 一般情况下,对于Web程序而言,死循环最容易让CPU满载
const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
while(true){
// 死循环,请求进入后,CPU满载
}
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('你好世界\n')
})
server.listen(port, () => {
console.log(`服务器运行在 http://${hostname}:${port}/`)
})
// # --测试coredump--
// node b.node.js # 运行该程序
// ulimit -c unlimited # 开启coredump
// ps aux|grep b.node.js # 查询进程ID
// sudo gcore [PID] # 生成coredump
// # Mac OSX coredump文件生成后的保存路径为 /cores
// llnode node -c path/to/core-dump-file # 分析coredump
Core dump分析二
- 模拟程序异常退出,分析core dump找出程序异常点
示例c.node.js
// 模拟程序异常退出,分析core dump找出程序异常点——程序退出的位置
setTimeout(function delayedFailure(){
throw new Error('Fail not really fast');
}, 500);
// # --测试coredump--
// ulimit -c unlimited # 开启coredump生成
// node --abort-on-uncaught-exception c.node.js # 控制台运行node程序
// llnode node -c path/to/core-dump-file # 分析coredump
/// Mac下进入 /cores 目录,找到coredump文件,文件名称形式为 core.[PID]
/// node启动时增加参数 --abort-on-uncaught-exception ,在程序奔溃时自动core dump
提示
如果你是Mac电脑,已经自带Xcode,可以不用安装llvm,国内的网络环境加上编译过程没有三个小时是完不成的,直接使用llnode进行coredump分析即可
总结
本文演示了Node dump分析的过程,重在动手实践,为生产服务排障打下一定的基础,相关原理性知识可以参见官方说明。
评论