Linux 下 perf 的使用

news2024/11/24 19:35:56

目录

  • 一、概述
    • 1、perf 作用
    • 2、常用的工具集
  • 二、perf 工具的使用
    • 1、perf list
    • 2、perf stat
    • 3、perf top
    • 4、perf record/report
      • 4.1 perf record
      • 4.2 perf report
    • 5、perf annotate


一、概述

1、perf 作用

perf 是一个性能分析工具(基于 Linux 内核提供的性能事件 perf_event 口),用于对 Linux 系统进行性能调优和性能分析。它可以通过收集硬件性能计数器、跟踪系统事件和采样程序调用栈等方式来提供详细的性能统计信息。

perf 依赖事件进行统计,这里的事件是通过采样机制,并不是 clock 级别的统计;根据使用 perf 工具的不同按测量事件的类型进行统计。

2、常用的工具集

除了 perf 命令本身,还有一些常用的工具集可以与 perf 搭配使用来进行更深入的性能分析和调优。以下是一些常用的 perf 工具集:

  1. perf stat:用于收集和显示性能计数器统计信息,可以通过 perf stat 命令来监测进程或命令的整体性能指标,如指令数、缓存命中率、分支预测错误等。
  2. perf record:用于采集程序执行期间的硬件性能计数器数据、事件和调用栈信息,并将其保存到数据文件中。可以使用 perf record 命令来启动采样,并通过 perf report 命令来分析采样数据。
  3. perf report:用于分析通过 perf record 收集的性能采样数据,并生成性能分析报告。可以使用 perf report 命令来查看调用栈信息、函数耗时和性能热点等。
  4. perf top:用于实时监测进程的性能指标,并显示当前的性能热点。可以使用 perf top 命令来查看 CPU 使用情况、函数执行次数和事件计数等。
  5. perf annotate:用于以源代码的方式显示采样数据和调用栈信息,并标注每个源代码行的性能指标。可以使用 perf annotate 命令来查看性能热点和优化建议。
  6. perf diff:用于比较和分析两个不同版本的程序的性能差异。可以使用 perf diff 命令来对比两个 perf 数据文件,并生成性能差异报告。
  7. perf probe:用于动态添加和移除性能探针,以收集特定代码路径的性能数据。可以使用 perf probe 命令来添加探针,并通过 perf recordperf report 命令来收集和分析探针数据。

还有一些针对性性能检查工具:如针对锁的 lock;针对调度的 sched;针对 slab 分配器性能 kmem;自定义检查点 probe 等。可以通过命令:perfperf -h 来查看:

[projectsauron]:~/$ perf -h ## 或 perf

 usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

 The most commonly used perf commands are:
   annotate        Read perf.data (created by perf record) and display annotated code
   archive         Create archive with object files with build-ids found in perf.data file
   bench           General framework for benchmark suites
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   c2c             Shared Data C2C/HITM Analyzer.
   config          Get and set variables in a configuration file.
   daemon          Run record sessions on background
   data            Data file related processing
   diff            Read perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   ftrace          simple wrapper for kernel's ftrace functionality
   inject          Filter to augment the events stream with additional information
   iostat          Show I/O performance metrics
   kallsyms        Searches running kernel for symbols
   kmem            Tool to trace/measure kernel memory properties
   kvm             Tool to trace/measure kvm guest os
   list            List all symbolic event types
   lock            Analyze lock events
   mem             Profile memory accesses
   record          Run a command and record its profile into perf.data
   report          Read perf.data (created by perf record) and display the profile
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            Run a command and gather performance counter statistics
   test            Runs sanity tests.
   timechart       Tool to visualize total system behavior during a workload
   top             System profiling tool.
   version         display the version of perf binary
   probe           Define new dynamic tracepoints
   trace           strace inspired tool

 See 'perf help COMMAND' for more information on a specific command.

二、perf 工具的使用

1、perf list

perf 自身是基于内核提供的事件统计机制的,用 perf list 命令查看,这些事件主要有由以下三种构成:

  • Hardware event:由 PMU(Performance Monitoring Unit,性能检测单元)产生的事件,如 L1 缓存等。
  • Software event:由内核产生的事件,如进程切换等。
  • Tracepoints event:由内核静态跟踪点所触发的事件。

2、perf stat

perf stat 主要在程序执行的过程中统计支持的事件计数,简单的在屏幕输出。可以使用 perf stat [options] cmd 方式执行 cmd`命令,在执行结束后会输出各类事件的统计。

perf stat 命令的选项如下所示(通过命令 perf stat -h 查看):

  • -a:显示所有 CPU 上的统计信息。
  • -c:显示指定 CPU 上的统计信息。
  • -e:指定要显示的事件。
  • -i:禁止子任务继承父任务的性能计数器。
  • -r:重复执行 n 次目标程序,并给出性能指标在 n 次执行中的变化范围。
  • -p:指定要显示的进程的 ID。
  • -t:指定要显示的线程的 ID。

例如,测试执行脚本文件 udisk.sh:


上面显示参数的描述如下:

  1. task-clock:任务真正占用的处理器时间,单位为 ms。(CPU占用率 = task-clock / time elapsed)
  2. context-switches:上下文的切换次数。
  3. CPU-migrations:处理器迁移次数,为了维持多处理器负载均衡,特定条件下会将某个任务迁移到另一个 CPU。
  4. page-faults:缺页异常的次数。当应用程序请求的页面尚未建立、请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系尚未建立时,都会触发一次缺页异常。另外 TLB 不命中,页面访问权限不匹配等情况也会触发缺页异常。
  5. cycles:消耗的处理器周期数。
  6. instructions:执行了多少条指令。IPC 为平均每个 cpu cycle 执行了多少条指令。
  7. branches:遇到的分支指令数。
  8. branches-misses:是预测错误的分支指令数。

3、perf top

perf top 工具的使用类似 Linux 的 top 命令,实时的输出函数采样按某一统计事件的排序结果,默认事件为是 cycles(消耗的处理器周期数),默认按降序排序;perf top 会统计全部用户态和内核态的函数,默认是全部 CPU,也可以指定某个 CPU 监控器。

perf top 可以提供一个实时的性能统计报告,显示当前系统上正在发生的性能瓶颈。通过分析这些统计数据,我们可以快速定位和解决问题。


常用参数(通过命令 perf top -h 查看):

  • -a:显示在所有 CPU 上的性能统计信息
  • -c<n>:指定采样周期
  • -C<cpu>:显示在指定 CPU 上的性能统计信息
  • -e:指定性能事件
  • -g:展示调用关系(通过光标上下移动,enter 展开)
  • -K:隐藏内核统计信息
  • -p:指定进程 PID
  • -s:指定待解析的符号信息
  • -t:指定线程 TID
  • -U:隐藏用户空间的统计信息

4、perf record/report

可以通过 perf record cmd 来针对 cmd 命令进行统计。收集一段时间内的性能事件到文件 perf.data(默认),随后需要用 perf report 命令分析。可以统计单个线程、进程、或者 CPU 事件。默认统计事件也是按照 cycles(消耗的处理器周期数),默认的平均统计频率为 1 秒 1000 次,也就是 1000Hz。

4.1 perf record

perf record命令用来采集数据,并且把数据写入数据文件中。

perf record 常用的选项有(通过命令 perf record -h 查看):

  • -a:分析整个系统的性能
  • -A:以 append 的方式写输出文件
  • -c:事件的采样周期
  • -C:只采集指定 CPU 数据
  • -e:选择性能事件,可以是硬件事件也可以是软件事件
  • -f:以 OverWrite 的方式写输出文件
  • -g:记录函数间的调用关系
  • -o:指定输出文件,默认为 perf.data
  • -p:指定一个进程的 ID 来采集特定进程的数据
  • -t:指定一个线程的 ID 来采集特定线程的数据

例如,用 1000 统计频率,统计一个 sleep 5 秒过程中,全部 CPU 上的事件:

root@projectsauron:~/# perf record -a -F 1000 sleep 5
[ perf record: Woken up 17 times to write data ]
[ perf record: Captured and wrote 5.204 MB perf.data (80049 samples) ]

4.2 perf report

perf reportperf record 生成的数据文件进行分析。

perf report 常用的选项有(通过命令 perf report-h 查看):

  • -c<n>:指定采样周期
  • -C<cpu>:只显示指定 CPU 的信息
  • -d<dos>:只显示指定 dos 的符号
  • -g:生成函数调用关系图,具体等同于 perf top 命令中的 -g
  • -i:导入的数据文件的名称,默认为 perf.data
  • -M:以指定汇编指令风格显示
  • –sort:分类统计信息,如 PID、COMM、CPU 等
  • -S:只考虑指定符号
  • -U:只显示已解析的符号
  • -v:显示每个符号的地址

下面对上面perf record 生成的数据文件进行分析:

root@projectsauron:~/# perf report-i perf.data

5、perf annotate

perf annotate 用于分析和显示指定函数或指令的性能特征。它提供指令级别的 record 文件定位。使用调试信息 -g 编译的文件能够显示汇编和本身源码信息。

但要注意, annotate 命令并不能够解析内核 image 中的符号,必须要传递未压缩的内核 image 给 annotate 才能正常的解析内核符号,比如:perf annotate -k /tmp/vmlinux -d symbol

perf annotate 可以帮助我们深入了解程序中的热点代码,包括函数调用、循环等,以及这些代码的性能特征,如执行时间、缓存命中率等。通过分析这些性能特征,我们可以了解到程序的瓶颈所在,并进行优化。

perf annotate 常用的选项有(通过命令 perf annotate-h 查看):

  • -C<cpu>:指定某个 CPU 事件
  • -d:只解析指定文件中符号
  • -i:指定输入文件
  • -k:指定内核文件
  • -s:指定符号定位

例:

  1. 先写一个 main.c,内容如下:
#include <stdio.h>
#include <time.h>

void func_a() {
   unsigned int num = 1;
   for (int i = 0;i < 10000000; ++i) {
      num *= 2;
      num = 1;
   }
}

void func_b() {
   unsigned int num = 1;
   for (int i = 0;i < 10000000; ++i) {
      num <<= 1;
      num = 1;
   }
}

int main() {
   func_a();
   func_b();
   return 0;
}
  1. 再使用 gcc 命令编译:gcc -g -O0 main.c -o main。(-g 是 debug 信息,保留符号表等;-O0 表示不进行优化处理)

  2. 执行统计命令:perf record -a -g ./main

root@projectsauron:~# perf record -a -g ./main
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.266 MB perf.data (2474 samples) ]
  1. 查看结果

执行 perf report -i perf.data

执行 perf annotate -i perf.data

func_a  /home/goodboy/tmp/a.out           
       │    void func_a() {
       │      push   %rbp
       │      mov    %rsp,%rbp
       │       unsigned int num = 1;
       │      movl   $0x1,-0x8(%rbp)int i;for (i = 0;i < 10000000; i++) {
       │      movl   $0x0,-0x4(%rbp)
       │    ↓ jmp    22
       │          num *= 2;
 11.1114:┌─→shll   -0x8(%rbp)
       │   │      num = 1;
       │   │  movl   $0x1,-0x8(%rbp)
       │   │#include <stdio.h>
       │   │#include <time.h>
       │   │void func_a() {
       │   │   unsigned int num = 1;
       │   │   int i;
       │   │   for (i = 0;i < 10000000; i++) {
  5.56 │   │  addl   $0x1,-0x4(%rbp)
 33.3322:│  cmpl   $0x98967f,-0x4(%rbp)
 50.00 │   └──jle    14
       │          num *= 2;
       │          num = 1;}}
       │      pop    %rbp
       │    ← retq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jacodb导入带签名的jar包失败的问题

今天在执行某个项目分析时&#xff0c;100多个jar包只有BC库的三个jar包导入失败。错误如下&#xff1a; [DefaultDispatcher-worker-1 coroutine#1] INFO org.jacodb.impl.storage.PersistenceService - Starting app version [1.4] [DefaultDispatcher-worker-16 coroutine#…

世界上最小,装机量最多的数据库居然是...

最近在根客户沟通数据库选型的时候&#xff0c;聊到了手机应用内置的数据库SQLite。别小看它哈&#xff0c;它可是世界上最小&#xff0c;装机量最多的数据库&#xff0c;只是因为它着实太低调了&#xff0c;低调的连官网都是那么朴素。麻雀虽小&#xff0c;五脏俱全&#xff0…

还在人工代码review?reviewdog和PMD了解一下

前言 代码reivew作为团队协同开发时确保代码质量的手段之一&#xff0c;在软件开发团队中非常常见。特别是对于刚入门不久的团队成员&#xff0c;通过代码review也可一定程度上避免一些低级错误&#xff0c;提升整个部分的代码健壮性。 一般来讲&#xff0c;通过代码review可…

LearnOpenGL-入门章节学习笔记

LearnOpenGL-入门章节学习笔记 简介一、核心模式与立即渲染模式二、扩展三、状态机四、对象 创建窗口一、Main函数——实例化窗口二、Callback Function 回调函数三、processInput 函数 创建三角形一、顶点输入二、顶点着色器三、编译着色器四、片段着色器五、着色器程序六、链…

二叉树——1.翻转二叉树

力扣题目链接 翻转一棵二叉树。 输入&#xff1a; 输出&#xff1a; 可以发现&#xff0c;如何翻转一个二叉树&#xff1f;将每个父节点下的子节点互换就行了&#xff0c;4下面2分支树和7分支树互换&#xff0c;2下面1和3互换&#xff0c;7下面6和9互换。在前面可以自学一下关…

55 函数嵌套定义、可调用对象与修饰器

1 函数嵌套定义 Python 允许函数的嵌套定义&#xff0c;在函数内部可以再定义另外一个函数。 def func(iterable, operator, value): # 自定义函数if operator not in -*/:return operator errordef nested(item): # 嵌套定义函数return eval(repr(item) operator repr(v…

陷入复杂度深渊的ModularRAG..

最近又有一篇ModularRAG的论文&#xff0c;虽然没有太让人汗毛竖起的惊艳&#xff0c;但我想文中的几张配图冷不丁的也着实让部分密集恐惧症患者又一次炸毛了一下吧;)...ps&#xff0c;图画的还是十分规整和可读的&#xff0c;逻辑也很是清晰&#xff0c;为作者的用心点赞&…

如何快速上手Linux操作系统

&#x1f41f;作者简介&#xff1a;&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前端-Vue框架专栏✨✨前端-Vue3速学专…

OLAP知识地图思考(附地图)

OLAP知识地图思考&#xff08;附地图&#xff09; OLAP技术在当今数据驱动的时代具有举足轻重的地位。它的核心技术模块包括数据存储、计算引擎和查询语言等&#xff0c;这些模块的有效协同是实现高效数据分析的基础。然而&#xff0c;OLAP在运维方面面临着诸多挑战&#xff0c…

【驱动篇】龙芯LS2K0300之RTC设备驱动

实验介绍 本次实验是关于pcf8563 RTC模块的驱动移植&#xff0c;大致流程如下&#xff1a; 注册i2c设备驱动编写RTC设备驱动将device和driver驱动部署到开发板并装载&#xff0c;通过hwclock命令来测试 模块连接 VCC接Pin2&#xff0c;GND接Pin1&#xff0c;SCL接Pin16&…

一加Ace3 ColorOS14系统精简列表(免root)

#adb工具 https://www.123pan.com/s/Z3kujv-NHRPA.html 提取码:DZOD 使用&#xff1a; 1. 手机 设置 -- 关于本机 -- 版本信息 -- 版本号 &#xff0c;点5次 2. 设置 -- 其他设置 -- 开发者选项 -- USB调试 -- 无线调试 3.adb工具 -- adb connect 10.0.0.156:37909&#xff…

opencv-霍夫变换

霍夫变换就是一个可以让计算机学会自己找图形的算法。是图形处理领域内从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线&#xff0c;后来霍夫变换经过扩展可以进行任意型状物体的识别&#xff0c;例如圆和椭圆。 霍夫变换运用两个坐标空间之间的变换&a…

CSP-J复赛 模拟题3

1.匿名信&#xff1a; 题目描述 出于对社会现状的担忧&#xff0c;Alice 决定给市长写一封建议信&#xff0c;考虑到市长的暴脾气&#xff0c;Alice 最终还是决定匿名上书&#xff0c;为了保证自己的绝对神秘&#xff0c;她还会从当天的报纸上将一些单词(或字母)裁剪下来并重…

安装glibc+mysql的权限问题

安装glibc glibc mysql 俗称绿色mysql 安装之前删掉mariadb: 数据库初始化时候&#xff0c;会⾃动找my.cnf配置&#xff0c;但是原有的mariadb配 置⽂件&#xff0c;会失败 [rootmysql3 ~]# ls -l /etc/my.cnf -rw-r--r--. 1 root root 570 6月 8 2017 /etc/my.cnf [rootm…

Vue路由入门学习

文章目录 路由的基本使用1.目标2.作用3.说明4.官网5.VueRouter的使用&#xff08;52&#xff09;两个核心步骤 组件的存放目录问题1.组件分类存放目录 路由的封装抽离 Vue中的路由&#xff1a; 路径和组件的 映射关系 路由的基本使用 1.目标 认识插件 VueRouter&#xff0c…

Midjourney仅10分钟搞定⼀套漫画,含MJ提⽰词分享

Midjourney能帮我们画漫画了,你敢信?⼀起来和⽹易设计师学习如何只⽤10分钟,即使你是设计⿇⽠,也能轻轻松松完成⼀张属于你⾃⼰的短⽚⼩漫画!今天就⽤MJ来实战⼀套漫画,包含创作⽤的⼯ 具和提⽰词的应⽤,以前来学习吧! 漫画先看成品图: ▍ Part1你要画个啥? 画漫画当…

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题&#xff1a;为什么不能用#来闭合单引号呢&#xff1f; 在进行URL地址栏传参的时候&#xff0c;是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。&#xff08;先转ascii码&#xff0c;然后再转十六进制&#xff0c;之后加上%就是…

小白暴力学习001---Vue---第一个Vue

做本文主要是采用Vue3的教程&#xff0c;来源于菜鸟教程&#xff0c; https://www.runoob.com/vue3/vue3-tutorial.html 主要记录从小白开始如何使用Vue建立一个笔记本的网站&#xff0c;并用于记录 基础条件&#xff1a; 有明确的目标有兴趣能使用电脑&#xff0c;会百度 视…

前端的学习-CSS(二)-弹性盒子-flex

一&#xff1a;子元素的属性 order&#xff1a;项目的排列顺序&#xff0c;数值越小&#xff0c;排列越靠前&#xff0c;默认为0。 flex-grow&#xff1a;定义项目的放大比例&#xff0c;默认为 0 &#xff0c;即如果存在剩余空间&#xff0c;也不放大。 flex-shrink&#xff1…

【链表OJ】常见面试题 2

文章目录 1.[链表分割](https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId8&&tqId11004&rp2&ru/activity/oj&qru/ta/cracking-the-coding-interview/question-ranking)1.1 题目要求1.2 哨兵位法 2.[链表的回文结构](https://www.…