perf 是Linux的一款性能分析工具,能够进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,从而定位性能瓶颈。
Performance analysis tools for Linux.
系统性能优化通常可以分为两个阶段:性能分析和性能优化。性能分析的目的是查找性能瓶颈、热点代码,分析引发性能问题的原因;基于性能分析,可以进行性能优化,包括:算法优化(空间复杂度和时间复杂度的权衡)和代码优化(提高执行速度、减少内存占用)。
一,原理
Linux性能计数器是一个基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。
Perf 可以对程序进行函数级别的采样,从而了解程序的性能瓶颈在哪里。其基本原理是:每隔一个固定时间,就是CPU上产生一个中断,看当前是哪个进程、哪个函数,然后给对应的进程和函数加一个统计值,这样就知道CPU有多少时间在某个进程或某个函数上了。
二,安装
https://blog.csdn.net/qq_48201696/article/details/126381924
#下载linux-tools
sudo apt-get install linux-tools-common
#查看版本
perf --version
#查看内核版本
uname -r
5.15.0-58-generic
#安装
sudo apt install linux-tools-5.15.0-58-generic
#查看版本
perf --version
perf version 5.15.74
#配置之后才能用
>$ sudo gedit /etc/sysctl.conf
# 然后将kernel.perf_event_paranoid = -1 写入,更新一下
>$ sudo sysctl -p
三,使用
https://www.cnblogs.com/arnoldlu/p/6241297.html
1,top适合监控整个系统的性能
#perf top --call-graph fractal
2,stat比较适合单个程序的性能分析
#sudo perf stat ls -lt
3,record/report更适合对程序进行更细粒度的分析
程序见:https://www.cnblogs.com/arnoldlu/p/6241297.html
#编译fork.c文件
gcc fork.c -o fork -g -O0
#在当前目录生成perf.data文件
sudo perf record -a -g ./fork
#结果显示
sudo perf report --call-graph none
#或者直接,查看函数的调用占比
sudo perf report -i perf.data
#将本目录下的.data文件生成 svg
sudo perf timechart
解锁:sudo chmod -R 777 output.svg
生成的结果必须用网页打开:
#查看当前linux进程占比
perf report -n –stdio
4,火焰图
https://www.cnblogs.com/wx170119/p/11459995.html
按这个步骤来:
https://blog.csdn.net/pwl999/article/details/106786495
#生成perf.data
sudo perf record -g -F 99 ls
#解锁
sudo chmod -R 777 perf.data
#下载 FlameGraph-master,在其目录下执行
https://github.com/brendangregg/FlameGraph.git
#生成out.perf
sudo perf script -i perf.data > out.perf
#生成out.floded
./stackcollapse-perf.pl out.perf > out.floded
#生成svg
./flamegraph.pl out.floded > ls.svg