PEBS是Intel CPU为采样性能监视器提供的采样机制。
是否可以使用PEBS来衡量流程的IPC? PEBS如何确定何时采样?
答案 0 :(得分:3)
查看我对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样本计数的比率。
当每个2660000th事件(对于pfmon在上面运行)到位时,PEBS会进行采样。当pfmon启动时,它要求CPU计算特殊msr寄存器中的性能事件。 CPU将为进程计数事件,OS将在context_switch上保存不同进程的MSR。此外,当事件计数器的值为> = 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