如何使用 PEBS 测量 IPC?

Posted

技术标签:

【中文标题】如何使用 PEBS 测量 IPC?【英文标题】:How can I measure IPC using PEBS? 【发布时间】:2011-01-27 09:32:00 【问题描述】:

PEBS 是英特尔 CPU 为采样性能监视器提供的一种采样机制。

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

【问题讨论】:

【参考方案1】:

查看我对 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 运行。它们将为您提供整个程序和每个函数的指令退休和 cpu_clk_unhalted 样本计数的比率。

PEBS 会在每 2660000 个事件(对于 pfmon 在上面运行)到位时进行采样。当 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

【讨论】:

这些是 vtune 指令吗?这是在 Windows 上还是 Linux 上? 这是基于精确事件采样 (PEBS) 模式的 Linux 上的 pfmon。 perfmon2.sourceforge.net @osgx 你能否分享一些描述这种机制的链接:“OS will save MSR of different processes on context_switch”? @OlegNeumyvakin, perf(perf_events) 每进程模式下的分析器将保存。您可以提出新问题或搜索 linux 内核的来源

以上是关于如何使用 PEBS 测量 IPC?的主要内容,如果未能解决你的问题,请参考以下文章

什么是ipc?我该如何使用它?

如何使用netlink进行IPC?

如何使用 IPC::Run 回答 rsync 密码提示?

如何在 Windows 10 上使用 IPC::Run 捕获超时异常?

如何使用管道进行非阻塞 IPC(UART 仿真)

如何在使用 QLocalSocket 的 IPC 期间告诉客户端已经结束连接?