系统调用硬件性能计数器ubuntu

时间:2015-01-26 11:11:21

标签: performance ubuntu operating-system system-calls perf

我正在开发一个项目,我希望在执行文件之前和之后获得系统调用的性能计数器(缓存,TLB等)值(例如:read())。

我尝试在Ubuntu上使用perf执行此操作,但无法获得任何结果。有没有办法用perf或者其他工具来做呢?

感谢您的帮助。

3.329057 task-clock (msec)         #    0.714 CPUs utilized          
16 context-switches                #    0.005 M/sec                  
0 cpu-migrations                   #    0.000 K/sec                  
257 page-faults                    #    0.077 M/sec                  
1,983,212 cycles                   #    0.596 GHz                    
1,352,902 stalled-cycles-frontend  #   68.22% frontend cycles idle   
1,080,180 stalled-cycles-backend   #   54.47% backend  cycles idle   
1,336,919 instructions             #    0.67  insns per cycle        
                                   #    1.01  stalled cycles per insn
       267,730 branches            #   80.422 M/sec                  
       <not counted> branch-misses           

   0.004663489 seconds time elapsed

1 个答案:

答案 0 :(得分:2)

在计数模式下,perf_event_open有一个小的包装库https://github.com/castl/easyperf,就像perf stat使用它一样(它的输出由你引用)。

您可以设置hw事件计数(启用内核计数 - easyperf中的PERFMON_EVENTSEL_OS标志),然后在包装器中读取计数器perf_read_all的当前值,然后运行您想要配置的函数(系统调用),并且然后读取新的计数器值。新旧值之间的差异是目标函数成本的估计。检查此测试,目标函数为foo

https://github.com/castl/easyperf/blob/master/test.c

您无法测量太小的呼叫,因为从perf_event_open读取hw计数器是通过几个read系统调用来完成的。因此,做几个类似的系统调用(循环为100或1000),或做更多工作的系统调用,或尝试测量读取的开销以获得hw计数器(测量空的&#39; foo&#39;函数来获得开销;然后测量你的目标短函数,然后比较差异。)