【问题标题】:How to know max event period of perf-record如何知道性能记录的最大事件周期
【发布时间】:2017-12-09 06:21:48
【问题描述】:

有谁知道如何获取 Perf 事件的最大事件周期值(或内核实际传递给 PMU 的值)?

我正在使用 perf 来衡量我的程序,如下所示: perf record -d -e cpu/event=0xd0,umask=0x81/ppu,cpu/event=0xd0,umask=0x82/ppu -c 5

cpu/event=0xd0,umask=0x81/ppu 表示测量 cpu 中的所有负载,cpu/event=0xd0,umask=0x82/ppu 表示所有存储。

我试图了解strace 传递的参数是如何传递的,但一无所获。

PMU 是否收到超出其能力的值,仍会尝试达到它?如果有,在哪里可以找到相关代码以及这些事件的最大事件周期是多少?

谢谢大家。

【问题讨论】:

  • 什么是事件周期值?
  • 嗨,玛格丽特,这意味着 PMU 将在发生多少次后收集样本记录。
  • 例如-c 1000,表示事件发生1000次后会生成一个样本记录
  • 啊,英特尔在其手册中称其为 Counter mask (CMASK)。这是一个 8 位字段,所以我猜 255 是最大值?
  • 但是看性能手册,可能是别的东西

标签: linux linux-kernel x86 perf strace


【解决方案1】:

perf record 命令接受远大于 255 的 周期值。在内部,处理器维护 一个计数器,用于记录所有内存负载和内存存储(或为此问题,任何其他支持的事件)。一旦计数器溢出,处理器将记录有关您尝试记录的内存加载/存储的所有信息(有关架构状态/寄存器等的信息)。

同样,一旦计数器溢出,它必须再次重置。通常计数器被重置为小于 0 的值。由于它被设置为小于零的值并且它递增,一旦再次达到 0,计数器就会溢出。

我所说的这个 counter reset 值是您要求的周期值。我的意思是,如果周期由-c 1 指定,则意味着计数器重置值将设置为-1,因此下一次内存加载/存储会将计数器递增到0(导致计数器溢出)你将记录事件。

因此,如果您将周期设置为 1,则每个内存加载/存储事件都会发生计数器溢出,并且您将记录所有这些事件(这只是概念性的,但是硬件通常无法做到这一点)。

这意味着,周期值可以与这些事件的硬件计数器大小一样大。通常在现代微架构中,例如 Broadwell/Haswell/Skylake,这些计数器的大小是 48 位。所以这个周期可能会大到 2^48-1。但是,不建议使用如此大的值。

通常,周期值在 32 位系统中应保持在最大值 2^32-1,在其他系统中通常也是如此。

来源:

  1. this book第 18 章

  2. 请阅读this link too中的Sampling with perf record主题

  3. 如果您愿意,也可以阅读this question 的答案。

【讨论】:

  • 是的,我明白你说的,但我的问题是,如果 PMU 真的按照你说的那样行事,-c 1 为什么我得到的结果数量这么少?
  • 我已经阅读了intel SDM和perf-record手册,但无法解释这种现象
  • 嗨@KanielVenson,根本不可能记录所有内存访问事件。不建议使用较小的 -c 值,因为它会影响 CPU 性能。 CPU 会节流,因为每次缓冲区满时都会发生中断。它完全超出了硬件的控制范围。
  • 但是我使用的是PEBS,它不会触发中断,直到记录充满PEBS缓冲区。如果像你说的那样,CPU 被限制是因为太多的中断来了,结果中应该有很多样本记录,对吧?
  • 我不认为它们有直接关系,但是,如果发生 CPU 节流,这个参数 perf_event_max_sample_rate 会降低。如果这减少,收集的样本数量将减少。因此,即使您尝试收集所有事件,也无法收集它们。尝试更改此参数,看看是否可以更改记录的事件数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多