我一直在用户空间中使用 Linux perf 工具。我想编写每次执行上下文切换时读取线程性能计数器的代码。
所需的步骤是:
1) 获得一种机制来读取性能计数器寄存器。
2) 在每次上下文切换后从调度程序调用 step(1)。
我被困在第 (1) 步,因为我无法弄清楚要调用哪些函数来读取性能寄存器以及如何在执行此操作时描述事件。我尝试浏览文档以及这个问题如何在内核中使用性能计数器?.
我一直在用户空间中使用 Linux perf 工具。我想编写每次执行上下文切换时读取线程性能计数器的代码。
所需的步骤是:
1) 获得一种机制来读取性能计数器寄存器。
2) 在每次上下文切换后从调度程序调用 step(1)。
我被困在第 (1) 步,因为我无法弄清楚要调用哪些函数来读取性能寄存器以及如何在执行此操作时描述事件。我尝试浏览文档以及这个问题如何在内核中使用性能计数器?.
您实际上可以perf
通过使用tracepoint events和group leader sampling完全做到这一点。
这sched:sched_switch
是在每个上下文切换上触发的跟踪点事件。将该事件与其他事件一起放入启用了组长采样的组中,这样您就可以在发生前导采样时读取非领导计数器。语法如下所示:
perf record -e "{sched:sched_switch,cycles,instructions}:S" -a
每当有上下文切换时,这将在每个 CPU 上记录cycles
值。instructions
您可以使用 来检查输出perf script
,这也允许您使用 python 程序读取它。
如果您想在自己的程序中进行监控,可以使用perf_event_open
withPERF_FORMAT_GROUP
和PERF_SAMPLE_READ
。
perf
工具及其底层接口perf_event_open
非常强大,但有时可能缺少文档。如果您需要更大的灵活性,可以使用BPF和bcc。