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