nodejs 应用火焰图简单分析

以前有写过一个使用speedscope 的简单说明,以下是一个使用另外一个工具进行火焰图分析的简单说明

环境准备

  • 项目结构
├── app.js
├── package.json
└── yarn.lock
  • 代码说明
    app.js
//app.js
const express = require(‘express‘);
const console = require(‘console‘);
const levenshtein = require(‘fast-levenshtein‘);
var arr=[];
const HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100 = 10;
?
const someFakeModule = (function someFakeModule () {
return {
  calculateStringDistance (a, b) {
    return levenshtein.get(a, b, {
    useCollator: true
    })
  }
 }
})()
?
const app = express();
?
app.get(‘/‘, (req, res) => {
  res.send(`
  <h2>Take a look at the network tab in devtools</h2>
  <script>
    function loops(func) {
    return func().then(_ => setTimeout(loops, 20, func))
    }
    loops(_ => fetch(‘api/tick‘))
  </script>\
  `)
});
?
app.get(‘/api/tick‘, (req, res) => {
  arr.push({name:‘Shubham‘});
  Promise.resolve(‘asynchronous flow will make our stacktrace more realistic‘.repeat(HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100))
  .then(text => {
    const randomText =Math.random().toString(32).repeat(HOW_OBVIOUS_THE_FLAME_GRAPH_SHOULD_BE_ON_SCALE_1_TO_100)
    return someFakeModule.calculateStringDistance(text, randomText)
  })
  .then(result => res.end(`result: ${result}, ${arr.length}`))
});
?
app.get(‘/api/end‘, () => process.exit());
?
app.listen(8080, () => {
  console.log(`go to http://localhost:8080/ to generate traffic`)
});

pacakge.json

{
  "name": "nodejs-flame-graph",
  "version": "1.0.0",
  "main": "app.js",
  "license": "MIT",
  "scripts": {
    "start": "node --perf-basic-prof-only-functions app.js",
    "pprof":"node --prof app.js",
    "flame":"node --prof-process --preprocess -j isolate*.log | flamebearer"
  },
  "dependencies": {
    "express": "^4.14.1",
    "fast-levenshtein": "^2.0.6"
  },
  "devDependencies": {
    "flamebearer": "^1.1.3"
  }
}

启动&&测试

  • 启动集成prof
yarn pprof
  • 一些压力测试
ab -n 2000 -c 100 http://localhost:8080/api/tick
  • 生成火焰图
yarn flame
  • 效果
    可以看出calculateStringDistance 占用是比较高的
  • 说明
    对于火焰图的生成使用了flamebearer 工具,实际上perf 也是一个很强大的工具,提供nodejs 官方也介绍了如何使用perf 进行分析

参考资料

https://nodejs.org/en/docs/guides/diagnostics-flamegraph/
https://github.com/mapbox/flamebearer
https://nodejs.org/uk/docs/guides/simple-profiling/

原文地址:https://www.cnblogs.com/rongfengliang/p/12128876.html

时间: 2024-10-09 12:54:02

nodejs 应用火焰图简单分析的相关文章

动态追踪技术(中) - Dtrace、SystemTap、火焰图

http://openresty.org/cn/presentations.html http://weibo.com/agentzh?is_all=1 http://openresty.org/posts/dynamic-tracing/ 动态追踪技术(中) - Dtrace.SystemTap.火焰图 原创 2016-05-06 章亦春 MacTalk 动态追踪技术中篇,关于 DTrace.SystemTap 和 火焰图的那点事. DTrace 与 SystemTap 说到动态追踪就不能不提

火焰图分析openresty性能瓶颈

注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包,然后解压../configure; make; make install 安装到目标主机:执行命令 stap -ve 'probe begin { log("hello systemtap!") exit() }' 如果提示pass 5: run completed ... 就表示安装成

perf + 火焰图分析程序性能

1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果: perf record perf report 举例: sudo perf record -e cpu-clock -g -p 2548 -g 选项是告诉perf record额外记录函数的调用关系 -e cpu-clock 指perf record监控的指标为cpu周期 -p 指定需要reco

perf + Flame Graph火焰图分析程序性能

1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果: usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS] The most commonly used perf commands are: annotate Read perf.data (created by perf record)

[转]perf + 火焰图分析程序性能

1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果: perf record perf report 举例: sudo perf record -e cpu-clock -g -p 2548 -g 选项是告诉perf record额外记录函数的调用关系 -e cpu-clock 指perf record监控的指标为cpu周期 -p 指定需要reco

0x nodejs火焰图工具试用

昨天有大概介绍多0x 火焰图,以下是一个简单的试用 环境准备 项目结构 ├── README.md ├── ab.sh ├── app.js ├── package.json └── yarn.lock 代码说明 flame script 为使用flamebearer 工具,all-in-one 为使用0x pacakge.json {  "name": "nodejs-flame-graph",  "version": "1.0.0&

linux性能分析工具之火焰图

一.环境 1.1 [email protected]:~$ uname -a Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 1.2 [email protected]:~$ lsb_release -a Distributor ID: UbuntuDescription: Ubuntu 16.04.3 LTSRelease: 16.0

记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用

转自:https://mp.weixin.qq.com/s/9IKaXeWTiiQTFlvZzxgsEA 记一次获得 3 倍性能的 go 程序优化实践,及 on-cpu / off-cpu 火焰图的使用 原创 2017-07-27 petergz 唯技术 先把结论列在前面: 1.Golang的性能可以做到非常好,但是一些native包的性能很可能会拖后腿,比如regexp和encoding/json.如果在性能要求较高的场合使用,要根据实际情况做相应优化. 2.on-cpu/off-cpu火焰图

Linux程序性能分析和火焰图

Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, SystemTap, Perf_events应该算是这方面的集大成者.Dtrace目前只在较高的内核版本有支持,记得是4.8以后, SystemTap则是需要在Red Hat的官方网站下载OS版本对应的调试符号和对应的调试版本内核,配置起来需要花费一定的时间,只有Perf_events使用起来比较方面,但是