当前位置: 首页 > news >正文

Linux Perf 介绍

文章目录

    • 前言
  • 二、安装Perf
  • 三、二级命令
    • 3.1 perf list
    • 3.2 perf record/report
    • 3.3 perf stat
    • 3.4 perf top
  • 四、使用火焰图进行性能分析
    • 4.1 下载火焰图可视化生成器
    • 4.2 使用perf采集数据
    • 4.3 生成火焰图
    • 参考资料

前言

perf是一款Linux性能分析工具,内置在Linux内核的一个Linux性能分析框架中,利用CPU、性能检测单元(Performance Monitoring Unit,PMU)和软件计数(如软件计数器和跟踪点)等进行性能分析。

主要用途:

  1. 快速定位和解决系统性能问题。它可以收集程序运行时的性能数据,包括CPU、内存、IO等方面的信息,并提供详细的性能分析和报告。
  2. 生成程序的调用图,记录程序中函数之间的调用关系,并提供详细的调用图分析和报告。
  3. 检测程序的内存泄漏问题,收集程序运行时的内存数据,并提供详细的内存泄漏分析和报告。
  4. 提供程序性能优化的建议,分析程序运行时的性能数据,并提供优化的建议和方案。

工作原理:

  1. 首先,perf会使用特殊的指令将硬件性能计数器设置为所需的事件类型。这可以包括CPU周期、指令执行数、缓存命中数等。
  2. perf会定期读取计数器的值,以获得一组采样数据。采样的频率可以由用户配置。
  3. perf将采样数据与相应的事件关联起来,并进行分析。这可以包括计算平均值、最大值、最小值,以及计算事件之间的关联性等。
  4. perf可以将分析结果以各种不同的格式进行输出,如报告、图形化界面等。用户可以根据需要选择适合自己的输出格式。

perf调用原理图如下:
img

二、安装Perf

大多数Linux发行版都包含perf工具。可以使用包管理器来安装perf,例如在Ubuntu上可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)

perf工具需要操作系统内核支持。确保Linux内核启用了性能事件计数器(PerformanceCounter)子系统。可以通过检查内核配置选项来确认,通常是在内核配置文件(例如/usr/src/linux/.config)中搜索以下选项: CONFIG_PERF_EVENTS=y
如果该选项没有被启用,需要重新编译内核并启用该选项。

三、二级命令

在终端中输入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	用于定义动态检查点。

3.1 perf list

列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。

  1. Hardware event:由PMU产生的事件,如L1缓存命中。
  2. Software event:由内核产生的事件,如进程切换,发生缺页中断等。
  3. Tracepoints event:由内核静态跟踪点所触发的事件。

tracepoints 不仅是用在 perf 中,它已经是 Linux 内核 tracing 的标准接口了,ftrace,ebpf 等工具都会用到它。这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。

总结:event 是 perf 工作的基础,主要有两种:有使用硬件的 PMU 里的 event,也有在内核代码中注册的 event

3.2 perf record/report

perf record采集数据,并且把数据写入数据文件中,随后可通过perf report命令对数据进行分析

perf record常用选项列表:

选项描述
-e选择一个事件,可以是硬件事件也可以是软件事件
-a全系统范围的数据采集
-p指定一个进程的ID来采集特定进程的数据
-o指定要写入数据的数据文件
-g使能函数调用图功能
-C只采集某个CPU的数据

perf reprot常用选项列表:

选项描述
-i导入数据文件名称,默认为perf.data
-g生成函数调用关系图
–sort分类统计信息,如PID、COMM、CPU等

3.3 perf stat

perf stat 命令一个通过概括、精简的方式提供被调试程序运行的整体情况和汇总数据的工具。如处理器占用时常,上下文切换次数,缺页异常次数等。选项如下:

选项描述
-a显示所有CPU上的统计信息
-c显示指定CPU上的统计信息
-e指定要显示的事件
-p指定要显示的进程ID
# perf stat lsDesktop  Documents  Downloads  Music  Pictures  Public  Templates  VideosPerformance counter stats for 'ls':1.28 msec task-clock:u               #    0.165 CPUs utilized0      context-switches:u         #    0.000 M/sec0      cpu-migrations:u           #    0.000 K/sec104      page-faults:u              #    0.081 M/sec1,054,302      cycles:u                   #    0.823 GHz1,136,989      instructions:u             #    1.08  insn per cycle228,531      branches:u                 #  178.447 M/sec11,331      branch-misses:u            #    4.96% of all branches0.007754312 seconds time elapsed0.000000000 seconds user0.007717000 seconds sys

3.4 perf top

当你有一个明确的优化目标或对象时,可以使用perf stat命令。但有时候系统性能会无端下降,此时需要一个类似于top的命令,以列出所有值得怀疑的进程,从中快速定位问题和缩小范围。

Samples: 1K of event 'cpu-clock', Event count (approx.): 294500000
Overhead  Shared Object        Symbol32.77%  [kernel]             [k] clear_page_orig11.38%  [kernel]             [k] __softirqentry_text_start3.82%  libelf-0.170.so      [.] gelf_getsym3.48%  [kernel]             [k] kallsyms_expand_symbol.constprop.12.80%  [kernel]             [k] filemap_map_pages2.46%  [kernel]             [k] module_get_kallsym2.38%  perf                 [.] d_demangle_callback
  • Samples: 采样数,perf总共采集了1k个CPU时钟事件;
  • event : 事件类型;
  • Event count (approx.):事件总数量;

行列:

  • Overhead :标识该符号的性能事件在所有采样中的比例,用百分比表示;
  • Shared:Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等;
  • Object : Object,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
  • Symbol: Symbol是符号名,也是函数名。当函数名未知时,用十六进制的地址来表示。

四、使用火焰图进行性能分析

火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来。表现形式如下所示:
在这里插入图片描述

4.1 下载火焰图可视化生成器

git clone https://github.com/brendangregg/FlameGraph.git

4.2 使用perf采集数据

sudo perf record -F 99 -p 2512 -g -- sleep 30
  • record:表示采集系统事件,没有采用 -e 执行采集事件,则默认采集 cycles(即 CPU clock 周期)。
  • -F 99:指定采样频率为 99Hz(每秒99次),如果 99次都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
  • -p 2512:指定进程号,对某一个进程分析。
  • -g:表示记录调用栈。
  • -- sleep 30:表示持续 30 秒
    除了附加到正在执行的进程之外,还可以启动一个进程
sudo perf record -g -F 99  ls
  • ls:为需要执行的程序

4.3 生成火焰图

# 统计每个调用栈出现的百分比,然后从高到低排列。
sudo perf report -n --stdio
# 生成折叠后的调用栈
sudo perf script -i perf.data > perf.unfold
# 生成火焰图
./stackcollapse-perf.pl perf.unfold > perf.folded
# 最后生成 svg 图
./flamegraph.pl perf.folded > perf.svg

生成的perf.svg 文件可以直接使用浏览器打开。

此外还有红蓝分叉火焰图,可以分析性能回退问题,感兴趣的读者可以进一步了解。

参考资料

  1. 系统级性能分析工具perf的介绍与使用
  2. 从小白到精通:揭秘perf工具的全部功能与操作技巧
  3. perf性能分析–stat命令
  4. 使用火焰图(FlameGraph)分析程序性能
  5. 如何使用perf top探究性能

相关文章:

Linux Perf 介绍

文章目录 前言 二、安装Perf三、二级命令3.1 perf list3.2 perf record/report3.3 perf stat3.4 perf top 四、使用火焰图进行性能分析4.1 下载火焰图可视化生成器4.2 使用perf采集数据4.3 生成火焰图参考资料 前言 perf是一款Linux性能分析工具,内置在Linux内核的…...

【论文阅读】Variational Graph Auto-Encoder

0、基本信息 会议:2016-NIPS作者:Thomas N. Kipf,Max Welling文章链接:Variational Graph Auto-Encoder代码链接:Variational Graph Auto-Encoder 1、介绍 本文提出一个变分图自编码器,一个基于变分自编…...

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。...

Plantuml之nwdiag网络图语法介绍(二十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

MyBatis接口的方法上使用,定义对应的 SQL 操作

目录标题 一、Mapper:二、Select、Insert、Update、Delete:三、Results、Result:四、Param:五、# 和 $: MyBatis 是一款基于 Java 的持久层框架,它通过简化数据库操作来帮助开发者构建更好的数据库访问应用…...

(20)Linux初始文件描述符

前言:本章我们介绍 O_WRONLY, O_TRUNC, O_APPEND 和 O_RDONLY。之后我们开始讲解文件描述符。 一、系统传递标记位 1、O_WRONLY C 语言在 w 模式打开文件时,文件内容是会被清空的,但是 O_WRONLY 好像并非如此? 代码演示&…...

draw.io基础操作和代码高效画图进阶

文章目录 一、基础操作1、链接2、等比例变形3、复制4、插入表格 二、在线打开三、插入—功能聚集地1、插入图片2、插入画笔3、插入布局4、导出 四、图码转换——高效画图1、通用图码转换2、流程图生成:使用mermaid语言生成图: 五、图码转换高效画图的典型…...

2024-01-04 用llama.cpp部署本地llama2-7b大模型

点击 <C 语言编程核心突破> 快速C语言入门 用llama.cpp部署本地llama2-7b大模型 前言一、下载llama.cpp以及llama2-7B模型文件二、具体调用总结 前言 要解决问题: 使用一个准工业级大模型, 进行部署, 测试, 了解基本使用方法. 想到的思路: llama.cpp, 不必依赖显卡硬件…...

HTTP打怪升级之路

新手村 上个世纪80年代末&#xff0c;有一天&#xff0c;Tim Berners-Lee正在工作&#xff0c;他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件&#xff0c;但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到&#xff0c;他需要一种新的协议来共享二进制…...

axure RP9.0安装字体图标库fontawesome

字体图库地址: Font AwesomeThe internets icon library toolkit. Used by millions of designers, devs, & content creators. Open-source. Always free. Always awesome.https://fontawesome.com/v6/download进入后下载想要的版本如我是6.3 下载后得到压缩包,解压之后…...

PiflowX组件-ReadFromUpsertKafka

ReadFromUpsertKafka组件 组件说明 upsert方式从Kafka topic中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HO…...

keil 5 ARM CC编译错误和警告解释大全(3)序列号2000-3000

2001年&#xff1a;已声明虚拟参数&#xff0c;但从未使用过 2002年&#xff1a;虚拟参数重新定义为do变量 2003&#xff1a;无法优化&#xff1a;常量/表达式传递给可能修改的变量 2004&#xff1a;重新维度的数组作为参数传递 2005&#xff1a;重维度数组等价 2006&…...

CentOS 7 实战指南:文件或目录的权限操作命令详解

前言 这篇文章详细介绍了文件和目录的常用权限操作命令&#xff0c;并提供了全面的技术解析。通过本文&#xff0c;你将学习如何使用 chmod 和 chown 命令来管理文件和目录的权限&#xff0c;控制用户和用户组的访问权限。无论你是初学者还是有经验的系统管理员&#xff0c;这…...

我的第一个前端项目,vue项目从零开始创建和运行

​入门前端&#xff0c;从基础做起&#xff0c;从零开始新建项目 背景&#xff1a;VUE脚手架项目是一个“单页面”应用&#xff0c;即整个项目中只有1个网页&#xff01; 在VUE脚手架项目中&#xff0c;主要是设计各个“视图组件”&#xff0c;它们都是整个网页中某个部分&…...

【OJ】C++,Java,Python,Go,Rust

for循环语法 // cpp// java// python for i in range(集合): for i, val in enumerate(集合): for v1,v2,v3,... in zip(集合1,集合2,集合3,...):Pair // cpp pair<int, string> first second // java Pair<Integer, String> first() new Pair<>(firstVal…...

Flink 任务指标监控

目录 状态监控指标 JobManager 指标 TaskManager 指标 Job 指标 资源监控指标 数据流监控指标 任务监控指标 网络监控指标 容错监控指标 数据源监控指标 数据存储监控指标 当使用 Apache Flink 进行流处理任务时&#xff0c;可以根据不同的监控需求&#xff0c;监控…...

Go语言程序设计-第7章--接口

Go语言程序设计-第7章–接口 接口类型是对其他类型行为的概括与抽象。 Go 语言的接口的独特之处在于它是隐式实现。对于一个具体的类型&#xff0c;无须声明它实现了哪些接口&#xff0c;只要提供接口所必须实现的方法即可。 7.1 接口即约定 7.2 接口类型 package iotype …...

性能优化-OpenMP基础教程(二)

本文主要介绍OpenMP并行编程技术&#xff0c;编程模型、指令和函数的介绍、以及OpenMP实战的几个例子。希望给OpenMP并行编程者提供指导。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&am…...

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…...

C#-接口

接口 (interface) 定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。接口不提供它所定义的成员的实现 — 它仅指定实现该接口的类或结构必须提供的成员。 接口可支持多重继承。在下面的示例中,接口 IComboBox 同时从 ITextBox 和 IListBox 继承。 i…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...