perf 工具分内核态部分和用户态部分。   后续添加详细实验及过程截图

集成到 Linux 内核的代码,负责向硬件发出指令。
perf 用户空间实用程序,可让您使用内核代码并帮助您分析收集的数据

以监测“cycles”事件为例,perf的工作过程如下:
首先,perf 会通过系统调用sys_perf_event_open在内核中注册一个监测“cycles”事件的性能计数器。内核根据perf提供的信息在PMU(Performance Monitoring Unit)上初始化一个硬件性能计数器(PMC:Performance Monitoring Counter)
其次,PMC随着CPU周期的增加而自动累加。在PMC溢出时,PMU触发一个PMI(Performance Monitoring Interrupt)中断。内核在PMI中断的处理函数中保存PMC的计数值,触发中断时的指令地址(Register IP:Instruction Pointer),当前时间戳以及当前进程的PID,TID,comm等信息,这些信息统称为一个采样(sample)。
然后,内核会将收集到的sample放入用于跟用户空间通信的Ring Buffer。用户空间里的perf分析程序采用mmap机制从Ring Buffer中读入采样,并对其解析;perf根据pid,comm等信息可以找到对应的进程。根据IP与ELF文件中的符号表可以查到触发PMI中断的指令所在的函数。
根据上述的perf采样原理可以得知,perf假设两次采样之间,即两次相邻的PMI中断之间系统执行的是同一个进程的同一个函数。这种假设会带来一定的误差,当我们感觉perf给出的结果不准时,不妨提高采样频率,perf会给出更加精确的结果。

 

参考:

https://zhuanlan.zhihu.com/p/546658526

posted on 2022-10-29 20:46  周伯通789  阅读(191)  评论(0编辑  收藏  举报