linux之perf(2)list事件

这篇具有很好参考价值的文章主要介绍了linux之perf(2)list事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux之perf(2)list事件

Author:Onceday Date:2023年9月3日

漫漫长路,才刚刚开始…

全系列文章请查看专栏: Perf性能分析_Once_day的博客-CSDN博客。

参考文档:

  • 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

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

名称标识 描述
u user-space counting,用户空间
k kernel counting,内核空间
h hypervisor counting,虚拟机
I non idle counting,非空闲时
G guest counting (in KVM guests),KVM虚拟机
H host counting (not in KVM guests),KVM主机
p precise level,硬件事件精度级别
P use maximum detected precise level,使用最大检测精度水平
S read sample value (PERF_SAMPLE_READ)读取样本值
D pin 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区域事件必须是先导事件,因此第二个事件采样,而不是第一个事件。文章来源地址https://www.toymoban.com/news/detail-698086.html

到了这里,关于linux之perf(2)list事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从小白到大神之路之学习运维第64天--------Zabbix监控mysql、ftp服务以及自定义配置

    第三阶段基础 时  间:2023年7月19日 参加人:全班人员 内  容: Zabbix监控mysql、ftp服务以及自定义   目录 一、Zabbix监控mysql数据库 二、Zabbix监控ftp服务 三、Zabbix自定义监控项       整体zabbix搭建完成,server端huyang1监控自己以及监控huyang3,切基于lamp平台,服务均开启 服

    2024年02月16日
    浏览(62)
  • 服务器内存满了解决之路

    背景:大清早,突然一通电话吵醒,说项目跑不了,还没洗漱赶紧跑过来,毕竟属于实时在用的系统。排查发现系统盘满了,数据写不进去了,导致报错。接手的项目,从来没考虑服务器问题,那么就解决吧,一通百度。 df -h   查看内存满了  那就 du --max-depth=1 -h 查看哪个地

    2024年02月16日
    浏览(41)
  • 新手小白如何搭建帕鲁/Palworld服务器?

    在深入讨论如何为幻兽帕鲁搭建服务器之前,我们需要了解这款游戏的基本特性。幻兽帕鲁是一款以丰富游戏元素著称的游戏,这些元素包括多样的角色、独特的技能系统、引人入胜的剧情线以及玩家间的交互等。这些丰富的游戏元素不仅为玩家提供了深度的游戏体验,同时

    2024年02月21日
    浏览(39)
  • 自己搭建远程桌面服务器-RustDesk(小白版)

    此软件主要功能为远程各种设备(其中包括Windows、macOS、Linux、iOS、Android、Web等) 支持文件传输(可直接拷贝远程电脑的文件,类似向日葵的远程文件) 支持内网穿透(支持端口映射,TCP/UDP,支持Windows默认远程桌面应用) 最主要优点为可远程Android,本人最爱,简单配置,

    2024年02月01日
    浏览(65)
  • 爬虫小白入门在服务器上-部署爬虫或者开服务接口并供给他人访问

    一、准备工作-服务器 1、先准备一个服务器(以阿里云为例子) 1、先准备一个云服务器,比如阿里云服务器新人免费使用3个月 , 或者腾讯云服务器,又或者华为云服务器都可以, 但是提醒注意下,新用户的首单资格优惠力度最大,所以最好在一年有活动的时候买,比如61

    2024年02月17日
    浏览(53)
  • mac本地终端如何连接腾讯云服务器(小白专用)

    在这里替大家踩坑了,希望对大家有帮助,虽然简单,但新人一开始都是这样子的,都会无从下手。我从新手的角度,说一下我在配置过程中遇到的一些需要注意的点 确保你的服务器是运行的,不然怎么样都会连不上的 以下是详细步骤: 如果你刚买这台服务器,最好就是重

    2024年02月04日
    浏览(86)
  • RustDesk自建远程服务器(全网最详细小白教学)

    分别在windows和unbuntu安装RustDesk客户端,下面是官网地址。 RustDesk | 开源远程桌面软件 https://rustdesk.com/zh/ Rusk Desk的路径查看方式,在终端使用type rustdesk命令查看  输入命令: gnome-session-properties  打开启动应用程序首选项窗口,点击添加按钮,在命令中输入RuskDesk的路径(/usr

    2024年02月03日
    浏览(43)
  • 新手小白如何租用GPU云服务器跑深度学习

    最近刚学深度学习,自己电脑的cpu版本的pytorch最多跑个LexNet,AlexNet直接就跑不动了,但是作业不能不写,实验不能不做。无奈之下,上网发现还可以租服务器这种操作,我租的服务器每小时0.78人民币,简直是发现新大陆,又省下一大笔钱,太开心了吧(啪,什么乱七八糟的

    2023年04月15日
    浏览(50)
  • 小白的实验室服务器深度学习环境配置指南

    本文在ubuntu server 22.04上实验成功,其他版本仅供参考 注意,本文仅适用于ubuntu server,不需要图形界面,没有对图形界面进行特殊考虑和验证!依赖图形操作界面的读者慎用 若没有安装,则输入下面的命令,直接把包括gcc在内很多开发工具包一同安装 编辑 /etc/modprobe.d/black

    2024年02月03日
    浏览(46)
  • 大数据菜鸟之路(5台服务器免密配置)

    将前面准备好的linux7.5 的服务器复制4台 五台服务器,准备hadoop的HA 集群,因此101 ,103 作namenode vim /etc/hosts 1)将原来清空,将自己映射放进来: demo : 192.168.10.101 hadoop101 192.168.10.102 hadoop102 192.168.10.103 hadoop103 192.168.10.104 hadoop104 192.168.10.105 hadoop105 改完source 文件 或者 reboot 重启

    2024年01月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包