Linux kernel 如何从内核读取性能计数器?
我一直在用户空间中使用LinuxPerf工具。我想编写代码,每次执行上下文切换时读取线程的性能计数器 所需步骤包括: 1) 获取读取性能计数器寄存器的机制 2) 在每次上下文切换后从调度程序调用步骤(1) 我被困在步骤(1)中,因为我无法确定读取性能寄存器需要调用哪些函数,以及在执行时如何描述事件。Linux kernel 如何从内核读取性能计数器?,linux-kernel,perf,intel-pmu,Linux Kernel,Perf,Intel Pmu,我一直在用户空间中使用LinuxPerf工具。我想编写代码,每次执行上下文切换时读取线程的性能计数器 所需步骤包括: 1) 获取读取性能计数器寄存器的机制 2) 在每次上下文切换后从调度程序调用步骤(1) 我被困在步骤(1)中,因为我无法确定读取性能寄存器需要调用哪些函数,以及在执行时如何描述事件。 我试着看完了文件,也看完了这个问题 实际上,通过使用跟踪点事件和组长采样,您可以完全使用perf来完成这项工作 sched:sched_开关是在每个上下文开关上触发的跟踪点事件。将该事件与其他事件一
我试着看完了文件,也看完了这个问题 实际上,通过使用跟踪点事件和组长采样,您可以完全使用
perf
来完成这项工作
sched:sched_开关是在每个上下文开关上触发的跟踪点事件。将该事件与其他事件一起放入启用了组长采样的组中,将允许您在发生组长采样时读取非组长计数器。语法如下所示:
perf record -e "{sched:sched_switch,cycles,instructions}:S" -a
每当有上下文切换时,这将在每个CPU上记录周期
值和指令
。您可以使用perf script
检查输出,这也允许您使用python程序读取输出
如果您想在自己的程序中进行监控,可以将perf\u event\u open
与perf\u FORMAT\u GROUP
和perf\u SAMPLE\u READ
一起使用
perf
工具及其底层的perf\u event\u open
接口非常强大,但有时可能缺少文档。如果您需要更大的灵活性,可以使用和。perf
是在Linux中使用性能计数器子系统的工具。您如何使用perf
?您希望从哪些性能计数器读取数据?您是否有一个从用户空间尝试使用perf
的示例?是的,我已经使用perf一段时间了。我想测量的计数器都在perf list事件中,基本上是所有硬件缓存事件。到目前为止,我只在用户空间中使用了-I标志,它在固定间隔后给了我计数器。我想我们可以使用类似的命令。谢谢@Zulan,我如何在运行时访问计数器值?我计划在内核中实现这一点,但不太确定如何实现。另外,你能评论一下所涉及的开销吗?为什么你想在内核中实现一些东西,而内核已经能够为你实现这些东西了?它甚至允许您使用BPF运行自己的代码。修改内核代码本身要复杂得多,而且相当脆弱。。。在上下文切换速率上,要读取的计数器的数量和类型。。。。您必须测量以计算特定情况下的开销。