为什么perf stat显示"stalled-cycles-backend"为<不支持>?

oli*_*ver 26 linux cpu performance perf

跑步perf stat ls显示:

Performance counter stats for 'ls':

          1.388670 task-clock                #    0.067 CPUs utilized          
                 2 context-switches          #    0.001 M/sec                  
                 0 cpu-migrations            #    0.000 K/sec                  
               266 page-faults               #    0.192 M/sec                  
           3515391 cycles                    #    2.531 GHz                    
           2096636 stalled-cycles-frontend   #   59.64% frontend cycles idle   
   <not supported> stalled-cycles-backend  
           2927468 instructions              #    0.83  insns per cycle        
                                             #    0.72  stalled cycles per insn
            615636 branches                  #  443.328 M/sec                  
             22172 branch-misses             #    3.60% of all branches        

       0.020657192 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)

为什么stalled-cycles-backend显示为"不支持"?我需要什么样的CPU,硬件,内核或用户空间软件才能看到这个值?

目前从事Linux 3.12试过这种对RHEL的x86_64的,相匹配的"PERF"版本,在不同的英特尔酷睿i5和i7系统(Ivy Bridge的类型).他们都没有支持陷入停滞的周期后端.

更多信息:

$ perf list | grep stalled
  stalled-cycles-frontend OR idle-cycles-frontend    [Hardware event]
  stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]

$ ls /sys/devices/cpu/events/
branch-instructions  bus-cycles    cache-references  instructions  mem-stores
branch-misses        cache-misses  cpu-cycles        mem-loads     stalled-cycles-frontend

$ cat /sys/bus/event_source/devices/cpu/events/stalled-cycles-frontend
event=0x0e,umask=0x01,inv,cmask=0x01
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚在AMD Phenom II X6 1045T CPU上使用Linux 3.2(32位)在Ubuntu 12.04下进行了尝试 - 在这里它确实显示了停滞循环前端和停滞循环后端的值.

amd*_*mdn 23

看起来perf还没有更新,以了解Ivy Bridge支持的所有性能监控事件.幸运的是,有一个通用的,虽然繁琐的界面,允许您访问完整的性能监视事件列表.stalled-cycles-backend当我快速浏览时,我没有在列表中看到,但也许我错过了,或者他们可能已经将所有可能阻碍后端的不同事件打破了.

我们一开始

perf list --help
Run Code Online (Sandbox Code Playgroud)

...显示以下注意事项

    1. Intel(R) 64 and IA-32 Architectures Software Developer's Manual
       Volume 3B: System Programming Guide
       http://www.intel.com/Assets/PDF/manual/253669.pdf
Run Code Online (Sandbox Code Playgroud)

......拥有你最终进入的网址

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf
Run Code Online (Sandbox Code Playgroud)

......你想要第19.3节

19.3 第三代INTEL®CORE™处理器的性能监控事件第三代Intel®Core ™处理器和Intel Xeon处理器E3-1200 v2产品系列基于Intel微体系结构代码名称Ivy Bridge.它们支持表19-1中列出的体系结构性能监视事件.表19-5中列出了处理器内核中的非架构性能监视事件.表19-5中的事件适用于具有以下值的DisplayIDamily_DisplayModel编码的CPUID签名的处理器:06_3AH.

...所以对于architectural你需要的事件表19-1

19.1架构性能监控事件 架构性能事件在Intel Core Solo和Intel Core Duo处理器中引入.基于英特尔酷睿微体系结构的处理器也支持它们.表19-1列出了可以使用通用性能计数器和相关事件选择寄存器配置的预定义体系结构性能事件.

**表19-1.建筑表演活动

在此输入图像描述

在此输入图像描述

...现在是棘手的部分,你取UMask Value上面的2位十六进制数字,并且Event Num是要给出的4位十六进制数字硬件寄存器编号的低2位十六进制数字perf stat.

perf stat --help
Run Code Online (Sandbox Code Playgroud)
   -e, --event=
       Select the PMU event. Selection can be a symbolic event name (use
       perf list to list all events) or a raw PMU event (eventsel+umask) in
       the form of rNNN where NNN is a hexadecimal event descriptor.
Run Code Online (Sandbox Code Playgroud)

......它说,NNN但你可以给它NNNN.让我们验证这是否有效,让我们要求perf stat缓存未命中作为符号事件名称和表19-1中的十六进制数字.date为简单起见,我们将调用该命令.

$ perf stat -e r412e -e cache-misses date

Fri Mar 28 09:28:52 CDT 2014

Performance counter stats for 'date':

          2292 r412e                                                       
          2292 cache-misses                                                

   0.003322663 seconds time elapsed

$ 
Run Code Online (Sandbox Code Playgroud)

你可以看到两者都报告了相同的数字,到目前为止一直很好.现在我们转到表19-5了解非架构硬件寄存器,其中列表太多了,但我会列出一些:

在此输入图像描述

  • 谢谢你的答案!到目前为止,我还没有找到与停滞循环前端或停滞循环后端相对应的"原始"事件编号.对于前者,它应该是`-e r10e`但是并不完全匹配; 对于后者,根据http://stackoverflow.com/questions/22165299/,它可能是`-e r1b1`; 根据英特尔PDF,这将是UOPS_EXECUTED.THREAD - 不确定这是否合理? (3认同)

osg*_*sgx 14

perf(或其在内核部分)没有更新,以支持你的CPU,所以PERF无法映射通用事件名称"停顿周期-后端"实际硬件事件.

在这种情况下,可以更容易地找到事件名称; 例如,对于英特尔CPU - 来自英特尔的优化手册http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-optimization-manual.pdf(按类型对事件进行分组并解释如何用它们来测量各个部分).没有AMD的类似文件.

要将事件名称与perf无需手动转换为原始事件ID(如amdn在其答案中所述),您可以使用转换器脚本showevtinfocheck_eventsperfmon2(libpfm4 ;示例文件夹),如文章" 如何监控全部范围CPU性能事件 "由Bojan Nikolic http://www.bnikolic.co.uk/blog/hpc-prof-events.html提供.perfmon2了解AMD和Intel CPU,并用C/C++编写

对于英特尔CPU,最简单的方法是使用来自英特尔开源python项目的ocperf包装器,安装perf在github https://github.com/andikleen/pmu-tools上的Andi Kleen"pmu-tools",并在这里介绍ML:https:/ /lwn.net/Articles/556983/和Andi的博客http://halobates.de/blog/p/245

ocperf了解英特尔的优化手册中的所有英特尔事件名称.

ocperf还将支持旧Linux内核的每个HW事件.它有自己的tsv或json格式数据库,所有硬件事件及其代码都在https://download.01.org/perfmon/(pmu-tools中有自动下载程序),英特尔不断更新数据库雇主.数据库格式记录在自述文件中:https://download.01.org/perfmon/readme.txt

对于Sandy Bridge/Ivy Bridge或Haswell以及内核3.10或更新版本,您还可以使用"pmu-tools"中的toplev.py脚本来调查性能.下面是它的作者,安迪Kleen的,说明http://halobates.de/blog/p/262 " PMU的工具,第二部分:toplev "的基础上,从艾哈迈德·亚辛"自上而下"方法" 如何调优应用程序使用顶部- 微架构问题的下降特征" 自上而下的分析".永远不会失去性能指标 "