perf是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。
Perf可以对程序进行函数级别的采样,从而了解程序的性能瓶颈在哪里。其基本原理是:每隔一个固定时间,就是CPU上产生一个中断,看当前是哪个进程、哪个函数,然后给对应的进程和函数加一个统计值,这样就知道CPU有多少时间在某个进程或某个函数上了。具体原作原理就是直接通过系统调用syscall/ioctl或者监听SW的event来看性能。
perf支持两种模式,计算模式和采样模式。比如,perf stat使用的是计算模式,而perf record采用的是采样模式。拿采样来说,它的原理是这样的:每隔一个固定的时间,产生一个中断,然后统计对应的pid和函数。采样就预示着与实际运行情况并不能保持一致,但如果一个函数运行的时间越长,被时钟中断的机会就越大。鉴于perf最终显示的是统计值,所以它的测量结果是高度可信的。
perf包含了多个工具,使用perf –help可以看到perf的二级命令,其中,perf top类似于top命令,可以对系统性能进行实时分析。
perf --help 查看perf的二级命令
perf top #查看cpu执行情况
perf top -p pid #查看某个进程所有函数占用cpu信息
perf top -g -p pid #查看特定函数的抵用关系
perf top -t tid / perf record -t tid #查看单线程信息
perf record -a #采样,当前目录生成perf.data文件。
perf record -g -p pid #将信息输出到文件
perf report #显示类似于perf top的报告
https://github.com/cobblau/FlameGraph
火焰图(CPU Flame Graphs)是一个将CPU调用栈可视化的应用,需要使用perf, eBPF等tracer工具生成数据,然后进行可视化生成svg图片。
git clone https://github.com/brendangregg/FlameGraph.git
perf record -F 99 -a -g -p pid sleep 60
其中,-F 99 表示采样频率,每秒99次;-a表示采集所有CPU的信息,-g表示记录函数调用栈, -p pid 表示追踪进程号为pid的进程,对于多个进程号,用逗号’,’分隔,sleep 60 要求采集1分钟的数据。
perf script > out.perf #perf script 工具对生成的perf.data进行解析
./stackcollapse-perf.pl out.perf > out.folded #对符号进行折叠
./flamegraph.pl out.folded >perf.svg #生成svg图
参考资料:
系统级性能分析工具perf的介绍与使用
https://www.cnblogs.com/arnoldlu/p/6241297.html
perf + Flame Graph火焰图分析程序性能
https://www.cnblogs.com/felixzh/p/8932984.html
rsync工作机制(翻译)
https://www.cnblogs.com/f-ck-need-u/p/7221535.html#auto_id_4
下载链接:http://www.rpmfind.net/linux/rpm2html/search.php?query=perf
安装命令:rpm -ivh *.rpm
中文手册:http://linux.51yip.com/search/perf
perf的原理,编译以及使用
https://blog.csdn.net/u013983194/article/details/112209853
一文搞定 Perf 和 Gpertools https://www.51cto.com/article/653774.html