目录
零、即看即用
一、perf 命令
perf简介
perf record参数
命令例子
二、火焰图的含义
三、互动性
四、火焰图示例
五、局限
六、Node 应用的火焰图
七、浏览器的火焰图
八、参考链接
九、其他性能分析工具
十、perf工具远比上面讲的更强大
perf top
perf stat
perf record
perf report
十一、perf命令详情
perf火焰图大量unknown的问题
栈回溯方式
测试
总结
perf 的工作原理
错记录
零、即看即用
前提:下载flamegraph工具包
git clone https://github.com/brendangregg/FlameGraph.git
方法一、
第1步、监测进程
$ sudo perf record -a –call-graph dwarf -p 667651 sleep 30
-p 监测进程
–call-graph
表示回溯方式, 同时支持 3 种栈回溯方式:, , ,推荐
持续30秒。(注意sleep 前面没有–,–sleep用法是错的)
Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data.
第2步、 解析数据
用perf script工具对perf.data进行解析
perf script -i perf.data &> perf.unfold
第3步、符 进行折叠
将perf.unfold中的符 进行折叠:
#./stackcollapse-perf.pl perf.unfold &> perf.folded
第4步、生成svg图
./flamegraph.pl perf.folded > perf-$(date +%Y%m%d-%H:%M:%S).svg
进入flamegraph目录把下面的yourProcessName替换成你程序的名字,拷贝执行即可:
pname=yourProcessName&&sudo perf record -a –call-graph dwarf -p $(pidof pname) sleep 30 &&perf script -i perf.data &> perf.unfold&&./stackcollapse-perf.pl perf.unfold &> perf.folded&&./flamegraph.pl perf.folded > perf-$(date +%Y%m%d-%H:%M:%S).svg
方法二、
1,perf record –call-graph dwarf -p 12345
2,perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > process.svg
用法三、
使用perf采样
1.直接使用perf启动服务
# perf record -g ls
——————————–
2.挂接到已启动的进程
# 使用PID监控程序
# sudo perf record -e cpu-clock -g -p pid
# 如果svg图出现unknown函数,使用如下
# sudo perf record -e cpu-clock –call-graph dwarf -p pid
# 使用程序名监控程序
# sudo perf record -e cpu-clock -g -p `pgrep your_program`
————————————
第一种方式不需要root权限,第二种方式需要root权限
使用ctrl+c中断perf进程,或者在命令最后加上参数 –sleep n (n秒后停止)
perf record表示记录到文件,perf top直接会显示到界面
如果record之后想直接输出结果,使用perf report即可
原文链接:https://blog.csdn.net/u013919153/article/details/110559888
火焰图实例下载:https://download.csdn.net/download/bandaoyu/24318994pm=1001.2014.3001.5503
一、perf 命令
perf简介
perf 命令(performance 的缩写),它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。
Perf是一个包含22种子工具的工具集,以下是最常用的5种:
perf-list :Perf-list用来查看perf所支持的性能事件,有软件的也有硬件的。
perf-stat
perf-top: perf top主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。默认的性能事件为cpu cycles。
perf-record
perf-report
perf record参数
通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
是进程
上面的代码中,表示记录,表示每秒99次,是进程 ,即对哪个进程进行分析,表示记录调用栈,则是持续30秒。
为了便于阅读,命令可以统计每个调用栈出现的百分比,然后从高到低排列。
这个结果还是不易读,所以才有了火焰图。
生成火焰图
1、Flame Graph项目位于GitHub上:https://github.com/brendangregg/FlameGraph
2、可以用git将其clone下来:git clone https://github.com/brendangregg/FlameGraph.git
我们以perf为例,看一下flamegraph的使用方法:
1、第一步
$sudo perf record -e cpu-clock -g -p 28591
Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data.
2、第二步
用perf script工具对perf.data进行解析
perf script -i perf.data &> perf.unfold
3、第三步
将perf.unfold中的符 进行折叠:
#./stackcollapse-perf.pl perf.unfold &> perf.folded
4、最后生成svg图:
./flamegraph.pl perf.folded > perf.svg
命令例子
3.2查看单个进程各个函数cpu使用率
perf top -e cycles -p 3352 |
3.3使用perf record 记录:
perf record -e cpu-clock -p 进程 perf report |
3.4统计进程里最耗时函数
perf record -e cycles –g -p 进程 perf report |
perf record -a -F 1000 sleep 5 |
其中-F 1000是指定采样频率为1000次/秒
Sleep 5 指采样5秒
perf stat -e ‘sched:*’ -p 28135 sleep 5 |
统计5秒内28135进程调度情况
二、火焰图的含义
火焰图是基于 perf 结果产生的 SVG 图片(http://queue.acm.org/downloads/2016/Gregg4.svg),用来展示 CPU 的调用栈。
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
三、互动性
火焰图是 SVG 图片(http://queue.acm.org/downloads/2016/Gregg4.svg),可以与用户互动。
(1)鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子。
(2)点击放大
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
左上角会同时显示”Reset Zoom”,点击该链接,图片就会恢复原样。
(3)搜索
按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
四、火焰图示例
下面是一个简化的火焰图例子。
首先,CPU 抽样得到了三个调用栈。
上面代码中,是启动线程,调用了。后者又调用了和,而又调用了。
经过合并处理后,得到了下面的结果,即存在两个调用栈,第一个调用栈抽中1次,第二个抽中2次。
有了这个调用栈统计,火焰图工具(https://github.com/brendangregg/FlameGraph)就能生成 SVG 图片。
上面图片中,最顶层的函数占用 CPU 时间最多。的宽度大,但是它直接耗用 CPU 的部分很少(主要是d()内调用的e()和f()消耗)。和没有直接消耗 CPU(因为一层一层调用,最终上c()内调用的函数消耗cpu)。因此,如果要调查性能问题,首先应该调查,其次是。
另外,从图中可知有两个分支和,这表明里面可能有一个条件语句,而分支消耗的 CPU 大大高于。
五、局限
两种情况下,无法画出火焰图,需要修正系统行为。
(1)调用栈不完整
当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
(2)函数名缺失
有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。
六、Node 应用的火焰图
Node 应用的火焰图就是对 Node 进程进行性能抽样,与其他应用的操作是一样的。
详细的操作可以看这篇文章。
七、浏览器的火焰图
Chrome 浏览器可以生成页面脚本的火焰图,用来进行 CPU 分析。
打开开发者工具,切换到 Performance 面板。然后,点击”录制”按钮,开始记录数据。这时,可以在页面进行各种操作,然后停止”录制”。
这时,开发者工具会显示一个时间轴。它的下方就是火焰图。
浏览器的火焰图与标准火焰图有两点差异:它是倒置的(即调用栈最顶端的函数在最下方);x 轴是时间轴,而不是抽样次数。
八、参考链接
- 火焰图的介绍论文
- 火焰图官方主页
- 火焰图生成工具
摘自:perf + 火焰图分析程序性能:https://www.cnblogs.com/happyliu/p/6142929.html
如何读懂火焰图ttp://www.ruanyifeng.com/blog/2017/09/flame-graph.html
九、其他性能分析工具
vtune,gprof、oprofile、valgrind、perf。vtune perf 看不到L3cache 等硬件特性,需要vtune
十、perf工具远比上面讲的更强大
perf工具简介:https://www.cxyzjd.com/article/qq_23662505/114669615
perf工具简介+火焰图制作与解读:https://blog.csdn.net/wujinting007/article/details/112690350
perf top
perf top类似top命令,主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、
模块函数与内核函数,甚至能够定位到热点指令。默认的性能事件为cpu cycles。
perf stat
用于输出指定程序的性能统计数据
perf record
perf record收集采样信息,并记录在文件中,可以离线分析。使用下面的 perf report解析收集的采样数据文件。
perf report
perf report 主要用来分析上面perf record生成的perf.data文件。
更多详情:
Linux 调试辅助工具之perf 火焰图:https://blog.csdn.net/liuzhanchun/article/details/105507260
perf工具简介+火焰图制作与解读:https://blog.csdn.net/wujinting007/article/details/112690350
https://download.csdn.net/download/bandaoyu/24318994
十一、perf命令详情
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!