【发布时间】:2018-05-15 16:14:16
【问题描述】:
我正在使用 Linux perf 工具来监控系统范围的(exclude_kernel == 0)PEBS 样本。我想知道 PEBS 样本是否可以在中断上下文中发生(即,在中断处理程序正在处理中断期间)。如果可能,是否有任何方法可以确定 PEBS 样本(即寄存器位)的上下文(例如,进程上下文、中断上下文)?
【问题讨论】:
标签: linux-kernel perf intel-pmu
我正在使用 Linux perf 工具来监控系统范围的(exclude_kernel == 0)PEBS 样本。我想知道 PEBS 样本是否可以在中断上下文中发生(即,在中断处理程序正在处理中断期间)。如果可能,是否有任何方法可以确定 PEBS 样本(即寄存器位)的上下文(例如,进程上下文、中断上下文)?
【问题讨论】:
标签: linux-kernel perf intel-pmu
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 事件。
【讨论】: