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