最后一个分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 (MSR) 的集合。 http://css.csail.mit.edu/6.858/2012/readings/ia32/ia32-3b.pdf 文档包含更多信息,以防您感兴趣。
- a) 有人可以了解 LBR 在多大程度上减慢了常见程序的程序执行速度 - 包括 CPU 和 IO 密集型?
- b) 当 LBR 跟踪打开时,分支预测是否会关闭?
论文《英特尔代码执行跟踪资源》(由 Arium workers、Craig Pedersen 和 Jeff Acampora 撰写,2012 年 4 月 29 日)列出了分支跟踪的三种变体:
-
DebugCtlMSR 中的 Last Branch Record (LBR) 标志以及相应的 LastBranchToIP 和 LastBranchFromIP MSR 以及 LastExceptionToIP 和 LastExceptionFromIP MSR。
-
使用缓存即 RAM 或系统 DRAM 的分支跟踪存储 (BTS)。
-
体系结构事件跟踪 (AET) 从 XDP 端口捕获并存储在外部连接的目标内探头中。
如第 2 页所述,LBR 将信息保存在 MSR 中,"不会妨碍任何实时性能",但仅对非常短的代码有用("有效的跟踪显示非常浅,通常只能显示数百条指令。仅保存有关 4-16 个分支的信息。
BTS允许捕获许多分支"从"和"到",并将它们存储在缓存(缓存即RAM,CAR)或系统DRAM中。在 CAR 的情况下,跟踪深度/长度受缓存大小(和一些常量)的限制;带DRAM的走线长度几乎不受限制。该论文估计,由于额外的内存存储,BTS的开销从20%到100%不等。Linux 上的 BTS 很容易与提议的 perf 分支记录(尚未在原版中)或 btrax 项目一起使用。 perf branch
演示文稿提供了有关BTS组织的一些提示:有BTS缓冲区,其中包含"发件人","收件人"字段和"预测标志"。因此,使用 BTS 时不会关闭分支预测。此外,当 BTS 缓冲区填充到最大大小时,会生成中断。内核中的 BTS 处理模块(perf_events子系统或 btrax 内核模块)应在发生此类中断时将数据从 BTS 缓冲区复制到其他位置。
因此,在 BTS 模式下,开销有两个来源:缓存/内存存储和来自 BTS 缓冲区溢出的中断。
AET 使用外部代理保存调试和跟踪数据。此代理通过扩展调试端口 (XDP) 连接,并与目标内探测 (ITP) 接口。根据本文,AET的开销"可能对系统性能产生重大影响,可以高出几个数量级",因为AET可以生成/捕获更多类型的事件。但是收集的数据存储在调试平台的外部。
论文的"摘要"说:
LBR 没有开销,但非常浅(4-16 个分支位置,具体取决于 在 CPU 上)。跟踪数据在重置后立即可用。
BTS 要深入得多,但对 CPU 性能有影响,并且需要 板载内存。跟踪数据在 CAR 初始化后立即可用。
AET 需要特殊的 ITP 硬件,并且并非在所有 CPU 上都可用 架构。它具有将跟踪数据存储在板外的优点。
这是一个老问题(也有老答案),但它确实出现在今天的搜索中。
在 2021 年,您要用于硬件跟踪的是英特尔®处理器跟踪 (IPT).
请记住,这个问题显然是关于英特尔/AMD台式机CPU。AFAIK 有类似的 ARM CPU 解决方案,此处未介绍。
我已经使用自定义驱动程序在Windows中使用了LBR和IPT设置,后者是迄今为止开销最少的。在两位数或更少的百分比中的某个地方,执行进程跟踪的速度变慢。
同样在回答中说:
LBR 没有开销,..
从技术上讲是正确的,但说起来不切实际,因为开销是在实际读取商店收银机时产生的。通常,您将它设置为中断每个分支记录。因此,我们谈论的是为每个分支(调用,jmp,jcc,int等)处理中断/异常/陷阱的开销,该分支通过陷阱/单步标志激活线程。
IPT的最大缺点是仅在Intel CPU上可用,而AMD CPU也支持LBR功能。
同样不幸的是,AFAIK(上次我检查过)IPT功能尚未被任何商业VM软件支持。这意味着您很可能只能在直接硬件上进行IPT会话。没什么大不了的,除非你真的想在 VM 中执行跟踪。就此而言,LBR 可能具有相同的限制。
一些 Linux 对 IPT 有原生内核支持。Windows的一个很好的起点是Alex Ionescu的WinIPT项目:
https://ionescu007.github.io/winipt/