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
image
使用 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 文件。
image
第四步 使用火焰图来分析
首先全局安装 flamegraph 模块:
$ npm i flamegraph -g
运行以下命令将 cpuprofile 文件生成 svg 文件:
$ flamegraph -t cpuprofile -f cpuprofile-xxx.cpuprofile -o cpuprofile.svg
用浏览器打开 cpuprofile.svg,如下所示:
image
网友评论