首页 > *nix技术 > perf初试用

perf初试用

2012年10月31日 发表评论 阅读评论 2,441 次浏览

之前介绍过oprofile,但Linus指出其存在的一些缺点,http://lwn.net/Articles/339406/,因此这里介绍另一款被Linux内核原生支持的性能采样与分析工具perf,在2.6.31及后续版本的Linux内核里,安装perf非常的容易:

[root@localhost ~]# cd /usr/src/linux-2.6.38.8
[root@localhost linux-2.6.38.8]# cd tools/perf/
[root@localhost perf]# make
[root@localhost perf]# make install

看一下可采样的事件,这和oprofile类似:

[root@localhost perf]# ./perf list

List of pre-defined events (to be used in -e):

  cpu-cycles OR cycles                       [Hardware event]
  instructions                               [Hardware event]
  cache-references                           [Hardware event]
  cache-misses                               [Hardware event]
  branch-instructions OR branches            [Hardware event]
  branch-misses                              [Hardware event]
  bus-cycles                                 [Hardware event]

  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]

  L1-dcache-loads                            [Hardware cache event]
  L1-dcache-load-misses                      [Hardware cache event]
  L1-dcache-stores                           [Hardware cache event]
  L1-dcache-store-misses                     [Hardware cache event]
  L1-dcache-prefetches                       [Hardware cache event]
  L1-dcache-prefetch-misses                  [Hardware cache event]
  L1-icache-loads                            [Hardware cache event]
  L1-icache-load-misses                      [Hardware cache event]
  L1-icache-prefetches                       [Hardware cache event]
  L1-icache-prefetch-misses                  [Hardware cache event]
  LLC-loads                                  [Hardware cache event]
...

可采样的事件相当的多,特别是Tracepoint event,因为它是可以在内核代码里自动添加的采样,不可能一下子全部了解所有的这些可采样事件,但没有关系,在具体应用时,再根据具体的需求去找对应的事件即可。

这里尝试使用perf来对应用程序ls进行一下采样:

[root@localhost perf]# ./perf stat ls
  Error: cache-misses event is not supported.
  Fatal: Not all events could be opened.

这是因为的是在虚拟机里实验的缘故,换了一台实体机,同样的过程,结果如下:

[root@localhost perf]# ./perf stat ls Makefile
Makefile

 Performance counter stats for 'ls Makefile':

           1.196880  task-clock-msecs         #      0.821 CPUs
                  0  context-switches         #      0.000 M/sec
                  0  CPU-migrations           #      0.000 M/sec
                284  page-faults              #      0.237 M/sec
            1908300  cycles                   #   1594.395 M/sec
            1099868  instructions             #      0.576 IPC
             252161  branches                 #    210.682 M/sec
              17783  branch-misses            #      7.052 %
              23196  cache-references         #     19.380 M/sec
               5493  cache-misses             #      4.589 M/sec

        0.001457752  seconds time elapsed

[root@localhost perf]#

几个统计值的含义分别如下():
task-clock-msecs:CPU利用率,该值越高,说明花费越多时间在CPU计算上而非其它(比如I/O);这里第一列数值为1.196880毫秒,而通过最后一行知道程序整个执行时间为0.001457752秒,所以百分比为1.196880/1.457752=0.821,即第一行倒数第二列数值。
context-switches:记录程序在运行过程中发生的进程切换次数,应该避免频繁的进程切换;这里为0次。
CPU-migrations:记录程序在运行过程中发生的CPU迁移次数,即被调度器从一个CPU转移到另外一个 CPU上运行;这里为0次。
page-faults:记录程序在运行过程中发生的缺页中断次数。
cycles:记录执行程序所发费的处理器周期数。
instructions:记录执行程序所发费的指令数。
branches:记录程序在运行过程中的分支指令数。
branch-misses:记录程序在运行过程中的分支预测失败次数。
cache-references:记录程序在运行过程中的cache命中次数。
cache-misses:记录程序在运行过程中的cache失效次数。

可以将应用程序重复执行多次,然后取平均值以便获得更为精确的结果:

[root@localhost perf]# ./perf stat -r 5 ls Makefile
Makefile
Makefile
Makefile
Makefile
Makefile

 Performance counter stats for 'ls Makefile' (5 runs):

           1.112293  task-clock-msecs         #      0.808 CPUs    ( +-   1.776% )
                  0  context-switches         #      0.000 M/sec   ( +- 100.000% )
                  0  CPU-migrations           #      0.000 M/sec   ( +-     nan% )
                284  page-faults              #      0.255 M/sec   ( +-   0.086% )
            1772631  cycles                   #   1593.672 M/sec   ( +-   1.757% )
            1101055  instructions             #      0.621 IPC     ( +-   0.331% )
             252995  branches                 #    227.453 M/sec   ( +-   0.372% )
              17284  branch-misses            #      6.832 %       ( +-   0.591% )
              23208  cache-references         #     20.865 M/sec   ( +-   0.926% )
               1533  cache-misses             #      1.378 M/sec   ( +-  74.832% )

        0.001376080  seconds time elapsed   ( +-   1.862% )

[root@localhost perf]#

通过如下命令可以对整个系统直接进行采样,一眼看到哪些函数消耗了较多的cpu:

[root@localhost perf]# ./perf top
---------------------------------------------------------------------------------------------------------------------
   PerfTop:    2646 irqs/sec  kernel:99.3%  exact:  0.0% [1000Hz cycles],  (all, 1 CPUs)
---------------------------------------------------------------------------------------------------------------------

             samples  pcnt function                            DSO
             _______ _____ ___________________________________ ___________________________________

             3054.00 16.8% apic_timer_interrupt                /lib/modules/2.6.37.2/build/vmlinux
             1899.00 10.5% load_balance                        /lib/modules/2.6.37.2/build/vmlinux
             1617.00  8.9% default_send_IPI_mask_sequence_phys /lib/modules/2.6.37.2/build/vmlinux
             1043.00  5.7% _raw_spin_lock                      /lib/modules/2.6.37.2/build/vmlinux
              558.00  3.1% intel_pmu_disable_all               /lib/modules/2.6.37.2/build/vmlinux
              551.00  3.0% scheduler_tick                      /lib/modules/2.6.37.2/build/vmlinux
              515.00  2.8% idle_cpu                            /lib/modules/2.6.37.2/build/vmlinux
              514.00  2.8% source_load                         /lib/modules/2.6.37.2/build/vmlinux
              503.00  2.8% hrtimer_run_queues                  /lib/modules/2.6.37.2/build/vmlinux
              386.00  2.1% run_timer_softirq                   /lib/modules/2.6.37.2/build/vmlinux
              370.00  2.0% find_next_bit                       /lib/modules/2.6.37.2/build/vmlinux
              357.00  2.0% schedule                            /lib/modules/2.6.37.2/build/vmlinux
              317.00  1.7% __do_softirq                        /lib/modules/2.6.37.2/build/vmlinux
              277.00  1.5% intel_pmu_enable_all                /lib/modules/2.6.37.2/build/vmlinux
              230.00  1.3% cpumask_next_and                    /lib/modules/2.6.37.2/build/vmlinux
              227.00  1.3% irq_entries_start                   /lib/modules/2.6.37.2/build/vmlinux
              225.00  1.2% perf_event_task_tick                /lib/modules/2.6.37.2/build/vmlinux
              224.00  1.2% _raw_spin_lock_irqsave              /lib/modules/2.6.37.2/build/vmlinux
              215.00  1.2% save_args                           /lib/modules/2.6.37.2/build/vmlinux
              197.00  1.1% _raw_spin_lock_irq                  /lib/modules/2.6.37.2/build/vmlinux
              182.00  1.0% __local_bh_enable                   /lib/modules/2.6.37.2/build/vmlinux
              173.00  1.0% raise_softirq                       /lib/modules/2.6.37.2/build/vmlinux
              166.00  0.9% notifier_call_chain                 /lib/modules/2.6.37.2/build/vmlinux
              162.00  0.9% __rcu_pending                       /lib/modules/2.6.37.2/build/vmlinux

通过-e指定关注的事件,比如如下查看造成cache miss最多的函数排行:

[root@localhost perf]# ./perf top -e cache-misses

通过record和report记录并生成采样报告:

[root@localhost perf]# ./perf record -e cpu-clock tree /
...
^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.013 MB perf.data (~549 samples) ]
[root@localhost perf]# ./perf report
Events: 203  cpu-clock-msecs
    32.51%   tree         3cd1e796d3  [.]       3cd1e796d3                                                           ↑
    14.29%   tree  [kernel.kallsyms]  [k] _raw_spin_unlock_irqrestore                                                ?
     3.45%   tree  [kernel.kallsyms]  [k] ext3_find_entry                                                            ?
     2.96%   tree  [kernel.kallsyms]  [k] __d_lookup                                                                 ?
     2.96%   tree  [kernel.kallsyms]  [k] n_tty_write                                                                ?
     2.96%   tree  [kernel.kallsyms]  [k] _raw_spin_lock                                                             ?
     2.46%   tree  [kernel.kallsyms]  [k] link_path_walk                                                             ?
     2.46%   tree  [kernel.kallsyms]  [k] __memset                                                                   ?
     1.97%   tree  [kernel.kallsyms]  [k] cache_grow                                                                 ?
     1.97%   tree  [kernel.kallsyms]  [k] memcmp                                                                     ?
     1.48%   tree  [kernel.kallsyms]  [k] system_call                                                                ?
     1.48%   tree  [kernel.kallsyms]  [k] current_kernel_time                                                        ?
     1.48%   tree  [kernel.kallsyms]  [k] find_inode_fast                                                            ?
     1.48%   tree  [kernel.kallsyms]  [k] __strncpy_from_user                                                        ?
     0.99%   tree  [scsi_mod]         [k] scsi_request_fn                                                            ?
     0.99%   tree  [kernel.kallsyms]  [k] __alloc_pages_nodemask                                                     ?
     0.99%   tree  [kernel.kallsyms]  [k] do_lookup                                                                  ?
     0.99%   tree  [kernel.kallsyms]  [k] mntput_no_expire                                                           ?
     0.99%   tree  [kernel.kallsyms]  [k] __find_get_block                                                           ?
     0.99%   tree  [kernel.kallsyms]  [k] ext3_check_dir_entry                                                       ?
     0.99%   tree  [kernel.kallsyms]  [k] copy_user_generic_string                                                   ?
     0.99%   tree  [kernel.kallsyms]  [k] tty_write                                                                  ?
     0.99%   tree  [kernel.kallsyms]  [k] tty_insert_flip_string_fixed_flag                                          ?
     0.99%   tree  [kernel.kallsyms]  [k] mutex_lock                                                                 ?
     0.49%   tree  libc-2.5.so        [.] __gconv_transform_utf8_internal                                            ?
     0.49%   tree  [kernel.kallsyms]  [k] auditsys                                                                   ?
     0.49%   tree  [kernel.kallsyms]  [k] sysret_audit                                                               ?
     0.49%   tree  [kernel.kallsyms]  [k] __wake_up                                                                  ?
     0.49%   tree  [kernel.kallsyms]  [k] bit_waitqueue                                                              ?
     0.49%   tree  [kernel.kallsyms]  [k] __wake_up_bit                                                              ?
     0.49%   tree  [kernel.kallsyms]  [k] audit_syscall_entry                                                        ↓
Press '?' for help on key bindings

关于perf的更多用法,可以直接查看perf的帮助,即:

[root@localhost perf]# ./perf --help
[root@localhost perf]# ./perf top --help
[root@localhost perf]# ./perf record --help
[root@localhost perf]# ./perf report --help

完全参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/
https://perf.wiki.kernel.org/index.php/Tutorial
http://lwn.net/Articles/339361/
http://linuxplumbersconf.org/2009/slides/Arnaldo-Carvalho-de-Melo-perf.pdf

转载请保留地址:http://lenky.info/archives/2012/10/31/2007http://lenky.info/?p=2007


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。

分类: *nix技术 标签:
  1. duan
    2012年11月19日01:55 | #1

    你也搞过perf啊。看起来你应该是在华为这样的公司工作,而且你们的产品对内核的性能要求比较高。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.