【问题标题】:Intel PEBS sample context英特尔 PEBS 示例上下文
【发布时间】:2018-05-15 16:14:16
【问题描述】:

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

【问题讨论】:

    标签: linux-kernel perf intel-pmu


    【解决方案1】:

    在处理中断时永远不会发生 PEBS 采样

    PEBS 使用上述缓冲机制来存储其记录。您可以清楚地看到所有 PEBS 相关字段,例如 PEBS buffer basePEBS 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 事件。

    【讨论】:

    • 从您的评论来看,似乎应该在提供 PEBS 中断处理程序时禁用 PEBS。 PEBS 与其他中断处理程序没有任何冲突,并且可以在没有竞争的中断上下文中生成样本。如果我错了,请纠正我。
    • PEBS 不会与其他中断处理程序发生任何冲突。据我所知,PEBS 期间的数据存储保存只会在 INIT、处理器重置以及系统移动到 SMM(系统管理模式)或 ia-32 模式时避免。
    猜你喜欢
    • 2012-08-26
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-04-19
    • 1970-01-01
    • 2012-11-14
    • 2022-12-24
    相关资源
    最近更新 更多