1

我正在使用 Linux perf 工具来监控系统范围的(exclude_kernel == 0)PEBS 样本。我想知道 PEBS 样本是否可以在中断上下文中发生(即,在中断处理程序正在处理中断期间)。如果可能的话,有没有办法确定PEBS样本(即寄存器位)的上下文(例如,进程上下文、中断上下文)?

4

1 回答 1

0

PEBS 采样永远不会在处理中断时发生PEBS 数据存储区

PEBS 使用上述缓冲机制来存储其记录。您可以清楚地看到所有 PEBS 相关字段PEBS buffer basePEBS interrupt threshold。PEBS中断发生在PEBS buffer indexPEBS interrupt threshold指定匹配时。

PEBS 中断处理程序将重新设置PEBS Buffer IndexPEBS buffer base. 如果 PEBS 采样继续,那么 PEBS 也会尝试访问 DS 缓冲区以增加PEBS Buffer Index. 因此,PEBS 中断和 PEBS 本身都会尝试写入同一个 DS 保存区域。这显然指向PEBS 中断处理程序和 PEBS 模块之间的竞争条件。

为了避免这种竞争情况,需要禁用 PEBS 采样(通过禁用IA32_PEBS_ENABLEmsr 寄存器中的标志)。此外,中断处理程序也必须禁用所有事件计数器。这是内核中的证明

但是,如果PEBS 中断对 CPU 造成过多的限制,则可以有一个PERF_RECORD_THROTTLE事件,但这当然不是PEBS_SAMPLE事件,而是一个PERF_RECORD事件。

于 2017-12-08T01:38:51.703 回答