Node常用dump分析

Node常用dump分析

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工具更直观查看内存泄漏情况
node-mem-leak

使用Chrome Dev Tools > Memory工具对生成的heapdump进行分析,找出导致内存泄漏的大对象
node-mem-leakt

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

node-cpu-100

node-cpu-101

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

node-proc-crash

提示

如果你是Mac电脑,已经自带Xcode,可以不用安装llvm,国内的网络环境加上编译过程没有三个小时是完不成的,直接使用llnode进行coredump分析即可

llvm-install

总结

本文演示了Node dump分析的过程,重在动手实践,为生产服务排障打下一定的基础,相关原理性知识可以参见官方说明。

参考

风清洋

风清洋

保持原动力,迎接每一天

评论