如何解决"不计算"在perf?

时间:2016-05-15 17:12:32

标签: linux performance x86 perf

perf stat -d ./sample.out 输出是:

Performance counter stats for './sample.out':

          0.586266 task-clock (msec)         #    0.007 CPUs utilized          
                 2 context-switches          #    0.003 M/sec                  
                 1 cpu-migrations            #    0.002 M/sec                  
               116 page-faults               #    0.198 M/sec                  
          7,35,790 cycles                    #    1.255 GHz                     [81.06%]
     <not counted> stalled-cycles-frontend 
   <not supported> stalled-cycles-backend  
     <not counted> instructions            
     <not counted> branches                
     <not counted> branch-misses           
   <not supported> L1-dcache-loads:HG      
     <not counted> L1-dcache-load-misses:HG
     <not counted> LLC-loads:HG            
   <not supported> LLC-load-misses:HG      

       0.088013919 seconds time elapsed

我读了为什么会出现。但是,即使是基本的计数器,如指令,分支机构等,我也可以建议如何让它工作?

有趣的是:

  

sudo perf stat sleep 3

给出输出:

Performance counter stats for 'sleep 3':

          0.598484 task-clock (msec)         #    0.000 CPUs utilized          
                 2 context-switches          #    0.003 M/sec                  
                 0 cpu-migrations            #    0.000 K/sec                  
               181 page-faults               #    0.302 M/sec                  
     <not counted> cycles                  
     <not counted> stalled-cycles-frontend 
   <not supported> stalled-cycles-backend  
     <not counted> instructions            
     <not counted> branches                
     <not counted> branch-misses
  

sudo perf stat -C 1 sleep 3

 Performance counter stats for 'CPU(s) 1':

       3002.640578 task-clock (msec)         #    1.001 CPUs utilized           [100.00%]
               425 context-switches          #    0.142 K/sec                   [100.00%]
                 9 cpu-migrations            #    0.003 K/sec                   [100.00%]
                 5 page-faults               #    0.002 K/sec                  
       7,82,97,019 cycles                    #    0.026 GHz                     [33.32%]
       9,38,21,585 stalled-cycles-frontend   #  119.83% frontend cycles idle    [33.32%]
   <not supported> stalled-cycles-backend  
       3,09,81,643 instructions              #    0.40  insns per cycle        
                                             #    3.03  stalled cycles per insn [33.32%]
         70,15,390 branches                  #    2.336 M/sec                   [33.32%]
          6,38,644 branch-misses             #    9.10% of all branches         [33.32%]

       3.001075650 seconds time elapsed

为什么这出乎意料的工作呢?

谢谢

2 个答案:

答案 0 :(得分:8)

非常短的节目perf stat -d的典型问题不是统计抽样,而是多路复用(方括号中的百分比表示[33%] - 此计数器仅计算在周围33%的运行时间)。

您要求您的PMU一次监控太多事件,并且perf无法同时在真实硬件(PMU - CPU的性能监控单元)上映射所有必需的计数器。典型的PMU可能具有4或7或8个独立计数器,但如果您启用了某些SMT技术(例如,HT - 超线程),则该数量可以除以2。

当你要求perf计算这么多计数器时(你的perf属性输出中有6个支持的HW事件),它会将它们分成更小的组。当perf_events有机会更改它们时,内核会在某些时间点更改组,例如在任务时钟滴答(~3 ms)上。

您可以使用较小的事件集将您的运行拆分为多个 - 每次运行任意数量的SW事件和2-4个HW事件:

perf stat -e task-clock,page-faults,cycles,stalled-cycles-frontend 
perf stat -e task-clock,page-faults,cycles,instructions            
perf stat -e task-clock,page-faults,branches,branch-misses           
perf stat -e task-clock,page-faults,L1-dcache-load-misses:HG,LLC-loads:HG       

答案 1 :(得分:-1)

sudo perf stat -C 1 sleep 3个配置文件在CPU 1上发生的所有,所有进程和内核代码。这就是为什么sudo是必需的。这也是任务时钟约为3002 ms的原因。

perf stat sleep 3(不需要sudo)仅配置sleep(1)进程本身。任务时钟在CPU时间约0.6毫秒时测量它。

sleep本身几乎没有做任何事情;运行的大多数指令都在动态链接器中。正如@ osgx的答案指出的那样,你错过了计数,因为perf在你的机器上没有足够的硬件计数器,所以它正在多路复用它们。 <{1}}正在睡觉而不是正在运行时,必须记录没有计数的计数器。

为了获得良好的效果,请将微基准测试放在一个至少运行100毫秒的循环中,最好是〜1秒,以获得良好的信噪比,具体取决于您计算的计数器。