PERF_TYPE_HARDWARE 和 PERF_TYPE_HW_CACHE 并发监控

2024-01-16

我正在研究一个自定义实现perf_event_open系统调用。

该实施旨在支持各种PERF_TYPE_HARDWARE, PERF_TYPE_SOFTWARE and PERF_TYPE_HW_CACHE活动为任何核心上的特定线程.

In 英特尔® 64 和 IA-32 架构软件开发人员手册第 3B 卷我在测试 CPU (Kaby Lake) 中看到以下内容:

据我所知,到目前为止,人们可以(理论上)无限地监控PERF_TYPE_SOFTWARE事件并发但有限(无复用)PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE因为每个事件都是由 CPU 的 PMU 的有限数量的计数器(如上面的手册中所示)来测量的。

因此,对于启用超线程的四核 Kaby Lake CPU,我假设最多 4 个PERF_TYPE_HARDWARE/PERF_TYPE_HW_CACHE可以同时监视事件(如果仅使用 4 个线程,则最多可监视 8 个事件)。

对上述假设进行实验后,我发现虽然我可以成功监控最多 4 个PERF_TYPE_HARDWARE事件(对于 8 个线程)情况并非如此PERF_TYPE_HW_CACHE最多只能同时监控 2 个事件的事件!

我还尝试仅使用 4 个线程,但并发监视的“PERF_TYPE_HARDWARE”事件的上限仍然是 4。超线程也会发生同样的情况disabled!

有人可能会问:为什么需要避免多路复用。首先,实现需要尽可能准确,避免复用的潜在盲点,其次,当超过“上限”时,所有事件值均为 0...

The PERF_TYPE_HW_CACHE我的目标事件是:

CACHE_LLC_READ(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value  | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_READ.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_ACCESS.value << 16),
CACHE_LLC_WRITE(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value  | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_WRITE.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_ACCESS.value << 16),
CACHE_LLC_READ_MISS(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value  | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_READ.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_MISS.value << 16),
CACHE_LLC_WRITE_MISS(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value  | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_WRITE.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_MISS.value << 16),

所有这些都按照提供的公式实现:

(perf_hw_cache_id) | (perf_hw_cache_op_id << 8) |
(perf_hw_cache_op_result_id << 16)

并作为一个团体进行操纵(第一个是团体领导者等)。

所以,我的问题如下:

  1. PMU的哪些计数器用于PERF_TYPE_HARDWARE以及对于PERF_TYPE_HW_CACHE活动以及在哪里可以找到这些信息?
  2. 两者有什么区别PERF_TYPE_HARDWARE预定义的事件(例如PERF_COUNT_HW_CACHE_MISSES)和PERF_TYPE_HW_CACHE events?
  3. 有关如何在不复用所有列出的情况下进行监控的任何建议PERF_TYPE_HW_CACHE events?
  4. 关于如何在不复用最多 8 个的情况下进行监控的任何建议PERF_TYPE_HARDWARE or/and PERF_TYPE_HW_CACHE events?

提前致谢!


  1. The PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE事件被映射到涉及性能监控的两组寄存器。第一组 MSR 称为IA32_PERFEVTSELx其中 x 的范围为 0 到 N-1,N 是可用通用计数器的总数。这PERFEVTSEL是“性能事件选择”的缩写,它们指定了发生事件计数的各种条件。第二组 MSR 称为IA32_PMCx,其中 x 的变化类似于PERFEVTSEL。这些 PMC 寄存器存储性能监控事件的计数。每个PERFEVTSEL寄存器与相应的配对PMC登记。

映射发生如下 -

在内核的体系结构特定部分初始化时,会注册一个用于测量硬件特定事件的 pmuhere https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/core.c#L1908与类型PERF_TYPE_RAW. All PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE事件被映射到PERF_TYPE_RAW事件来识别pmu,可以看出here https://elixir.bootlin.com/linux/v5.6.15/source/kernel/events/core.c#L10511.

if (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE)
        type = PERF_TYPE_RAW;

相同的架构特定初始化负责设置上述每组性能监控事件寄存器的第一/基址寄存器的地址,here https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/intel/core.c#L3950

    .eventsel       = MSR_ARCH_PERFMON_EVENTSEL0,
    .perfctr        = MSR_ARCH_PERFMON_PERFCTR0,

The event_init特定于PMU识别的功能,负责设置和“保留”两组性能监控寄存器,以及检查事件约束等,here https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/core.c#L2350。预订发生here https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/core.c#L148.

for (i = 0; i < x86_pmu.num_counters; i++) {
        if (!reserve_perfctr_nmi(x86_pmu_event_addr(i)))
            goto perfctr_fail;
    }

    for (i = 0; i < x86_pmu.num_counters; i++) {
        if (!reserve_evntsel_nmi(x86_pmu_config_addr(i)))
            goto eventsel_fail;
    }

价值num_counters= 通用计数器的数量CPUID操作说明。

除此之外,还有一些额外的寄存器 https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/intel/core.c#L232监视核心外事件(例如 LLC 缓存特定事件)。

在架构性能监控的更高版本中,一些硬件事件是借助固定用途寄存器来测量的,如下所示here https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/intel/core.c#L193。这些都是固定目的的寄存器 https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/include/asm/perf_event.h#L158 -

#define MSR_ARCH_PERFMON_FIXED_CTR0 0x309
#define MSR_ARCH_PERFMON_FIXED_CTR1 0x30a
#define MSR_ARCH_PERFMON_FIXED_CTR2 0x30b
  1. The PERF_TYPE_HARDWARE预定义的events https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/intel/core.c#L30都是建筑学性能监控事件。这些事件是架构性的,因为每个架构性能事件的行为预计在支持该事件的所有处理器上保持一致。全部PERF_TYPE_HW_CACHE事件是非建筑,这意味着它们是特定于型号的,并且可能因处理器系列而异。

  2. 对于我拥有的 Intel Kaby Lake 机器,总共 20PERF_TYPE_HW_CACHE事件是预先定义的。事件约束involved https://elixir.bootlin.com/linux/v5.6.15/source/arch/x86/events/intel/core.c#L192,确保 3 个可用的固定功能计数器映射到 3 个PERF_TYPE_HARDWARE建筑事件。每个固定功能计数器只能测量一个事件,因此我们可以在分析时丢弃它们。另一个限制是只能同时测量两个针对 LLC 缓存的事件,因为只有两个事件OFFCORE RESPONSE寄存器。另外,nmi-watchdog可以将事件固定到通用计数器系列中的另一个计数器。如果nmi-watchdog被禁用后,我们只剩下 4 个通用计数器。

考虑到所涉及的限制以及可用计数器的数量有限,如果同时测量所有 20 个硬件缓存事件,则无法避免复用。测量所有事件而不引起多路复用及其错误的一些解决方法是 -

3.1.将所有的PERF_TYPE_HW_CACHE事件分成 4 个一组,这样所有 4 个事件都可以同时安排在 4 个通用计数器中的每一个上。确保组中的 LLC 缓存事件不超过 2 个。运行相同的配置文件并分别获取每个组的计数。

3.2.如果所有的PERF_TYPE_HW_CACHE要同时监视多个事件,则可以通过减小 的值来减少多路复用的一些错误perf_event_mux_interval_ms。它可以通过名为的 sysfs 条目进行配置/sys/devices/cpu/perf_event_mux_interval_ms。该值不能降低超过一个点,可以看出here https://elixir.bootlin.com/linux/v5.6.15/source/kernel/events/core.c#L1112.

  1. 监视最多 8 个硬件或硬件缓存事件需要禁用超线程。请注意,有关可用通用计数器数量的信息是使用以下命令检索的:CPUID指令和此类计数器的数量在内核启动的体系结构初始化部分通过early_initcall功能。这个可以看到here https://elixir.bootlin.com/linux/v5.6.15/source/kernel/events/core.c#L1112。初始化完成后,内核知道只有 4 个计数器可用,以后超线程功能的任何更改都不会产生任何影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PERF_TYPE_HARDWARE 和 PERF_TYPE_HW_CACHE 并发监控 的相关文章

随机推荐

  • 用于在 Internet Explorer 7 中打开多个页面的 Windows 控制台命令

    如何使用单个 DOS 命令在 Internet Explorer 7 中打开多个页面 批处理文件是执行此操作的唯一方法吗 Thanks 批处理文件将作为一种快速但肮脏的解决方案 echo off setlocal openurl set u
  • Jenkins Pipeline 有“多个候选版本”并且正在选择旧版本

    我配置了一个 Jenkins 多分支管道 它应该从远程 GIT 存储库获取源代码以进行构建 詹金斯似乎 随机 选择一个旧的提交来构建 并在构建日志文件中显示消息 多个候选修订 我的管道看起来像 checkout class GitSCM b
  • XML:如何将一个文件读入另一个文件

    我有一个文件 A xml 包含如下内容
  • 嵌入或引用关系

    我使用 mongodb 和 mongoid gem 我想得到一些建议 我有一个应用程序 其中用户has many市场与市场has many产品 我需要在属于用户的所有 或任何 市场中搜索特定价格范围内的产品 哪种关系更适合这种情况 嵌入关系
  • ActiveRecord :includes - 如何使用带有加载关联的地图?

    我有一个小型 Rails 应用程序 我正在尝试获取一些订单统计信息 所以我有一个管理模型和一个订单模型 具有一对多关联 class Admin lt ActiveRecord Base attr accessible name has ma
  • 多线程将对象引用传递给静态帮助器方法

    我只是 Java 的初学者 偶然发现了多线程应用程序 我知道这个问题与这里的一些帖子类似 但我找不到更好的答案来回答我的问题 基本上 我想将对象传递给静态方法 该方法将仅根据对象的值 属性返回输出 对于每次调用 我都会创建该对象的一个 新实
  • 视图控制器可以访问传入 Segue 的标识符吗?

    视图控制器可以访问用于转换到它的 Segue 的标识符吗 例如 我使用带有标识符 mySegue 的 Segue 从视图控制器 A 转换到视图控制器 B 无论如何 视图控制器 B 是否可以获取 segue 的标识符 我不相信有这样的财产 这
  • JAX-RS 中的 @Produces 注释

    我的服务方法产生其中之一MediaTypes它可能会产生pdf or excel文件或其他 Produces application pdf application vnd ms excel 我的问题 我的服务返回响应类型applicati
  • 在 Swift 中使用实时滤镜录制视频

    我是 swift 的新手 试图构建一个相机应用程序 它可以应用实时滤镜 并使用应用的滤镜进行保存 到目前为止 我可以使用应用的滤镜实时预览 但当我保存视频时 它全黑了 import UIKit import AVFoundation imp
  • 发布模式出错,但调试模式下不出错

    我的代码在调试模式下运行良好 但在发布模式下失败 这是我失败的代码片段 LOADER gt AllocBundle m InitialContent while m InitialContent isReady this gt Loadin
  • 带 Plotly 的树形图:空白屏幕?

    我正在使用 R 编程语言 我正在尝试遵循此处提供的答案 R 中使用plotly 绘制树形图 https stackoverflow com questions 72179306 treemap plot with plotly in r 我
  • “索引签名参数类型不能是联合类型。” – 我应该用什么来代替?

    当我尝试编译此 Typescript 代码时 interface Foo foo hello world string 我收到此错误消息 索引签名参数类型不能是联合类型 考虑改用映射对象类型 什么是映射对象类型 如何使用它 映射的对象类型对
  • 检查变量是否是字符串的简单方法?

    这个问题是一个衍生问题 是 Array 的实例 但 不是 String 的实例 https stackoverflow com questions 12254658 is an instance of array but isnt of s
  • 使用 Microsoft Graph 客户端创建日历事件

    我正在尝试弄清楚如何使用 Microsoft Graph JavaScript 客户端创建日历事件 我已经设法找回必要的accessToken并且可以与 API 交互 即检索事件 日历 前 10 封电子邮件 但我不确定如何使用 API 来创
  • Laravel 4:如何更新 Eloquent 模型中的多个字段?

    如何更新 Eloquent 模型中的多个字段 假设我是这样得到的 user User where username rok 然后我就有了所有这些模型参数 new user data array email gt email protecte
  • ZF2 - Zend Framework 2,了解路由

    我正在尝试了解 ZF2 中的模块路由 目前我只能为单个操作创建一个控制器 并且正在努力找出这个路由 我查看了其他模块和插件 我有点明白了 只需要一点点推动就可以 得到它 在此示例中 我尝试路由到两个操作 indexAction 和 cmst
  • 粘贴前检查剪贴板的内容

    在Excel VBA中粘贴之前是否可以检查剪贴板的内容 我今天有这个 Sheets Add After Sheets Sheets Count Create new sheet ActiveSheet Paste Paste from Cl
  • Android 按钮位置编程

    我的应用程序中有一个按钮 我想以编程方式更改其位置 我在 XML 中创建了一个按钮 如下所示
  • 如何使用 phinx 编写迁移来插入记录?

    我在用着phinx http docs phinx org 为了处理新项目的迁移 现在我需要创建一个新表并向其中插入一些行 我有 tableStatus this gt table status tableStatus gt addColu
  • PERF_TYPE_HARDWARE 和 PERF_TYPE_HW_CACHE 并发监控

    我正在研究一个自定义实现perf event open系统调用 该实施旨在支持各种PERF TYPE HARDWARE PERF TYPE SOFTWARE and PERF TYPE HW CACHE活动为任何核心上的特定线程 In 英特