perf初试用
之前介绍过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/2007 或 http://lenky.info/?p=2007
备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。
法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。
你也搞过perf啊。看起来你应该是在华为这样的公司工作,而且你们的产品对内核的性能要求比较高。