注册
perf工具详解
培训园地/ 文章详情 /

perf工具详解

shownhx 2022/11/03 1938 2 0

1. 安装使用

若机器可以联网,那就直接联网安装

yum install perf

image.png
若不能联网,就需要自行下载对应安装包安装,网上资源较多,这里不再贴链接。

2. perf概述

perf是一款综合性分析工具,大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别。 一般用于性能瓶颈的查找与热点代码的定位。

3.perf参数详解

可使用perf --help查看,为了方便,我这里贴出来中文详细说明。

序号	参数	释义
1	annotate	解析perf record生成的perf.data文件,显示被注释的代码。
2	archive	根据数据文件记录的build-id,将所有被采样到的elf文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。
3	bench	perf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。
4	buildid-cache	管理perf的buildid缓存,每个elf文件都有一个独一无二的buildid。buildid被perf用来关联性能数据与elf文件。
5	buildid-list	列出数据文件中记录的所有buildid。
6	diff	对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。
7	evlist	列出数据文件perf.data中所有性能事件。
8	inject	该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。
9	kmem	针对内核内存(slab)子系统进行追踪测量的工具。
10	kvm	用来追踪测试运行在KVM虚拟机上的Guest OS。
11	list	列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
12	lock	分析内核中的锁信息,包括锁的争用情况,等待延迟等。
13	mem	内存存取情况。
14	record	收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。
15	report	读取perf record创建的数据文件,并给出热点分析结果。
16	sched	针对调度器子系统的分析工具。
17	script	执行perl或python写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。
18	stat	执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等。
19	test	perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。
20	timechart	针对测试期间系统行为进行可视化的工具
21	top	类似于linux的top命令,对系统性能进行实时分析。
22	trace	关于syscall的工具。
23	probe	用于定义动态检查点。

perf list查看当前系统支持的性能事件;

perf bench对系统性能进行摸底;

perf test对系统进行健全性测试;

perf stat对全局性能进行统计;

perf top可以实时查看当前系统进程函数占用率情况;

perf probe可以自定义动态事件;

perf kmem针对slab子系统性能分析;

perf kvm针对kvm虚拟化分析;

perf lock分析锁性能;

perf mem分析内存slab性能;

perf sched分析内核调度器性能;

perf trace记录系统调用轨迹;

perf report生成报告;

perf diff对两个记录进行diff;

perf evlist列出记录的性能事件;

perf annotate显示perf.data函数代码;

perf archive将相关符号打包,方便在其它机器进行分析;

perf script将perf.data输出可读性文本;

perf timechart record记录事件;

perf timechart生成output.svg文档;

4. perf常用事件详解

4.1 perf top

它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数。通过热点函数我们可以去分析数据库中出现的问题,定位到具体消耗cpu的地方。

perf top
常用命令行参数:
-e <event>:指明要分析的性能事件。
-p <pid>:仅分析目标进程及其创建的线程。
-k <path>:带符号表的内核映像所在的路径。
-K:不显示属于内核或模块的符号。
-U:不显示属于用户态程序的符号。
-d <n>:界面的刷新周期,默认为2s。
-g:得到函数的调用关系图。

h:显示帮助,即可显示详细的帮助信息。
UP/DOWN/PGUP/PGDN/SPACE:上下和翻页。
a:annotate current symbol,注解当前符号。能够给出汇编语言的注解,给出各条指令的采样率。
d:过滤掉所有不属于此DSO的符号。非常方便查看同一类别的符号。
P:将当前信息保存到perf.hist.N中。

我们输入perf top进行查看:
image.png
从图片中可看到四列:
第一列(overhead):符号引发的性能事件的比例,指占用的cpu周期比例。
第二列(shared):符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
第三列(object):DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库;[k]表述此符号属于内核或模块。
第四列(symbol):符号名。有些符号不能解析为函数名,只能用地址表示。

4.2 perf record及perf report

record和report事件联合使用可以采集固定时间内进程堆栈信息并查看。

先用record采集,用如下命令会直接在当前目录下生成perf.data文件:

perf record -ag -- sleep 10

-a:采集所有cpu信息,也可用-c指定对应cpu。
-g:收集调用栈。
sleep:指定采集时间,以s为单位

再用report分析perf.data文件并查看:

主要有两种查看形式:
一、汇总函数调用的树状结构的cpu使用。
perf report
整体打印了函数调用的树状结构,并表征了一个符号占用的children具体是由哪些采样的符号组成的。
注意即使该符号没有被采样到,他也可能出现在这里,因为可能这个符号调用链的下层调用函数被采
样到了,故而这个符号就会体现在这里,而且会把他所有调用到的函数被采样的结果加总起来,得到
children这一列。

二、不查看汇总信息,只查看具体的符号被采样的比例
perf report --no-children

perf report。children为汇总信息。
image.png

perf report --no-children。overhead就是单独符号的cpu周期比例了。
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服