【开发工具】【perf】性能分析工具perf的编译和使用说明

源码位置:

kernel/tools/perf

配置内核以支持perf

make xxx_defconfig
make menuconfig

设置以下配置:
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y

编译perf工具

make CROSS_COMPILE=xxx ARCH=xxx defconfig
make CROSS_COMPILE=xxx ARCH=xxx menuconfig
make CROSS_COMPILE=xxx ARCH=xxx Image -j4
make CROSS_COMPILE=xxx ARCH=xxx tools/perf_clean V=1
make CROSS_COMPILE=xxx ARCH=xxx tools/perf V=1

Ps:
报错:
make[4]: execvp: ./check-headers.sh: Permission denied
Makefile.perf:205: recipe for target 'sub-make' failed
原因:
脚本没执行权限,添加上可执行权限就行了
解决办法:
chmod +x tools/perf/check-headers.sh

报错:
builtin-script.c:1752:23: 
error: ‘/bin/’ directive writing 5 bytes into a region of size between 1 and 4096 
[-Werror=format-overflow=]
 1752 |  sprintf(filename, "%s/bin/%s-record", dir_name, scriptname);
原因:
format-overflow,可以尝试关掉这个报错,不影响正常运行
-Wno-error=format-overflow加入CFLAGS
解决办法:
vi tools/perf/Makefile.perf
添加
CFLAGS += -Wno-error=format-overflow
CFLAGS += -Wno-error=format-truncation

编译完成后,生成perf可执行文件
tools/perf/perf

perf使用说明

perf --help之后可以看到perf的二级命令。
序号    命令    作用
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 record,可以系统全局,也可以具体到某个进程,更甚具体到某一进程某一事件;可宏观,也可以很微观。
pref record记录信息到perf.data;
perf report生成报告;
perf diff对两个记录进行diff;
perf evlist列出记录的性能事件;
perf annotate显示perf.data函数代码;
perf archive将相关符号打包,方便在其它机器进行分析;
perf script将perf.data输出可读性文本;

可视化工具perf timechart

perf timechart record记录事件;
perf timechart生成output.svg文档;

参考:

系统级性能分析工具perf的介绍与使用 - ArnoldLu - 博客园 (cnblogs.com)

google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用工具可以对 CPU 时间片、内存等系统资源的分配使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。 1. 编译目标程序,加入对 google-perftools 库的依赖。 2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。 3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。 安装 您可以在 google-perftools 的网站 (http://code.google.com/p/google-perftools/downloads/list) 上下载最新版的安装包。为完成步骤 3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如 gv(http://www.gnu.org/software/gv/)。 编译与运行 您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。 google-perftools 需要在目标代码的开始结尾点分别调用剖析模块的启动终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计分析。工具的启动终止可以采用以下两种方式。 a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。 gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。 命令 功能 ctrl+c 暂停程序的运行 c 继续程序的运行 b 添加函数断点(参数可以是源代码中的行号或者一个函数名) p 打印某个量的值或者执行一个函数调用 b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。 两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。 示例详解 该程序是一个简单的例子,文中有两处耗时的无用操作,并且二者间有一定的调用关系。 清单 1. 示例程序 void consumeSomeCPUTime1(int input){ int i = 0; input++; while(i++ < 10000){ i--; i++; i--; i++; } }; void consumeSomeCPUTime2(int input){ input++; consumeSomeCPUTime1(input); int i = 0; while(i++ < 10000){ i--; i++; i--; i++; } }; int stupidComputing(int a, int b){ int i = 0; while( i++ < 10000){ consumeSomeCPUTime1(i); } int j = 0; while(j++ < 5000){ consumeSomeCPUTime2(j); } return a+b; }; int smartComputing(int a, int b){ return a+b; }; void main(){ int i = 0; printf("reached the start point of performance bottle neck\n"); sleep(5); //ProfilerStart("CPUProfile"); while( i++ MyProfile.pdf 转换后产生的结果文档如下图。图中的数字框体的大小代表了的某个函数的运行时间占整个剖析时间的比例。由代码的逻辑可知,stupidComputing,stupidComputing2 都是费时操作并且它们 consumeSomeCPUTime 存在着一定的调用关系。 图 1. 剖析结果 结束语 本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用工具配置、使用及分析性能瓶颈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan_ZGYF丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值