perf使用小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flaoter/article/details/75151247

转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter

参考文档:
1. https://perf.wiki.kernel.org/index.php/Tutorial
2. https://en.wikipedia.org/wiki/Perf_(Linux)
3. Linux man pages
4. http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
5. Cortex-A7 MPCore Technical Reference Manual
6. ARM Cortex-A53 MPCore Processor Technical Reference Manual

1 Introduction

Perf是Linux平台一款性能分析工具,它的实现依赖于一个性能分析架构的内核子系统,并在应用层提供了简洁的命令行接口。
Perf可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题。性能分析是基于内核提供的perf_events接口实现的,支持的events包括软件事件和硬件事件。软件事件分为
1. software events,例如context-switch, minor-faults,它们是完全的内核计数器。
2. tracepoint events, 内核代码中提供的hook,使能后可以在特定的代码被运行时被触发。
硬件事件是Performance Monitoring Unit(PMU) 事件,它是处理器提供的一组计算处理器行为的事件,例如cpu-cycles, cache-misses。
下面是perf命令的接口,可以看出它支持十几个命令。

# ./perf
 The most commonly used perf commands are:
   annotate        Read perf.data (created by perf record) and display annotated code
   archive         Create archive with object files with build-ids found in perf.data file
   bench           General framework for benchmark suites
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   diff            Read two perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   inject          Filter to augment the events stream with additional information
   kmem            Tool to trace/measure kernel memory(slab) properties
   kvm             Tool to trace/measure kvm guest os
   list            List all symbolic event types
   lock            Analyze lock events
   probe           Define new dynamic tracepoints
   record          Run a command and record its profile into perf.data
   report          Read perf.data (created by perf record) and display the profile
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            Run a command and gather performance counter statistics
   test            Runs sanity tests.
   timechart       Tool to visualize total system behavior during a workload
   top             System profiling tool.

 See 'perf help COMMAND' for more information on a specific command.

可通过执行常用命令perf list获得当前环境支持的事件,关于事件在下节进行了详细的介绍。

2 Events

2.1 Hardware events

PMU hardware evetns是CPU厂商提供的,不同厂商提供的事件可能不同,本文只关注ARM CPU。PMU是ARM debug架构的一部分,是ARM架构的可选功能,但是ARM强烈建议包含此功能。它有三个版本PMUv1,PMUv2和PMUv3。Cortext-A7中使用的是PMUv2,Cortex-A53应用的是PMUv3架构。

图1显示了cortex-A7的PMU主要模块,此处理器提供一个64bit的cycle counter和四个32bit 的performance counter。Cycle counter对处理器的clock进行计数,performance counter可以对处理器支持的任意事件进行计数。
PMU的counter可以通过Count Enable Set/Clear Event Selection等寄存器进行控制。这些寄存器可以通过System control processor或外部的APB接口进行访问,此外如芯片支持还可以通过memory map的方式进行访问。
当一个PMU counter溢出时会生成溢出中断,发出nPMUIRQ信号,可将此信号连到处理器进行中断处理。软件可以通过向counter写初始值的方式来控制中断到来的频率,interrupt handler必须对中断状态进行复位。
perf_pmu
Linux内核对支持的事件counter进行了划分,通过perf list命令可以明确区分出来:
PERF_TYPE_HARDWARE,
PERF_TYPE_SOFTWARE,
PERF_TYPE_TRACEPOINT,
PERF_TYPE_HW_CACHE,
PERF_TYPE_RAW,
PERF_TYPE_BREAKPOINT
PERF_TYPE_SOFTWARE和PERF_TYPE_TRACEPOINT为上文中提到的软件事件,PERF_TYPE_HARDWARE, PERF_TYPE_HW_CACHE和PERF_TYPE_RAW都是硬件事件。PERF_TYPE_HARDWARE, PERF_TYPE_HW_CACHE为通用型的事件,在所有版本的处理器上的都支持,它们不代表真正的处理器支持的事件,与真正的事件有一个映射关系的过程。PERF_TYPE_RAW为特定型的事件,直接对应处理器spec列出的支持的事件,即为raw类型。 有关PMU寄存器和PERF支持的事件及描述等详细信息可以通过查看arm spec获取。

2.2 Software Events

软件计数器,记录如下系统行为:
  cpu-clock                                          [Software event]
  task-clock                                         [Software event]
  page-faults OR faults                              [Software event]
  minor-faults                                       [Software event]
  major-faults                                       [Software event]
  context-switches OR cs                             [Software event]
  cpu-migrations OR migrations                       [Software event]
  alignment-faults                                   [Software event]
  emulation-faults                                   [Software event]

2.3 Tracepoint Events

Tracepoint在内核源码中默认大部分没有被使能,一旦使能,可以在特定的代码被运行时触发。假如想知道内核内存管理模块的行为,便可以利用在slab分配器中的tracepoint,当内核运行到这些tracepoint时,便可以通知内核。

3 Perf工具使用

使用示例:
perf stat命令用于生成事件的统计信息,如下示例为对dd命令的统计结果,如果没有指定特定的事件,将对如下通用型事件进行统计。

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

1000000+0 records in
1000000+0 records out
512000000 bytes (512 MB) copied, 0.956217 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
          235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
        9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
      240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
    1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
    2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
              217 page-faults              #      0.000 M/sec
                3 CPU-migrations           #      0.000 M/sec
               83 context-switches         #      0.000 M/sec
       956.474238 task-clock-msecs         #      0.999 CPUs

       0.957617512  seconds time elapsed

可通过-e指定特定的事件统计,可通过-p监测指定进程,-t监测指定线程,-C对指定cpu进行监测,-a对所有cpu进行统计。

./perf stat -e cache-misses -C 0 -B dd if=/dev/zero of=/dev/null count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes transferred in 5.882 secs (87045222 bytes/sec)

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

            101365 cache-misses                                                

       5.917509880 seconds time elapsed

Cortex A53 trm中事件0x03的定义是L1D_CACHE_REFILL

./perf stat -e r003 -C 0 -B dd if=/dev/zero of=/dev/null count=1000000
1000000+0 records in
1000000+0 records out
512000000 bytes transferred in 6.021 secs (85035708 bytes/sec)

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

             80520 raw 0x3                                                     

       6.056482303 seconds time elapsed

4 用户态开发

4.1 用户态接口

  1. 系统调用
int perf_event_open(struct perf_event_attr *attr,
                    pid_t pid, int cpu, int group_fd,
                    unsigned long flags);

返回值为文件描述符。
2. read/write/mmap/close/fcntl/ioctl/poll
使用系统调用返回的文件描述符,正常操作。

猜你喜欢

转载自blog.csdn.net/flaoter/article/details/75151247