11

Last Branch Record 是指寄存器对 (MSR) 的集合,这些寄存器对 (MSR) 存储与最近执行的分支相关的源地址和目标地址。http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf文档有更多信息,以防您感兴趣。

  • a) 有人可以知道 LBR 减慢了常见程序的程序执行速度 - CPU 和 IO 密集型吗?
  • b) 当 LBR 跟踪打开时,分支预测是否会关闭?
4

2 回答 2

12

英特尔代码执行跟踪资源一文(Arium 工作人员、Craig Pedersen 和 Jeff Acampora,2012 年 4 月 29 日)列出了分支跟踪的三种变体:

  • DebugCtlMSR 和相应的 LastBranchToIP 和 LastBranchFromIP MSR 以及 LastExceptionToIP 和 LastExceptionFromIP MSR 中的最后一个分支记录 (LBR)标志。

  • 使用缓存作为 RAM 或系统 DRAM 的分支跟踪存储 (BTS) 。

  • 架构事件跟踪 (AET)从 XDP 端口捕获并存储在外部连接的 In-Target Probe 中。

如第 2 页所述,LBR将信息保存在 MSR 中,“不会妨碍任何实时性能”,但仅对非常短的代码有用(“有效的跟踪显示非常浅,通常可能只显示数百条指令。”) . 仅保存有关 4-16 个分支的信息。

BTS允许捕获多对分支“From”和“To”,并将它们存储在高速缓存(Cache-as-RAM,CAR)或系统 DRAM 中。在 CAR 的情况下,跟踪深度/长度受缓存大小(以及一些常数)的限制;DRAM 走线长度几乎是无限的。该论文估计,由于额外的内存存储,BTS 的开销从 20% 到 100% 不等。Linux 上的 BTS 很容易与提议的perf 分支记录(还没有在 vanilla 中)或btrax 项目一起使用。perf branch演示文稿给出了一些关于 BTS 组织的提示:有 BTS 缓冲区,其中包含“from”、“to”字段和“predicted flag”。因此,使用 BTS 时不会关闭分支预测。此外,当 BTS 缓冲区被填充到最大大小时,会产生中断。内核中的 BTS 处理模块(perf_events 子系统或 btrax 内核模块)应将数据从 BTS 缓冲区复制到其他位置以防此类中断。

因此,在 BTS 模式下,有两个开销来源:缓存/内存存储和来自 BTS 缓冲区溢出的中断。

AET使用外部代理来保存调试和跟踪数据。该代理通过扩展调试端口 (XDP) 连接并与目标内探针 (ITP) 连接。根据本文,AET 的开销“会对系统性能产生重大影响,可能会大几个数量级”,因为 AET 可以生成/捕获更多类型的事件。但是收集的数据存储在调试平台的外部。

论文的“摘要”说: </p>

LBR没有开销,但非常浅(4-16 个分支位置,具体取决于 CPU)。跟踪数据在复位后立即可用。

BTS更深,但对 CPU 性能有影响,并且需要板载 RAM。一旦 CAR 初始化,跟踪数据就可用。

AET需要特殊的 ITP 硬件,并且并非在所有 CPU 架构上都可用。它具有在板外存储跟踪数据的优点。

于 2013-02-06T13:04:07.480 回答
2

这是一个老问题(也有老答案),但它确实出现在今天的搜索中。

在 2021 年,您要用于硬件跟踪的是英特尔® 处理器跟踪 (IPT)。
请记住,问题显然与 Intel/AMD 台式机 CPU 有关。AFAIK 有类似的 ARM CPU 解决方案,此处未介绍。

我在 Windows 中使用自定义驱动程序同时使用了 LBR 和 IPT 设置,而后者是迄今为止开销最少的。某处以两位数或更少百分比的方式进行进程跟踪。

同样在答案中说:

LBR 没有开销,..

从技术上讲是正确的,但说起来不切实际,因为实际读取存储寄存器时会产生开销。通常,您会将其设置为在每个分支记录上中断。因此,我们正在讨论为每个通过陷阱/单步标志激活线程的单个分支(调用、jmp、jcc、int 等)指令处理中断/异常/陷阱的开销。

IPT 的最大缺点是仅在 Intel CPU 上可用,而 LBR 功能也由 AMD CPU 支持。

不幸的是,AFAIK(上次我检查过)IPT 功能尚不被任何商业 VM 软件支持。这意味着您很可能只能在直接硬件上进行 IPT 会话。除非您真的想在 VM 中进行跟踪,否则这没什么大不了的。就此而言,LBR 可能具有相同的限制。

Some Linuxes have native kernel support for IPT. A good starting point for Windows is Alex Ionescu's WinIPT project:
https://ionescu007.github.io/winipt/

于 2021-07-10T21:12:03.233 回答