node.js性能优化之CPU篇

发布于 2018-09-04 作者 shen100 460次 浏览 版块 分享

perf + 火焰图

第一步 安装perf

yum install perf

第二步 clone FlameGraph

git clone http://github.com/brendangregg/FlameGraph

第三步 通过perf_basic_prof参数启动node.js程序

node --perf_basic_prof app.js 

这时,会在/tmp目录下生成 /tmp/perf-3456.map, 即 perf-进程id.map

第四步 修改/tmp/perf-进程id.map权限

sudo chown root /tmp/perf-进程id.map

第五步 使用ab进行压测

ab -k -c 10 -n 2000 "http://localhost/your_api_path"

第六步 执行perf进行采样

sudo perf record -F 99 -p 进程id -g -- sleep 30

perf record 会将记录的信息保存到当前执行目录的 perf.data 文件中

  • -F 指定了采样频率 99Hz(即每秒 99 次,如果 99 次都返回同一个函数名,那就说明 CPU 在这一秒钟都在执行同一个函数,可能存在性能问题)。
  • -p 指定进程的 pid
  • -g 启用 call-graph 记录
  • – sleep 30 指定记录 30s

第七步 生成stacks

sudo perf script > perf.stacks

使用 perf script 读取 perf.data 的 trace 信息写入 perf.stacks。

第八步 生成热力图

./FlameGraph/stackcollapse-perf.pl --kernel < ./perf.stacks | ./FlameGraph/flamegraph.pl --color=js --hash> ./flamegraph.svg

–color=js 指定生成针对 JavaScript 配色的 svg,即:

  • green:JavaScript
  • blue:Builtin
  • yellow:C++
  • red:System(native user-level, and kernel)

用浏览器打开 flamegraph.svg

使用 v8-profiler

第一步 触发 CPU profiling

const profiler = require('v8-profiler')

app.get('/cpuprofile', function (req, res) {
    //Start Profiling
    profiler.startProfiling('CPU profile');
    setTimeout(() => {
        //Stop Profiling after 30s
        const profile = profiler.stopProfiling()
        profile.export()
            .pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`))
            .on('finish', () => profile.delete())
    }, 30000);
    res.send();
});

生成 cpuprofile-xxx.cpuprofile 文件,该文件的内容其实就是一个大的 JSON 对象

第二步 使用ab进行压测

ab -k -c 10 -n 2000 "http://localhost/your_api_path"

第三步 使用Chrome DevTools来分析

Chrome 自带了分析 CPU profile 日志的工具。打开 Chrome -> 调出开发者工具(DevTools) -> 单击右上角三个点的按钮 -> More tools -> JavaScript Profiler -> Load,加载刚才生成的 cpuprofile 文件。

第四步 使用火焰图来分析

首先全局安装 flamegraph 模块:

$ npm i flamegraph -g

运行以下命令将 cpuprofile 文件生成 svg 文件:

$ flamegraph -t cpuprofile -f cpuprofile-xxx.cpuprofile -o cpuprofile.svg

用浏览器打开 cpuprofile.svg,如下所示:

收藏
1回复
Charlotte1楼•2018-09-05

学习!!!