【问题标题】:system call hardware performance counters ubuntu系统调用硬件性能计数器 ubuntu
【发布时间】:2015-03-24 19:11:48
【问题描述】:

我正在处理一个项目,我想在执行文件之前和之后获取系统调用(例如:read())的性能计数器(缓存、TLB 等)值。

我尝试在 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.你必须以sudo 运行 2. 你必须安装带有内核调试信息的 perf。您可能会看到 [not supported ] 安装不完整。 3. 尝试sudo perf stat -p [pid] 并在此处添加您的结果。
  • 我已经用代码编辑了上面的问题。这是“ls”的性能计数器统计数据
  • 首先您必须从perf list 中找到性能事件,然后将其传递给perf stat。例如你从perf list 中选择了-iTLB-loads 然后查看ls 命令perf stat -e iTLB-loads ls

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


【解决方案1】:

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

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

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

你不能测量太小的调用,因为从perf_event_open 读取硬件计数器是通过几个read 系统调用完成的。所以,做几个类似的系统调用(100或1000的循环),或者做更多工作的系统调用,或者尝试测量读取的开销以获得硬件计数器(测量空的'foo'函数以获得开销;然后测量你的目标短函数,然后比较差异。)

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 2011-10-29
    • 2012-02-04
    • 1970-01-01
    • 2011-05-07
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多