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

linux之perf(2)list事件

Linux之perf(2)list事件

Author:Onceday Date:2023年9月3日

漫漫长路,才刚刚开始…

参考文档:

  • Tutorial - Perf Wiki (kernel.org)
  • perf-list(1) - Linux manual page (man7.org)

1. 概述

perf list用于列出可用的性能事件,这些事件可以用于 perf record 和其他 perf 子命令的性能分析。性能事件包括硬件事件(如 CPU 周期、缓存未命中等)、软件事件(如上下文切换、页面错误等)和跟踪点事件(如内核函数调用、用户空间应用程序的跟踪等)。

 Usage: perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|metric|metricgroup|event_glob]-d, --desc            Print extra event descriptions. --no-desc to not print.-j, --json            JSON encode events and metrics-v, --long-desc       Print longer event descriptions.--debug           Enable debugging output--deprecated      Print deprecated events.--details         Print information on the perf event names and expressions used internally by events.--unit <PMU name>Limit PMU or metric printing to the specified PMU.

上面是在linux kernel6.2版本的perf list帮助输出,perf工具和linux内核以及硬件高度绑定,因此不同的内核版本,虚拟机,硬件环境下,perf list的输出会有较大差别。许多性能事件是否可用,需要取决于当前硬件和软件环境。

perf工具支持一系列可测量的事件。该工具和底层内核接口可以测量来自不同来源的事件。例如,有些事件是纯内核计数器,在这种情况下称为软件事件。例如:上下文切换、小故障。

事件的另一个来源是处理器本身及其性能监控单元(PMU)。它提供了一个事件列表来测量微体系结构事件,如周期数、指令退役、L1缓存缺失等。这些事件被称为PMU硬件事件或简称硬件事件。它们因处理器类型和型号而异。

perf_events接口还提供了一组常用的硬件事件名称。在每个处理器上,如果这些事件存在,则将它们映射到CPU提供的实际事件上,否则无法使用事件。有些令人困惑的是,这些事件也称为硬件事件(hardware event)和硬件缓存事件(hardware cache event)。

最后,还有由内核ftrace基础设施实现的tracepoint事件。这些仅在2.6.3 3x和更新的内核中可用。

PMU硬件事件是特定于CPU的,并由CPU供应商记录。如果链接到libpfm4, perf工具库会提供一些事件的简短描述。有关Intel和AMD处理器的PMU硬件事件列表,请参见:

  • Intel® 64 and IA-32 Architectures Developer’s Manual: Vol. 3B
  • BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors

perf list列出来的这些事件就是本机设备上受支持性能事件,后面中括号里面就是具体的事件类型,这些事件可能会非常多,不同的账户权限执行的结果也会有些不同

对于非root用户,通常只有上下文切换的PMU事件可用。这通常只是cpu PMU中的事件、预定义的事件(如周期和指令)以及一些软件事件。其他pmu和全局测量通常仅为root可用。一些事件限定符,如“any”,也是root限定符。这可以通过设置kernel.perf_event_paranoid-1来修改(使用sysctl),允许非root用户使用这些事件。为了访问跟踪点事件,perf需要对/sys/kernel/debug/tracing具有读访问权限,即使perf_event_paranoid处于宽松设置中也是如此。

1.1 打印指定PMU单元的事件

--unit <PMU name> 选项在使用 perf list 时用于将事件或指标的输出限制为特定的性能监视单元(Performance Monitoring Unit,PMU)。PMU 是处理器的一个组件,它可以计数硬件事件,如执行的指令、遭受的缓存未命中或错误预测的分支。它们为应用程序分析提供了基础,可以追踪动态控制流并识别热点。

以下是如何使用它的示例:

perf list --unit cpu

此命令将列出 CPU PMU 可用的所有事件或指标。PMU 名称需要事先知道,具体取决于硬件和内核的支持。一些常见的 PMU 名称包括 cpucachebussoftware

请记住,根据您的硬件和内核配置,可能并非所有 PMU 都可用。

1.2 事件描述格式

--details会额外打印符号事件(cycles, cache-misses等)的内部表达形式,如下:

  cache-misses OR cpu/cache-misses/                  [Kernel PMU event]cpu/event=0x64,umask=0x9/cpu-cycles OR cpu/cpu-cycles/                      [Kernel PMU event]cpu/event=0x76/

事件是用它们的符号名和可选的单位掩码和修饰符来指定的。事件名称(Event names)、单元掩码(unit masks)和修饰符(modifiers)不区分大小写。一般的情况下,可以使用cache-misses这种符号形式来代替cpu/event=0x64,umask=0x9/这种格式

默认情况下,事件是在用户和内核级别度量的:

perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000

若要仅在用户级别进行度量,则需要传递一个修饰符(u):

perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000

要测量用户和内核(显式地):

perf stat -e cycles:uk dd if=/dev/zero of=/dev/null count=100000

事件可以通过附加冒号和一个或多个修饰符来选择具有修饰符。修饰符允许用户限制何时对事件进行计数。修饰符如下:

名称标识描述
uuser-space counting,用户空间
kkernel counting,内核空间
hhypervisor counting,虚拟机
Inon idle counting,非空闲时
Gguest counting (in KVM guests),KVM虚拟机
Hhost counting (not in KVM guests),KVM主机
pprecise level,硬件事件精度级别
Puse maximum detected precise level,使用最大检测精度水平
Sread sample value (PERF_SAMPLE_READ)读取样本值
Dpin the event to the PMU,将事件绑定到PMU上
W组是弱的,如果不可调度,将退回到非组
e群组或事件是排他性的,不共享PMU

p修饰符可用于指定指令地址的精确程度。p修饰符可以被指定多次:

  • 0 - SAMPLE_IP可以任意滑动
  • 1 - SAMPLE_IP必须有恒定的滑动
  • 2 - SAMPLE_IP要求有O滑块
  • 3 - SAMPLE_IP必须有0滑块,或者使用随机化来避免样本副作用效果。

对于英特尔系统,精确事件采样是用PEBS实现的,它支持精确级别2,在某些特殊情况下支持精确级别3。

在AMD系统上,它是使用IBS实现的(最高精确级别到2)。精确修饰符与事件类型0x76 (cpu-cycles,CPU时钟未停止)和0xC1(micro-ops retired)一起工作。

2. 详细信息

2.1 perf list性能事件分类

默认情况下,perf list列出所有的已知事件。也可以通过下面的类别来列出其中某一类事件:

事件类名称描述
hw or hardware列出硬件事件,如cache-misses
sw or software列出软件事件,例如上下文切换(context switches)
cache or hwcache列出硬件缓存事件,如L1-dcache-loads
tracepoint列出所有的tracepoint事件,也可使用subsys_glob:event_glob去过滤子系统追踪点事件,如sched、block等。
pmu打印内核提供的PMU事件
sdt列出所有静态定义的跟踪点事件(Statically Defined Tracepoint)
metric指标列表(度量事件)
metricgroup列出带有指标的指标组
–raw-dump显示所有事件的原始格式信息,该选项后面可以接[hw|sw|cache|tracepoint|pmu|event_glob]
2.2 测量特定硬件上的PMU事件

本章详细内容可以参考文档: perf-list(1) - Linux manual page (man7.org)

即使现在在perf中没有符号形式的事件,也可以用特定于每个处理器的方式对其进行编码。

比如对于X86CPUs,要测量CPU硬件供应商文档中提供的实际PMU,可以传递十六进制参数代码:

perf stat -e r1a8 -a sleep 1
perf record -e r1a8 ...

有些处理器,比如AMD的处理器,支持大于一个字节的事件代码和单元掩码。在这种情况下,与事件配置参数对应的位可以参考下面命令的结果:

 cat /sys/bus/event_source/devices/cpu/format/event

比如可能的命令如下:

perf record -e r20000038f -a sleep 1
perf record -e cpu/r20000038f/ ...
perf record -e cpu/r0x20000038f/ ...

有关于特定硬件上的PMU事件,需要参考处理器的说明文档来确定使用方法

在下面的路径可以查看可用的PMUs和它们的原始参数:

ls /sys/devices/*/format

一些pmu不与核心相关联,而是与整个CPU socket相关联。这些pmu上的事件通常不能采样,只能使用perf stat -a进行全局计数。它们可以绑定到一个逻辑CPU,但是会测量同一个插槽中的所有CPU

本例在Intel Xeon系统的socket 0上的第一个内存控制器上每秒测量内存带宽:

perf stat -C 0 -a uncore_imc_0/cas_count_read/,uncore_imc_0/cas_count_write/ -I 1000 ...

每个内存控制器都有自己的PMU。测量整个系统带宽需要指定所有imc pmu(请参阅perf list output),并将这些值相加。为了简化多个事件的创建,在PMU名称中支持前缀和全局匹配,并且在执行匹配时也忽略前缀uncore_。因此,上面的命令可以通过使用以下语法扩展到所有内存控制器:

perf stat -C 0 -a imc/cas_count_read/,imc/cas_count_write/ -I 1000 ...
perf stat -C 0 -a *imc*/cas_count_read/,*imc*/cas_count_write/ -I 1000 ...
2.3 参数化的性能事件

有一些pmu事件列出来的时候,其显示字符中带有?号。如下:

hv_gpci/dtbp_ptitc,phys_processor_idx=?/

这意味着当作为事件提供时,?所指示的内容必须也可提供。

 perf stat -C 0 -e 'hv_gpci/dtbp_ptitc,phys_processor_idx=0x2/' ...

此外还有可能指定额外的事件修饰符(percore):

perf stat -e cpu/event=0,umask=0x3,percore=1/

上面命令即汇总一个核心中所有硬件线程的事件计数

2.4 事件组测量

当活动事件的数量超过硬件性能计数器的数量时,Perf支持基于时间的事件复用。当工作负载更改其执行配置文件时,多路复用可能导致测量错误。

当使用来自事件计数的公式计算度量时,确保始终将一些事件作为一个组一起测量以最小化多路错误是很有用的。事件组可以使用{}指定。

perf stat -e '{instructions,cycles}' ...

可用性能计数器的数量取决于CPU。一个组不能包含比可用计数器更多的事件。例如,Intel Core cpu通常有四个通用的核心性能计数器,加上三个固定的instructionscyclesref-cycles计数器。一些特殊事件对它们可以调度的计数器有限制,并且可能不支持单个组中的多个实例。当组中指定的事件太多时,其中一些事件将无法测量。

全局固定事件可以限制其他组可用的计数器数量。在x86系统上,NMI看门狗默认固定一个计数器。NMI看门狗可以在root用户下禁用:

echo 0 > /proc/sys/kernel/nmi_watchdog

来自多个不同pmu的事件不能混合在一个组中,软件事件除外。

perf还支持使用:S说明符进行组领导抽样(group leader sampling)。

perf record -e '{cycles,instructions}:S' ...
perf report --group

通常情况下,所有事件都在一个事件组样本中,但是使用:S时,只有第一个事件(leader)进行采样,它只读取组中其他事件的值。然而,在AUX区域事件(例如Intel PT或CoreSight)的情况下,AUX区域事件必须是先导事件,因此第二个事件采样,而不是第一个事件。

相关文章:

linux之perf(2)list事件

Linux之perf(2)list事件 Author&#xff1a;Onceday Date&#xff1a;2023年9月3日 漫漫长路&#xff0c;才刚刚开始… 参考文档: Tutorial - Perf Wiki (kernel.org)perf-list(1) - Linux manual page (man7.org) 1. 概述 perf list用于列出可用的性能事件&#xff0c;这…...

将多个EXCEL 合并一个EXCEL多个sheet

合并老版本xls using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using NPOI.HSSF.UserModel; …...

【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

微信小程序——数据绑定

在微信小程序中&#xff0c;可以通过以下代码实现数据绑定&#xff1a; 在WXML中&#xff0c;使用双大括号{{}}绑定数据&#xff0c;将数据渲染到对应的视图中。 <view>{{message}}</view>在JS中&#xff0c;定义一个数据对象&#xff0c;并将其绑定到页面的data…...

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为&#xff0c;像libbpf-bootstrap这样在ebpf程序开发中很常用的框架&#xff0c;理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码&#xff0c;各个内核上的ebpf虚拟机大同小异&#xf…...

【剑指Offer】24.反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a; 0 < 节点个数 < 5000 解答 源代码 /*** Defin…...

04-docker compose容器编排

Docker Compose简介 Docker Compose是什么 ​ Compose 是Docker公司推出的一个工具软件&#xff0c;可以管理多个Dokcer容器组成一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml&#xff0c;写好多个容器之间的调用关系。然后&#xff0c;只要一个命令&#…...

通过位运算打多个标记

通过位运算打多个标记 如何在一个字段上&#xff0c;记录多个标记&#xff1f; 如何在一个字段上&#xff0c;记录不同类型的多个标记&#xff1f; 如何用较少的字段&#xff0c;记录多个标记&#xff1f; 如何在不增加字段的要求下&#xff0c;记录新增的标记&#xff1f; 在实…...

[学习笔记]Node2Vec图神经网络论文精读

参考资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走&#xff0c;训练节点嵌入向量&#xff0c;仅能反应相邻节点的社群相似信息&#xff0c;无法反映节点的功能角色相似信息。 …...

C# Linq源码分析之Take(五)

概要 本文在C# Linq源码分析之Take&#xff08;四&#xff09;的基础上继续从源码角度分析Take的优化方法&#xff0c;主要分析Where.Select.Take的使用案例。 Where.Select.Take的案例分析 该场景模拟我们显示中将EF中与数据库关联的对象进行过滤&#xff0c;然后转换成Web…...

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…...

(STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

一、应用 工业&#xff08;PLC、工业电机控制、泵和压缩机&#xff09; 智能家居&#xff08;空调、冰箱、冰柜、中央警报系统、洗衣机&#xff09; 个人电子产品&#xff08;键盘、智能手机、物联网标签、跟踪设备&#xff09; 智能城市&#xff08;工业通信、照明控制、数字…...

mysql配置bind-address不生效

1、前言 因为要ip直接访问mysql&#xff0c;故去修改bind-address参数&#xff0c;按照mysql配置文件查找顺序是&#xff1a;/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf&#xff0c;服务器上没有 /etc/my.cnf文件&#xff0c;故去修改 /etc/mysql/my.cnf文件&#xff0c;但是一…...

Linux相关指令(下)

cat指令 查看目标文件的内容 常用选项&#xff1a; -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 一个重要思想&#xff1a;linux下一切皆文件&#xff0c;如显示器文件&#xff0c;键盘文件 cat默认从键盘中读取数据再打印 退出可以ctrlc 输入重定向<…...

Codeforces Round 855 (Div 3)(A - F)

Codeforces Round 855 (Div. 3)&#xff08;A - F&#xff09; Codeforces Round 855 (Div. 3) A. Is It a Cat?(思维) 思路&#xff1a;先把所有字母变成小写方便判断 &#xff0c; 然后把每一部分取一个字母出来 &#xff0c; 判断和‘meow’是否相同即可。 复杂度 O ( n…...

Friend.tech(FT):社交媒体金融的未来,真的如此美好吗?

Friend.tech&#xff08;FT&#xff09;是一个在2023年8月10日正式推出的社交金融平台&#xff0c;它的特点在于允许用户购买和出售创作者的股票&#xff08;shares&#xff09;&#xff0c;这些股票赋予用户访问创作者内容的权利。FT的推出引发了广泛的关注&#xff0c;吸引了…...

yolov7中Concat之后加注意力模块(最复杂的情况)

1、common.py中找到Concat模块&#xff0c;复制一份 2、要传参进来&#xff0c;dim通道数 3、然后找yolo.py模块&#xff0c;添加 4、yaml里替换 5、和加的位置也有关系...

解除百度安全验证

使用chrome浏览器用百度浏览时&#xff0c;一直弹百度安全验证&#xff1a; 在设置里进行重置&#xff1a; 然后重启浏览器就可以了。...

Codeforces Round 731 (Div 3)(A - F)

Codeforces Round 731 (Div. 3)(A - F) Dashboard - Codeforces Round 731 (Div. 3) - Codeforces A. Shortest Path with Obstacle&#xff08;思维&#xff09; 思路&#xff1a;显然要计算 A → B 之间的曼哈顿距离 &#xff0c; 要绕开 F 当且仅当 AB形成的直线平行于坐…...

Python的sort()与sorted()函数详解

目录 sort&#xff08;&#xff09;函数 sorted&#xff08;&#xff09;函数 key参数 区别 sort&#xff08;&#xff09;函数 sort()方法&#xff1a;该方法用于原地对列表进行排序&#xff0c;即直接在原始列表上进行排序操作&#xff0c;并不返回一个新的列表。 my_l…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...