我正在使用 Linux perf 工具来监控系统范围的(exclude_kernel == 0)PEBS 样本。我想知道 PEBS 样本是否可以在中断上下文中发生(即,在中断处理程序正在处理中断期间)。如果可能的话,有没有办法确定PEBS样本(即寄存器位)的上下文(例如,进程上下文、中断上下文)?
问问题
286 次
1 回答
0
PEBS 使用上述缓冲机制来存储其记录。您可以清楚地看到所有 PEBS 相关字段PEBS buffer base
等PEBS interrupt threshold
。PEBS中断发生在PEBS buffer index
与PEBS interrupt threshold
指定匹配时。
PEBS 中断处理程序将重新设置PEBS Buffer Index
为PEBS buffer base
. 如果 PEBS 采样继续,那么 PEBS 也会尝试访问 DS 缓冲区以增加PEBS Buffer Index
. 因此,PEBS 中断和 PEBS 本身都会尝试写入同一个 DS 保存区域。这显然指向PEBS 中断处理程序和 PEBS 模块之间的竞争条件。
为了避免这种竞争情况,需要禁用 PEBS 采样(通过禁用IA32_PEBS_ENABLE
msr 寄存器中的标志)。此外,中断处理程序也必须禁用所有事件计数器。这是内核中的证明。
但是,如果PEBS 中断对 CPU 造成过多的限制,则可以有一个PERF_RECORD_THROTTLE事件,但这当然不是PEBS_SAMPLE事件,而是一个PERF_RECORD事件。
于 2017-12-08T01:38:51.703 回答