专题:性能调优之工具---perf

article/2025/9/26 13:20:22

1. Linux Perf简介

1.1 Perf是什么

Perf 是内置于Linux 内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。linux2.6及后续版本都自带该工具,几乎能够处理所有与性能相关的事件。

1.2 性能事件

性能事件指在处理器或者操作系统中发生,可能影响到程序性能的硬件事件或者软件事件。

1.3 主要作用

Perf工具可用来对软件进行优化,包括算法优化(空间复杂度、时间复杂度)和代码优化(提高执行速度、减少内存占用)。还可以评估程序对硬件资源的使用情况,例如各级cache的访问次数,各级cache的丢失次数、流水线停顿周期、前端总线访问次数等。也可以评估程序对操作系统资源的使用情况,系统调用次数、上下文切换次数、任务迁移次数等。

1.4 perf 安装

1.4.1 利用源码安装

下载一份2.6版本以后的linux源码,网址(https://www.kernel.org/)

在linux/tools/perf目录中执行命令,make--->make install,在usr1/用户名/bin下会有个perf命令。

1.4.2 利用软件包安装

……,网上的各种安装方法感觉都不好使,还是用源码来的方便快捷。

以上为linux下的perf的基本原理和工作流程

2.Perf基本原理

Perf主要基于性能事件的采集和分析,有两种采集方法:

基于硬件的采集方法,此种方法需要采用CPU中的PMU(performance monitoring unit)部件,在特定的条件下探测性能事件是否发生以及发生的次数。

基于软件的采集方法,需要将代码内置于kernel,分布在各个功能模块中,统计和操作系统相关性能事件。

那么perf 是怎么做到的呢?首先,perf 会通过系统调用sys_perf_event_open在内核中注册一个监测“cycles”事件的性能计数器。内核根据perf 提供的信息在PMU 上初始化一个硬件性能计数器(PMC: Performance Monitoring Counter)。PMC随着CPU 周期的增加而自动累加。在PMC溢出时,PMU 触发一个PMI(Performance Monitoring Interrupt)中断。内核在PMI 中断的处理函数中保存PMC的计数值,触发中断时的指令地址(Register IP:Instruction Pointer),当前时间戳以及当前进程的PID,TID,comm 等信息。我们把这些信息统称为一个采样(sample)。内核会将收集到的sample 放入用于跟用户空间通信的Ring Buffer。

用户空间里的perf 分析程序采用mmap 机制从ring buffer 中读入采样,并对其解析。perf 根据pid,comm 等信息可以找到对应的进程。根据IP 与ELF 文件中的符号表可以查到触发PMI 中断的指令所在的函数。为了能够使perf 读到函数名,我们的目标程序必须具备符号表。如果读者在perf 的分析结果中只看到一串地址,而没有对应的函数名时,通常是由于在编译时利用strip 删除了ELF 文件中的符号表。建议读者在性能分析阶段,保留程序中的symbol table,debug info等信息。【1】

2.1 Perf硬件采样原理

Perf硬件采样主要利用了CPU中的PMU部件。接下来为大家介绍PMU部件的操作方法。

       下面为翻译的arm官方文档DDI0464E_cortex_a7_mpcore_r0p4_trm.pdf,这篇文档主要针对cortex_a7来讲的,详细的讲述了PMU部件。【2】

    2.1.1 关于PMU

       基于PMUv2架构,A7处理器在运行时可以收集关于处理器和内存的各种统计信息。对于处理器来说这些统计信息中的事件非常有用,你可以利用它们来调试或者剖析代码。

       处理器PMU部件提供了4个计数器。每个计数器都可以对处理器的任何事件(可用的)计数。

    2.1.2 PMU功能描述

       主要包含三部分,eventinterface,CP15 and APB interface,Counters

     上图为PMU部件的组成,主要是那5个计数器。

       Eventinterface

       Eventsfrom all other units from across the design are provided to the PMU.

       提供给PMU部件的所有事件,这些事件全部来自其他的部件。


       CP15and APB interface

The PMUregisters can be programmed using the CP15 system control coprocessor orexternal APB interface.

       PMU寄存器可以通过CP15 协处理器和外部APB接口来编程。


       Counters计数器

       PMU含有4个随事件增加32位计数器。

       PMU含有1个随处理器时钟周期增加的循环计数器。

2.1.3 PMU寄存器汇总

       访问方式:PMU计数器和PMU控制寄存器可以通过CP15协处理器和APB接口来访问。

       下表为Cortex-A7MPCore PMU 寄存器,只列出了一部分,详细查看请看本篇文章底部。

numberOffsetCRnOp1CRmOp2NameTypeDescription
00x000c90c132PMXEVCNTR0RW事件计数寄存器, 参见 the ARM Architecture Reference Manual 手册
10x004c90c132PMXEVCNTR1RW
20x008c90c132PMXEVCNTR2RW
30x00Cc90c132PMXEVCNTR3RW
4--300x010-0x78-----Reserved 
310x07Cc90c130PMCCNTRRW循环计数寄存器, 参见 the ARM Architecture Reference Manual 手册
32-2550x080-0x3FC -----Reserved 
2560x400c90c131PMXEVTYPER0RW事件类型选择寄存器, 参见 the ARM Architecture Reference Manual手册


       操作PMU部件需要通过mrc和mcr指令来操作cp15协处理器。  

2.2 Perf 软件采样原理

2.3 Perf采样精度

如果需要采用高精度的采样,需要在制定性能事情时,在事件后添加后缀“:p”或者“:pp”。Perf 在采样精度上定义了4 个级别,如表2 所示。

 

表2. 性能事件的精度级别

 

0 无精度保证

1 采样指令与触发性能事件的指令之间的偏差为常数(:p)

2 需要尽量保证采样指令与触发性能事件的指令之间的偏差为0(:pp)

3 保证采样指令与触发性能事件的指令之间的偏差必须为0(:ppp)

 

3.Perf使用

3.1 使用方法

3.2 Perf常用命令

1、 perf list

2、 perf stat

3、 perf top

4、 perf record/report


参考:

【1】   Linux的系统级性能剖析工具---- 承刚

【2】   DDI0464E_cortex_a7_mpcore_r0p4_trm.pdf---- arm官网

【3】  Perf -- Linux下的系统性能调优工具,第1 部分

https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

【4】 Perf -- Linux下的系统性能调优工具,第 2 部分

http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/

【5】Linux kernel profiling with perf

   https://perf.wiki.kernel.org/index.php/Tutorial



http://chatgpt.dhexx.cn/article/3YidPFhi.shtml

相关文章

perf基本使用与简单介绍

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言perf简单介绍常用命令格式perf listperf record/reportperf topperf statperf pr…

Linux perf 命令的使用(一)

文章目录 前言一、perf简介二、perf子命令简介三、perf工作模式3.1 计数3.2 采样 参考资料 前言 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。 (1)性能剖析的目标是寻找性能瓶颈&…

手把手教你系统级性能分析工具perf的介绍与使用(超详细)

测试环境:Ubuntu16.04 Kernel:4.4.0-31 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。 性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。 代码优化的目…

perf介绍

perf学习 什么是perf? linux性能调优工具,32内核以上自带的工具,软件性能分析。在2.6.31及后续版本的Linux内核里,安装perf非常的容易。 几乎能够处理所有与性能相关的事件。perf可以用于查看热点函数,查看cashe miss的比率&am…

perf简介和使用

perf 简介 Performance analysis tools for Linux. Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level (CPU/PMU, Performance Monitoring Unit) features and sof…

perf学习总结

本文梳理一下工作中对perf工具的使用,文章开始部分的概念和原理借用了网络上很多不错的文章(如有侵权欢迎联系),后面笔者争取展示一下在工作中使用perf来解决性能问题的实例。 perf概述 perf是Linux下的一款性能分析工具&#xf…

Perf的原理、编译以及使用

​1、背景 1.1 性能分析 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选…

学会使用perf性能分析工具--这一篇就够了

在功能上,perf很强大,可以对众多的软硬件事件采样,还能采集出跟踪点(trace points)的信息(比如系统调用、TCP/IP事件和文件系统操作。perf的代码和Linux内核代码放在一起,是内核级的工具。perf是…

perf的基本使用方法

目录 前言perf的基本使用方法perf listperf statperf topperf record/perf reportperf -eperf probeperf schedperf sched mapperf sched scriptperf sched replay perf lockperf kmemperf timechartperf script 参考文档 前言 声明:本文主要参考几位老师的博文&…

Linux常用命令——ldconfig命令

在线Linux命令查询工具 ldconfig 动态链接库管理命令 补充说明 ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程…

[JavaScript] 理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY

event.clientX、event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性 event.pageX、event.pageY 类似于event.clientX、event.clientY&#xff…

clientX,clientY,offsetY,offsetX,screenX,screenY区分

在js中clientX,clientY,offsetX,offsetY,screenX,screenY都是鼠标事件的几个对象: 如下图可知: clientX:在鼠标事件发生时,鼠标相对于浏览器位置的X轴位置(…

pageX/pageY、clientX/clientY、screenX/screenY的区别

在触发鼠标事件的时候会传一个event参数,在这个参数中我们可以获得pageX/pageY、clientX/clientY、screenX/screenY,但是这几个属性有啥区别呢?看下图 screenX/screenY:其实就是你的鼠标指针距离你电脑屏幕左侧边缘和上侧边缘的距…

event事件坐标详解(clientx, offsetx, screenX等)

鼠标事件(ee||window.event) event.clientX、event.clientY (相对浏览器窗口) //鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性…

JS 中clientX clientY offsetX offsetY 等属性说明

JS中clientX clientY offsetX offsetY 等属性说明 示意图 event.clientX, event.clientY : 鼠标点击的位置距离 body 的大小event.screenX, event.screenY : 鼠标点击的位置距离 屏幕 的大小event.offsetX, event.offsetY 鼠标点击的位置距离 div盒子 的大小 没有滚动条的情…

clientX与offsetX、clientWidth与offsetWidth的区别

相关属性介绍 都要结合鼠标事件监听使用 1、client相关属性 获取鼠标位置 鼠标相对于视口的位置 e.clientX e.clientY (e是鼠标对象) 获取节点尺寸 节点.clientWidth; 节点.clientHeight;(返回值为数值) clientWidth cont…

图解事件坐标screenX、clientX、pageX, offsetX的区别

一、图解 如图所示,假设页面中灰色圆点是鼠标点击处,黄色区域是鼠标触发事件对象 二、概念 1、screenX 和screenY 参照点:电脑屏幕左上角screenX:鼠标点击位置相对于电脑屏幕左上角的水平偏移量screenY:鼠标点击位置…

clientX、pageX、screenX以及offsetX区别

clientX、pageX、clientX以及offsetX区别 client系列(不包含滚动条) clientX:鼠标相对于浏览器窗口可视区域x方向坐标 clientY:鼠标相对于浏览器窗口可视区域y方向坐标 page系列(包含滚动条) pageX&…

Client/Service

目录 客户--服务器方式 客户程序: 服务程序 TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client),而被动等待连接建立的应用进程叫做服务器(server)。 客户--服务器方式 客户(client)和服务器(server)都是指通信中所涉及的两个应用进程。客户-服务…

js鼠标事件 clientX、clientY、offsetX、offsetY、layerX、layerY、pageX、 pageY、screenX、screenY

MouseEvent的类别有以下: mousedown 鼠标按下mouseup 鼠标释放click 左键单击dblclick 左键双击mousemove 鼠标移动mouseover 鼠标经过mouseout 鼠标滑出mouseenter 鼠标进入mouseleave 鼠标离开contextmenu 右键菜单 注意: 执行顺序:mous…