我一直在用户空间中使用Linux perf工具。我想编写每次执行上下文切换时读取线程性能计数器的代码。
所需的步骤是:
1)获取读取性能计数器寄存器的机制。
2)在每次上下文切换后,从调度程序调用步骤(1)。
我陷入了步骤(1),因为我无法确定要读取性能寄存器的函数以及如何在执行时描述事件。我试过通过文档和这个问题How do I use performance counters inside of the kernel?。
实际上,您可以使用跟踪点事件和组长采样完全使用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和bcc。