PEBS是Intel CPU为采样性能监视器提供的采样机制。

是否可以使用PEBS来衡量流程的IPC? PEBS如何确定何时采样?

最佳答案

查看我对Do Core i3/5/7 CPUs provide a mechanism to measure IPC?的回答,以获取用于计算IPC的监视器名称。

是的,可以使用pfmon / pebs来获取IPC的近似值:

pfmon --smpl-module=pebs -ecpu_clk_unhalted --inv=1 --counter-mask=1 --long-smpl-periods=2660000 -uk -- foo

pfmon --smpl-module=pebs -einstructions_retired --inv=1 --counter-mask=1 --long-smpl-periods=2660000 -uk -- foo


有两次使用pebs的pfmon运行。它们将为您提供整个程序和每个函数的Instructions_retired和cpu_clk_unhalted样本计数的比率。

当每个第2660000个事件(对于上面的pfmon运行)到位时,PEBS都会进行采样。 pfmon启动时,它要求CPU在特殊的MSR寄存器中计数性能事件。 CPU将为进程计数事件,而OS会将不同进程的MSR保存在context_switch上。另外,当事件计数器的值大于等于2660000时,pfmon要求CPU给出异常。当异常发生时,pfmon将记录当前指令的EIP(并将其转换为函数名)并重置性能监视器。

PS使用Linux内核中的perf工具非常容易计数IPC:
https://perf.wiki.kernel.org/index.php/Tutorial

每个进程:

perf stat -B -ecycles:u,instructions:u  dd if=/dev/zero of=/dev/null count=2000000

2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 1.91559 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=2000000':

    1,993,541,603 cycles
      764,086,803 instructions             #      0.383 IPC

       1.916930613  seconds time elapsed


系统范围(-a开关):

perf stat -B -ecycles:u,instructions:u -a sleep 5

 Performance counter stats for 'sleep 5':

      766,271,289 cycles
      596,796,091 instructions             #      0.779 IPC

       5.001191353  seconds time elapsed

09-27 10:50