目录
零、即看即用
前提:下载flamegraph工具包
git clone https://github.com/brendangregg/FlameGraph.git
方法一、
第1步、监测进程
$ sudo perf record -a --call-graph dwarf -p 667651 sleep 30
-p 13204:
监测进程号13204 (如果想监视线程则用 -t 6665 #6665为线程号)
--call-graph:
dwarf:
表示回溯方式,perf
同时支持 3 种栈回溯方式:fp
, dwarf
, lbr
,推荐dwarf,理由见文章末尾
sleep 30:
持续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/24318994?spm=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参数
Perf record
记录一段时间内系统/进程的性能时间
参数:
-e:选择性能事件
-p:待分析进程的id
-t:待分析线程的id
-a:分析整个系统的性能
-C:只采集指定CPU数据
-c:事件的采样周期
-o:指定输出文件,默认为perf.data
-A:以append的方式写输出文件
-f:以OverWrite的方式写输出文件
-g:记录函数间的调用关系
通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
13204
是进程号
$ sudo perf record -F 99 -p 13204 -g sleep 30
上面的代码中,perf record
表示记录,-F 99
表示每秒99次,-p 13204
是进程号,即对哪个进程进行分析,-g
表示记录调用栈,sleep 30
则是持续30秒。
运行后会产生一个庞大的文本文件。如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。
举例:
sudo perf record -e cpu-clock -g -p 2548
-g 选项是告诉perf record额外记录函数的调用关系
-e cpu-clock 指perf record监控的指标为cpu周期
-p 指定需要record的进程pid
为了便于阅读,perf record
命令可以统计每个调用栈出现的百分比,然后从高到低排列。
$ sudo perf report -n --stdio
这个结果还是不易读,所以才有了火焰图。
生成火焰图
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 结果产生的