如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章