【性能】perf + 火焰图分析软件性能瓶颈

本文详细介绍了Linux系统性能分析工具perf的使用,包括perf命令的多种用法,如perf record、perf report、perf top等,以及如何结合火焰图分析程序性能瓶颈。通过实例展示了如何生成和解读火焰图,强调了perf在性能优化中的重要作用。此外,还讨论了perf在遇到unknown函数问题时的解决策略和perf的工作原理。
摘要由CSDN通过智能技术生成

目录

零、即看即用

一、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 13204:监测进程号13204 (如果想监视线程则用 -t 6665 #6665为线程号)

--call-graph

dwarf:表示回溯方式,perf 同时支持 3 种栈回溯方式:fpdwarflbr,推荐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 结果产生的 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值