Linux kernel 如何从内核读取性能计数器?

Linux kernel 如何从内核读取性能计数器?,linux-kernel,perf,intel-pmu,Linux Kernel,Perf,Intel Pmu,我一直在用户空间中使用LinuxPerf工具。我想编写代码,每次执行上下文切换时读取线程的性能计数器 所需步骤包括: 1) 获取读取性能计数器寄存器的机制 2) 在每次上下文切换后从调度程序调用步骤(1) 我被困在步骤(1)中,因为我无法确定读取性能寄存器需要调用哪些函数,以及在执行时如何描述事件。 我试着看完了文件,也看完了这个问题 实际上,通过使用跟踪点事件和组长采样,您可以完全使用perf来完成这项工作 sched:sched_开关是在每个上下文开关上触发的跟踪点事件。将该事件与其他事件一

我一直在用户空间中使用LinuxPerf工具。我想编写代码,每次执行上下文切换时读取线程的性能计数器

所需步骤包括:

1) 获取读取性能计数器寄存器的机制

2) 在每次上下文切换后从调度程序调用步骤(1)

我被困在步骤(1)中,因为我无法确定读取性能寄存器需要调用哪些函数,以及在执行时如何描述事件。
我试着看完了文件,也看完了这个问题

实际上,通过使用跟踪点事件和组长采样,您可以完全使用
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运行自己的代码。修改内核代码本身要复杂得多,而且相当脆弱。。。在上下文切换速率上,要读取的计数器的数量和类型。。。。您必须测量以计算特定情况下的开销。