perf常用用法简介

perf是linux内核自带的性能分析工具,由于其和对应的内核版本同步发布,不需要单独安装,同时功能又很强大,因此成为了笔者的主要性能分析工具。本文主要从笔者的实际使用情况出发,介绍一下perf工具的常用命令和使用场景。

perf常用参数

-C 指定统计的CPU核心编号,不指定时统计全部核心(等价于-a)

-e 指定统计事件

-p 只统计特定pid指定的进程中产生的事件

-t 只统计特定tid指定的线程中产生的事件

-K 隐藏内核中的函数符号

-U 隐藏用户态的函数符号

-g perf record工具专用的参数,记录函数的调用栈信息

其他参数可以通过man perf-top等命令查看perf工具集的手册了解。

perf list

perf list命令可以列出perf支持的内置事件列表。输出的列表如下所示:

 List of pre-defined events (to be used in -e): 
 cpu-cycles OR cycles [Hardware event] 
 instructions [Hardware event] 
…
 cpu-clock [Software event] 
 task-clock [Software event] 
 context-switches OR cs [Software event] 
…
 ext4:ext4_allocate_inode [Tracepoint event] 
 kmem:kmalloc [Tracepoint event] 
 module:module_load [Tracepoint event] 
 workqueue:workqueue_execution [Tracepoint event] 
 sched:sched_{wakeup,switch} [Tracepoint event] 
 syscalls:sys_{enter,exit}_epoll_wait [Tracepoint event] 
…

可以看到事件分为三类:Hardware event硬件事件、Software event软件事件和Tracepoint event追踪点事件。后两种事件都是由内核定义的软件事件,而硬件事件则是由CPU的PMU硬件产生的事件。由于不同的CPU支持的硬件事件各不相同,事件种类很多,因此perf不可能内置所有CPU的所有事件,只能包含主流CPU型号的常用事件。但是perf可以通过参数-e r$Umask$Event来直接指定硬件事件编号,从而统计CPU支持的任何硬件事件。在Intel的开发者手册《Intel 64 and IA-32 Architectures Software Developer's Manual》Volume 3的19.1和19.4章节,可以查到PMU支持的所有事业参数。在手册中可以看到一些事件除了Umask和Event之外,还有cmask,inv,any等参数,这些参数直接写在umask和event前面即可。例如cmask=1,inv=1,any=1的010E事件写成-e r01A0010E即可。在开发者手册第三卷的18.2.1.1节Architectural Performance Monitoring Version1 Facilities中可以看到事件选择参数寄存器的格式定义。

perf stat

perf stat可以用于统计分析系统或者特定软件的整体执行情况。

$perf stat ./t1 
 Performance counter stats for './t1': 
 
 262.738415 task-clock-msecs # 0.991 CPUs 
 2 context-switches # 0.000 M/sec 
 1 CPU-migrations # 0.000 M/sec 
 81 page-faults # 0.000 M/sec 
 9478851 cycles # 36.077 M/sec (scaled from 98.24%) 
 6771 instructions # 0.001 IPC (scaled from 98.99%) 
 111114049 branches # 422.908 M/sec (scaled from 99.37%) 
 8495 branch-misses # 0.008 % (scaled from 95.91%) 
 12152161 cache-references # 46.252 M/sec (scaled from 96.16%) 
 7245338 cache-misses # 27.576 M/sec (scaled from 95.49%) 
 
  0.265238069 seconds time elapsed 

如上图所示,在默认情况下,perf stat会统计cycles、instructions、cache-misses、context-switches等对系统或软件性能影响最大的几个硬件和软件事件。通过这些统计情况,基本上就能了解软件的运行效率是受CPU影响较大还是IO影响较大,是受运算指令数影响较大还是内存访问影响较大。通过指令数、缓存访问数等统计还能大致判断软件性能是否符合对应的功能设计,是否有代码级优化的可能。

perf top

perf top可以用于观察系统和软件内性能开销最大的函数列表。通过观察不同事件的函数列表可以分析出不同函数的性能开销情况和特点,判断其优化方向。例如如果某个函数在perf top -e instructions中排名靠后,却在perf top -e cache-misses和perf top -e cycles中排名靠前,说明函数中存在大量cache-miss造成CPU资源占用较多,就可以考虑优化该函数中的内存访问次数和策略,来减少内存访问和cache-miss次数,从而降低CPU开销。

在较新的内核版本中,perf top还可以深入到函数对应的汇编指令中,明确指出是哪些指令占用了计算资源,可以非常明确的指明软件性能热点。

perf record和perf report

perf record一般和perf report搭配使用。perf record可以记录系统或软件一段时间内的事件统计情况,再通过perf report进行文本界面的展示。使用perf record可以将时间段内的情况记录下来,进行整个时段的分析,或者复制到其他设备上做后续分析,这是其他命令不支持的。perf record还有一个特别的参数-g,可以支持记录函数的调用关系。使用这个参数,就不止能够看到性能开销高的函数列表,还能看到这些函数是如何被调用和使用的。在很多情况下,性能开销高的函数都是memcpy之类的系统基础函数,其本身是没有什么优化空间的,能够优化的是调用memcpy的方式和次数。通过perf record -g就能够分析出这些函数的调用关系,从而找到真正需要优化的代码位置。

<think>首先,用户的问题是:“我想查找查看perf.data文件的常用方法 请问查看perf.data文件的常用方法”。用户引用了几个来源,但这些引用是关于Perf工具的基本信息,特别是perf record和perf report。 关键点: - 用户想知道如何查看perf.data文件的常用方法。 - 引用[1]提到perf record生成perf.data文件,perf report用于分析和展示数据。 - 引用[2]提到Perf工具的常用参数,包括record,以及生成火焰图。 - 引用[3]提到Perf可以分析硬件和软件事件。 所以,查看perf.data文件的常用方法主要围绕Perf工具的命令。具体来说,perf report是主要的命令,用于查看和分析perf.data文件。 常用方法: 1. **perf report**: 这是最直接的方法。运行`perf report`会打开一个交互式界面,展示性能数据,包括函数调用、CPU使用率等。 2. **perf script**: 这个命令可以将perf.data转换为文本格式,便于脚本处理或进一步分析。 3. **生成火焰图**: 结合Perf和FlameGraph工具,可以生成火焰图,可视化性能瓶颈。引用[2]提到了这一点。 4. **其他命令**: 如perf annotate(用于查看汇编代码与性能计数器),perf top(实时监控),但perf top是针对实时系统的,不直接查看perf.data文件。 用户指定了系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能没有数学内容,所以不需要。 - 独立公式必须使用$$...$$格式,但这里可能不适用。 - LaTeX语法正确:确保命令正确格式化。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,例如[^1]。 回答结构: - 先直接回答用户问题,列出常用方法。 - 然后提供示例命令或步骤。 - 最后生成相关问题。 用户之前的上下文:用户提到“参考站内引用”,但这不是真正的需求,我应该参考用户上一次的问题和我的回答。然而,在对话历史中,这是第一次关于Perf工具的交互,所以没有上一次的问题。用户说“我想查找查看perf.data文件的常用方法”,所以这是新查询。 确保回答真实可靠:基于引用和标准知识。 大纲回答: 1. **介绍常用方法**:列出几个主要命令。 - perf report - perf script - 生成火焰图 2. **详细命令**:给出示例命令。 3. **引用标识**:在相关内容末尾添加, [^2], [^3]。 4. **生成相关问题**:在末尾添加§§相关问题§§。 最终回答结构: - 以中文清晰回答。 - 命令用代码块表示,如示例中的Python代码。 - 相关问题:生成3-4个相关问题。 </think> 基于您的查询和提供的引用信息,我将详细解释查看`perf.data`文件(由`perf record`生成)的常用方法。`perf.data`是Linux性能分析工具Perf生成的数据文件,记录了程序运行时的性能指标(如CPU使用率、函数调用栈等)。以下是几种常用查看方法: ### 1. **使用 `perf report` 交互式分析(最常用)** `perf report` 是Perf工具的核心命令,用于打开一个交互式终端界面,可视化分析`perf.data`文件。它会显示函数或模块的CPU占用率、调用关系等,帮助快速定位性能瓶颈。 **命令示例**: ```bash perf report # 默认使用当前目录下的perf.data文件 ``` - **操作说明**: - 使用方向键浏览函数列表。 - 按 `Enter` 键展开子函数调用栈。 - 按 `q` 键退出界面。 - 此方法适合快速定位热点函数,如引用[1]所述:perf report 用于分析和展示数据。 ### 2. **使用 `perf script` 生成文本报告** `perf script` 将`perf.data`转换为文本格式(如JSON或纯文本),便于脚本处理或日志分析。输出包含时间戳、事件类型和调用栈详情。 **命令示例**: ```bash perf script # 输出到终端 perf script -i perf.data > output.txt # 保存到文件 ``` - **适用场景**:需要进一步处理数据时(如自动化分析),如引用[2]中提到结合FlameGraph生成火焰图[^2]。 ### 3. **生成火焰图可视化** 通过`perf script`和FlameGraph工具链,可以将`perf.data`转换为火焰图,直观展示函数调用频率和性能瓶颈。 **步骤示例**: ```bash # 1. 生成中间数据 perf script -i perf.data > perf.script # 2. 使用FlameGraph转换 stackcollapse-perf.pl perf.script | flamegraph.pl > flamegraph.svg ``` - **效果**:火焰图以SVG图像形式展示,x轴表示CPU时间,y轴表示调用栈深度,如引用[2]所述用于分析性能瓶颈[^2]。 ### 4. **其他辅助命令** - **`perf annotate`**:查看汇编代码级的性能数据(需调试支持)。 - **`perf timechart`**:生成时间序列图表,显示CPU和IO事件。 - **`perf mem`**:分析内存访问事件(如cache miss),如引用[3]所述可分析硬件/软件事件[^3]。 ### 注意事项 - 确保`perf.data`文件存在(默认由`perf record`生成)。 - 使用前安装Perf工具(Linux系统):`sudo apt install linux-tools-common`。 - 更多参数参考手册:`man perf`。 以上方法均基于标准Perf工具实践,确保数据可靠[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值