Linux最直观的性能分析(热点分析)-编译perf并生成火焰图


 本文先介绍了linux下perf工具的使用场景,然后对命令行安装和源码编译安装两种方式做了说明,接下来通过最简单的perf top命令给出perf的直观印象,最后通过perf record生成火焰图的方式说明如何发现进程中的函数热点。

一、perf工具介绍

perf,也叫perf_events,最初被称为Linux的性能计数器,是Linux中的一种性能分析工具,自2009年的Linux内核版本2.6.31起可用。

通过命令行方式访问,并提供一系列子命令,能对整个系统(包括内核和用户空间代码)进行统计分析。

支持硬件性能计数器、跟踪点、软件性能计数器(例如hrtimer)以及动态探针(例如kprobes或uprobes)。

2012年,两位IBM工程师将perf(以及OProfile)认定为Linux上最常用的两种性能计数器分析工具之一。

二、应用场景

  • CPU性能分析:Perf可以监测程序的CPU使用情况,包括每个函数的执行时间和调用次数,帮助找出CPU密集型程序的性能瓶颈。

  • 内存性能分析:Perf工具可以监测程序的内存分配和释放情况,帮助开发者发现内存泄漏等问题。使用perf mem -p 命令可以监测特定进程的内存使用情况。

  • 线程性能分析:Perf工具还可以用于分析多线程程序的运行情况,包括线程的创建、销毁和调度等,对优化多线程程序的性能有帮助。

  • 实时性能监控:perf top命令可以实时显示程序的运行数据,类似于top命令,能够实时查看程序的CPU占用率和调用栈等信息。

  • 性能数据统计:perf stat命令可以统计程序的运行数据,显示程序的CPU占用率、上下文切换次数、内存访问次数等指标。

  • 系统瓶颈定位:Perf工具能够帮助系统管理员快速发现系统中的性能问题,并采取相应措施进行优化,如使用perf top实时监控耗费CPU资源的函数。

  • 硬件性能评估:Perf工具也可用于评估硬件性能,如使用perf bench命令进行内置基准测试,测试内存带宽等。

  • 生成火焰图:Perf可以结合FlameGraph工具生成火焰图,这是一种可视化方法,通过火焰图可以直观地看出程序中哪些部分占用了更多的资源,从而帮助开发者进行性能调优。

  • 长时间监控与分析:Perf工具可以用于长时间的系统性能监控,例如记录全系统性能数据,持续时间可以长达一天。

三、perf安装

1. 通过命令行方式安装

sudo apt install linux-tools-common
sudo apt install linux-tools-generic

注意:在命令行中输入perf可验证是否安装成功

2. 通过编译方式安装

当嵌入式板端环境限制,无法通过apt-get安装情况下,可以在开发环境下编译好打包后放到板子。

注意:请根据使用的linux内核版本编译对应的perf工具

2.1 查看linux内核版本
cat /proc/version

2.2 下载linux内涵源码
# 可以在这个网站选择对应内核版本下载:https://mirrors.edge.kernel.org/pub/linux/kernel/
curl -o linux-source.4.9.253.tar.gz https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.9.253.tar.gz

2.3 编译perf工具
cd linux-4.14.61
make -C tools/perf/

注意:出了get_cpuid这个缺失并不影响外,其他的尽量都安装一下

2.4 安装
# 编译过之后,perf在 tools/perf/perf
# 通过ldd查看perf的依赖库,将对应的依赖库(非系统库)一起打包
make -C tools/perf help
make prefix=./install install

四、perf使用

1. perf查看支持事件

perf list

2. perf top实时查看进程CPU和调用堆栈

perf top -g -p $PID

3. perf record记录数据并生成火焰图

火焰图是一种最直观的查看应用程序性能的可视化工具,通过火焰图可以快速定位程序性能瓶颈

3.1 采集perf数据

注意:数据采集和转换成unfold数据必须在待测试程序在运行的机器上执行

# -F可以指定采集频率,如果CPU性能不行,可以适当降低数值
# 后台采集120秒数据
perf record -p ${pid} -a -g -F 3000 -o myappperf.data -- sleep 120 &
# 采集完成后需要生成unfold数据,这一步耗时较长,但是
perf script -i ${perf_data_file} &> myappperf.unfold
3.2 生成火焰图

这一步可以在任意一台机器上运行

# 安装c++filt ,这个工具主要是将c++符号转化为更适合人看的格式
sudo apt-get install c++filt

# 下载将perf数据生成火焰图的工具
git clone https://github.com/brendangregg/FlameGraph.git

# 生成火焰图  
cd FlameGraph
./stackcollapse-perf.pl myappperf.unfold | c++filt &> myappperf.folded
./flamegraph.pl myappperf.folded > myappperf.svg
3.3 查看火焰图

使用google浏览器就可以查看火焰图,点击每个函数名可以查看具体信息

3.4 根据火焰图查看热点函数

火焰图中每个函数上都有对应的百分比数值,代表了这个函数在进程中的占用时间

耗时较多的函数一般也是程序热点函数,对这些函数进行优化,可以显著提高程序性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值