深入理解Perf编程范式

Linux阅码场 2023-02-07 12:07

0. 目录

1. 综述
2. perf 前端
    2.1 是什么
    2.2 为什么
3. 事件(event)
    3.1 是什么
    3.2 事件类型
        3.2.1 hardware
        3.2.2 software
        3.2.3 hw_cache
        3.2.4 raw
        3.2.5 事件类型与 PMU 的关系
    3.3 事件监控模式
4. 前端编程基本范式
    4.1 基本 counting 模式编程
    4.2 事件组读取
    4.3 模型总结
5. 总结

1. 综述

本系列文章旨在解构内核 perf 框架的实现。perf 是一个庞大的系统,所涉及的逻辑板块非常多,因此想要把 perf 框架讲清楚是不容易的。为了让读者能建立起清晰的脉络,本系列文章会根据一定的内在逻辑,逐步展开对各板块的解构。
perf 框架其本身因为考虑了很多 general 的需求,比如子任务继承父任务的 event、perf 框架后端可对接多种 PMU、既支持 per-cpu 亦支持 per-task 的 event 监控、既支持 counting(计数)模式亦支持 sampling(采样)模式,等等,这些会给解构 perf 框架带来不必要的麻烦。为强干弱枝我们的解构逻辑脉络,本系列文章以无继承、per-task、后端只对接硬件 PMU、counting 模式的 perf 工作流程作为分析切入点。
本文乃系列文章的第一篇。简要铺垫 perf 的前端,并对前端所确立的 perf 体系基本模型做阐述。
本文语义下,“perf 框架”指的是实现在内核中的 perf 框架系统,“perf 前端”指的是用户态的系统调用接口。
本文所涉及 PMU 相关的知识,请自行参阅本号《Intel SDM 之 Performance Monitoring》,或 Intel SDM。

2. perf 前端

2.1 是什么

本文所谓的“perf 前端”,并非指“perf”这个用户态程序,而是 perf_event_open 这个系统调用的用户侧接口。实际上 perf 程序其底层就是基于 perf_event_open。
libc 并未对此系统调用做用户态封装,需要用户自行封装。有关 perf_event_open 的细节请读者自行 "man perf_event_open",本文默认读者熟悉 perf_event_open 的使用(如果该条件不成立,那么您可能并非本系列文章的潜在受众),不会对该接口的众多细节做展示,而只挑选与内核 perf 框架模型有对应关系的点进行展开。

2.2 为什么

perf 框架,前端承接用户态的各种事件(event)的属性配置,后端将 event 嫁接到内核的调度、文件系统等框架中,底层对接各种 PMU 硬件,所以其必然要建立一个复杂、严谨的模型(抽象)系统。而 perf 前端是整个模型系统对接用户的最外层,所以搞清楚 perf 前端,是理解 perf 框架其模型系统的一个必要过程。

3. 事件(event)

3.1 是什么

所谓事件,就是用户所关心的,在 OS 运行过程中所发生的一个 ... ... 好吧,事件。
比方说,你可能关心某个任务在运行中的 ipc(instruction per cycle)指标,那么你需要监控(采样、计数)任务运行中的两个事件:instructions、cycles。
比如你可以以固定间隔,定期获取该周期内此任务的 instruction 及 cycle  数,然后计算二者的比值即可。
如何获取这些事件数呢?其后端需要借助 PMU。

3.2 事件类型

事件有很多类型:
  • PERF_TYPE_HARDWARE
  • PERF_TYPE_SOFTWARE
  • PERF_TYPE_TRACEPOINT
  • PERF_TYPE_HW_CACHE
  • PERF_TYPE_RAW
  • PERF_TYPE_BREAKPOINT
我们关注 PERF_TYPE_HARDWARE、PERF_TYPE_SOFTWARE、PERF_TYPE_HW_CACHE、PERF_TYPE_RAW 这四种类型。
实际上,事件类型的本质,就是其后端 PMU 的类型。

3.2.1 hardware

与硬件相关的事件。典型事件有:
  • PERF_COUNT_HW_CPU_CYCLES
  • PERF_COUNT_HW_INSTRUCTIONS
  • PERF_COUNT_HW_CACHE_REFERENCES
  • PERF_COUNT_HW_CACHE_MISSES
特征是其后端必须使用硬件 PMU 来监控。比如 PERF_COUNT_HW_INSTRUCTIONS,你要想知道运行期间所产生的 instruction 数,就必须借助硬件才能实现。

3.2.2 software

与软件相关的事件。典型事件有:
  • PERF_COUNT_SW_PAGE_FAULTS
  • PERF_COUNT_SW_CONTEXT_SWITCHES
  • PERF_COUNT_SW_CPU_MIGRATIONS
特征是其后端使用的是一个软件实现的 PMU 来监控。比如 PERF_COUNT_SW_CONTEXT_SWITCHES,你要想知道运行期间的上下文切换次数,就必须借助内核中基于调度系统实现的软件 PMU 才能实现。

3.2.3 hw_cache

与 cache 相关的事件。该类事件与上述两类不同。上述两类,每一种事件,通过一个 id(事件编码)来描述;而描述一个 cache 相关的事件,需要三个维度的信息:
  • cache id:具体是监控哪一级 cache(PERF_COUNT_HW_CACHE_L1D、PERF_COUNT_HW_CACHE_L1I、PERF_COUNT_HW_CACHE_LL 等)。
  • cache op id:监控的是对 cache 的什么操作(PERF_COUNT_HW_CACHE_OP_READ、PERF_COUNT_HW_CACHE_OP_WRITE、PERF_COUNT_HW_CACHE_OP_PREFETCH)。
  • cache op result id:操作的结果(PERF_COUNT_HW_CACHE_RESULT_ACCESS、PERF_COUNT_HW_CACHE_RESULT_MISS)。
具体来说,用户期望监控 LLC 读操作 miss 事件,则组合 PERF_COUNT_HW_CACHE_LL、PERF_COUNT_HW_CACHE_OP_READ、PERF_COUNT_HW_CACHE_RESULT_MISS 这三个参数,并传给 perf_event_open 接口。

这类事件,其后端使用的仍然是硬件 PMU(没错,与 hardware 类型一样)。

3.2.4 raw

实际上,hardware 事件的编码,如 PERF_COUNT_HW_CPU_CYCLES,是对事件编码的简化、抽象。
perf 系统对常用的硬件事件提供了形似 PERF_COUNT_HW_CPU_CYCLES 的简化编码。一个事件在 PMU 体系中,原教旨的编码应该是 umask + event select:
图 1:PERF_COUNT_HW_CPU_CYCLES 事件的 umask + event select 编码方式
图 2:IA32_PERFEVTSELx 寄存器格式
更多细节参阅本号《Intel SDM 之 Performance Monitoring》或 Intel SDM。
因为 PMU 可监控的事件非常之多,perf 框架不可能对所有事件都提供抽象编码,所以如果要对抽象编码范围覆盖之外的其他事件做监控,需要采用 umask + event select 的方式,告诉 perf(PMU)所要监控的事件。
这种采用 umask +event select 方式编码的事件即是 raw 类型事件。

raw 事件的本质,就是 hardware、hw_cache 事件中无法被抽象编码所覆盖的那些漏网之鱼事件,也是 SDM 中对事件的原教旨编码方式,所以后端也是硬件 PMU。
在后面文章的分析中我们其实可以看到,hardware、hw_cache 类型事件,其本质就是 raw 事件。

3.2.5 事件类型与 PMU 的关系

这里要注意,PMU 不一定非得是一个硬件,也有软件实现的 PMU。
图 3:事件类型与 PMU 的关系

3.3 事件监控模式

事件的监控有两种模式,一曰 counting,一曰 sampling。
  • counting 模式很简单,就是简单的获取事件的计数,比如过去 5S 内 cpu 0 或 task 123 运行期间产生的 instruction 数等。
  • sampling 模式比较复杂,其利用 PMU 定时去对 CPU 当前运行的 ip 等信息进行采样,并通过一个环形 buffer 将采样数据给到用户态。
如综述所言,本系列文章重点关注 counting 模式。

4. 前端编程基本范式

这里介绍前端的编程范式,不是为了介绍其本身而介绍,主要是为了介绍 perf 框架模型系统的前端呈现。
具体参数配置、接口形式等,请自行 man。

4.1 基本 counting 模式编程

注意 perf_event_attr 中对事件类型、事件编码的指定。
/* 用户自己对 syscall 的封装 */long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags) { int ret; ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); return ret;}
int main(void) { struct perf_event_attr pe; long long count; int fd;
/* 这里初始化了一个 attr * 此 attr 是向 perf_event_open 刻画事件属性的关键参数 */ memset(&pe, 0, sizeof(struct perf_event_attr));
/* type:当前要监控的是一个 hardware 类型事件 * 如前文所述,hardware 类型事件,其本质就是 perf 框架提供了抽象事件编码的硬件事件 */ pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof(struct perf_event_attr);
/* config:指定事件的编码(instruction 事件) */ pe.config = PERF_COUNT_HW_INSTRUCTIONS;
/* disable:该事件默认初始是 disabled 模式 */ pe.disabled = 1;
/* 不监控 kernel(OS)模式下的事件 */ pe.exclude_kernel = 1;
/* perf_event_open pid 入参是 0 * 表明监控当前 task 的 instruction 事件 * 一个事件在用户态的呈现,就是一个 fd */ fd = perf_event_open(&pe, 0, -1, -1, 0);
/* RESET:复位计数值为 0 * ENABLE:enable 此事件(attr 参数中初始此事件是 disabled 的) * 故而需要显式 enable */ ioctl(fd, PERF_EVENT_IOC_RESET, 0); ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
/* 此 printf 的前后对事件进行了 enable、disable * 所以,本程序的 instruction,本质上就是此 printf 语句运行期间的 instruction。 */ printf("Measuring instruction count for this printf\n");
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
/* 读出事件的计数值 */ read(fd, &count, sizeof(long long));
printf("Used %lld instructions\n", count);
close(fd);}

4.2 事件组读取

4.1 节中,对 instruction 单一事件进行监控,并读取 instruction 的计数。
perf 事件读取还支持一种 PERF_FORMAT_GROUP 读取方式,效果是将若干个事件放进一个组内,每个组有一个 group leader。对 group leader 进行读取,可以一次读出组内所有事件的计数。
下面演示将一个 hardware 类型事件和一个 raw 类型事件作为一个组,一次读取整组事件计数的基本范式:
struct read_format {    u64 nr; /* The number of events */    u64 values[2];};
int main(void) { struct perf_event_attr pe; struct read_format count; int group_leader_fd, group_member_fd;
/* 创建一个 hardware 类型的事件,不赘述 */ memset(&pe, 0, sizeof(struct perf_event_attr)); pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof(struct perf_event_attr); pe.config = PERF_COUNT_HW_INSTRUCTIONS; pe.disabled = 1; pe.exclude_kernel = 1;
/* 这里指定采用 PERF_FORMAT_GROUP 读取方式 * 注意,只在 group leader 时需要指定该参数 */ pe.read_format = PERF_FORMAT_GROUP;
/* 创建 group leader */ group_leader_fd = perf_event_open(&pe, 0, -1, -1, 0);
/* 创建一个 raw 类型的事件 * 假设要监控的事件编码:umask = 0x00, event_select = 0x3c * 实际上此事件就是 UnHalted Core Cycles(也就是 hardware 类型的 PERF_COUNT_HW_CPU_CYCLES) */ memset(&pe, 0, sizeof(struct perf_event_attr)); pe.type = PERF_TYPE_RAW; pe.size = sizeof(struct perf_event_attr);
/* 注意 raw 类型事件,config 的编码方式 */ pe.config = (0x00 << 4) | 0x3c; pe.disabled = 1; pe.exclude_kernel = 1;
/* 创建 group member,perf_event_open 的 group_fd 参数指定为 group_leader_fd */ group_member_fd = perf_event_open(&pe, 0, -1, group_leader_fd, 0); /* 组模式下,只需要操作 group leader 即可 */ ioctl(group_leader_fd, PERF_EVENT_IOC_RESET, 0); ioctl(group_leader_fd, PERF_EVENT_IOC_ENABLE, 0);
printf("Measuring instruction count for this printf\n");
ioctl(group_leader_fd, PERF_EVENT_IOC_DISABLE, 0);
/* 读出事件组的计数值,注意这里入参 count 是一个 struct read_format */ read(group_leader_fd, &count, sizeof(count));
/* 只有 count.nr 与当前组成员数(包括 leader、member)匹配,才是合法的数据 */ if (count.nr == 2) printf("Used %llu instructions, %llu cycles\n", count.values[0], count.values[1]);
close(group_leader_fd); close(group_member_fd);}

4.3 模型总结

  1. perf_event_open 支持 per-task 级别的事件监控,pid 入参传入目标 task 的 pid 即可。如综述所言,per-cpu 级别的事件监控本系列文章不做重点讨论。
  2. perf_event_open 支持对事件进行分组,group leader 的 attr 需要带上 PERF_FORMAT_GROUP 参数,group member 的创建需要指定 group leader。

5. 总结

本文简要介绍 perf 前端的编程范式,意在为后续 perf 框架中模型系统的抽象建立直观感受。

加【体系结构与性能优化】群,请扫客服小马微信。

Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 514浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 107浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 524浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 486浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 211浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 121浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 466浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 524浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 82浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 557浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦