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