perf使用

参考:

官网   http://www.brendangregg.com/perf.html

IBM    Perf -- Linux下的系统性能调优工具,第 1 部分   https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

  1. perf list

– 查看当前软硬件环境支持的性能事件.
– 性能事件与 CPU 及内核版本相关

  1. Develop>perf list
  2. List of pre-defined events (to be used in -e):
  3. cpu-cycles OR cycles [Hardware event]
  4. instructions [Hardware event]
  5. cache-references [Hardware event]
  6. cache-misses [Hardware event]
  7. branch-instructions OR branches [Hardware event]
  8. branch-misses [Hardware event]
  9. bus-cycles [Hardware event]
  10. ref-cycles [Hardware event]
  11. cpu-clock [Software event]
  12. task-clock [Software event]
  13. page-faults OR faults [Software event]
  14. context-switches OR cs [Software event]
  15. cpu-migrations OR migrations [Software event]
  16. minor-faults [Software event]
  17. major-faults [Software event]
  18. alignment-faults [Software event]
  19. emulation-faults [Software event]
  20. dummy [Software event]
  21. L1-dcache-loads [Hardware cache event]
  22. L1-dcache-stores [Hardware cache event]
  23. L1-icache-loads [Hardware cache event]
  24. L1-icache-load-misses [Hardware cache event]
  25. LLC-loads [Hardware cache event]
  26. LLC-load-misses [Hardware cache event]
  27. LLC-stores [Hardware cache event]
  28. LLC-store-misses [Hardware cache event]
  29. dTLB-loads [Hardware cache event]
  30. dTLB-load-misses [Hardware cache event]
  31. dTLB-stores [Hardware cache event]
  32. dTLB-store-misses [Hardware cache event]
  33. iTLB-loads [Hardware cache event]
  34. iTLB-load-misses [Hardware cache event]
  35. branch-loads [Hardware cache event]
  36. branch-load-misses [Hardware cache event]
  37. branch-instructions OR cpu/branch-instructions/[Kernel PMU event]
  38. branch-misses OR cpu/branch-misses/[Kernel PMU event]
  39. bus-cycles OR cpu/bus-cycles/[Kernel PMU event]
  40. cache-misses OR cpu/cache-misses/[Kernel PMU event]
  41. cache-references OR cpu/cache-references/[Kernel PMU event]
  42. cpu-cycles OR cpu/cpu-cycles/[Kernel PMU event]
  43. instructions OR cpu/instructions/[Kernel PMU event]
  44. ref-cycles OR cpu/ref-cycles/[Kernel PMU event]
  45. rNNN [Raw hardware event descriptor]
  46. cpu/t1=v1[,t2=v2,t3 ...]/modifier [Raw hardware event descriptor]
  47. (see ‘man perf-list‘ on how to encode it)
  48. mem:<addr>[:access][Hardware breakpoint]
  49. [Tracepoints not available:No such file or directory ]
  1. task-clock:目标任务真真占用处理器的时间,单位是毫秒,我们称之为任务执行时间,
  2. 后面是任务的处理器占用率(执行时间和持续时间的比值)
  3. 持续时间值从任务提交到任务结束的总时间(总时间在stat结束之后会打印出来)。
  4. context-switches:上下文切换次数,前半部分是切换次数,后面是平均每秒发生次数(M是10的6次方)。
  5. cpu-migrations:处理器迁移,linux为了位置各个处理器的负载均衡,
  6. 会在特定的条件下将某个任务从一个处理器迁往另外一个处理器,此时便是发生了一次处理器迁移。
  7. page-fault:缺页异常,linux内存管理子系统采用了分页机制,
  8. 当应用程序请求的页面尚未建立、请求的页面不在内存中或者请求的页面虽在在内存中,
  9. 但是尚未建立物理地址和虚拟地址的映射关系是,会触发一次缺页异常。
  10. cycles:任务消耗的处理器周期数
  11. instructions:任务执行期间产生的处理器指令数,IPC(instructions perf cycle)
  12. IPC是评价处理器与应用程序性能的重要指标。(很多指令需要多个处理周期才能执行完毕),
  13. IPC越大越好,说明程序充分利用了处理器的特征。
  14. branches:程序在执行期间遇到的分支指令数。
  15. branch-misses:预测错误的分支指令数
  16. cache-misses:cache时效的次数
  17. cache-references:cache的命中次数

  1. perf stat ./a.out

分析程序的整体性能。

–‘-e’: 指定性能事件
–‘-p’: 指定待分析进程的 PID
–‘-t’: 指定待分析线程的 TID

–‘-r N’: 连续分析 N 次
–‘-d’: 全面性能分析,采用更多的性能事件

  1. Develop>perf stat -d -p 6371
  2. ^C
  3. Performance counter stats for process id ‘6371‘:
  4. 12179.626710 task-clock (msec)# 1.248 CPUs utilized [100.00%]
  5. 96673 context-switches # 0.008 M/sec [100.00%]
  6. 0 cpu-migrations # 0.000 K/sec [100.00%]
  7. 32 page-faults # 0.003 K/sec
  8. 20442151906 cycles # 1.678 GHz [29.64%]
  9. <not supported> stalled-cycles-frontend
  10. <not supported> stalled-cycles-backend
  11. 7297770919 instructions # 0.36 insns per cycle [44.12%]
  12. 1236856463 branches # 101.551 M/sec [43.73%]
  13. 61040864 branch-misses # 4.94% of all branches [42.98%] //分支预测失效数。
  14. 3268288054 L1-dcache-loads # 268.341 M/sec [27.91%]
  15. <not supported> L1-dcache-load-misses
  16. 105416823 LLC-loads # 8.655 M/sec [27.47%]
  17. 6321634 LLC-load-misses # 6.00% of all LL-cache hits [28.42%]
  18. 9.758418636 seconds time elapsed //表示采集的时间

对于长驻的进程,可以按Ctrl+C,结束perf,会自动打印信息。


perf top

实时显示系统 / 进程的性能统计信息

–‘-e’: 指定性能事件 ( 默认事件: cycles)
–‘-p’: 指定待分析进程的 PID
–‘-t’: 指定待分析线程的 TID

–‘-a’: 分析整个系统的性能( Default )
–‘-c’: 事件的采样周期
–‘-d’: 界面的刷新周期( Default : 2s )
–‘-E’: 显示的函数条数
–‘-r <priority>’: 将 perf top 作为实时任务,优先级为<priority>
– ‘-K‘: 不显示内核符号
– ‘-U‘: 不显示用户符号

  1. perf top -p 6371-K
  1. PerfTop:7027 irqs/sec kernel:30.8% exact:0.0%[4000Hz cycles],(target_pid:6371)
  2. -----------------------------------------------------------------------------------------------------------------------
  3. 34.03% server [.] dpdk::run_dp_thread(void*)
  4. 16.35% server [.] dpdk::capture::dp_process_cycle()
  5. 10.61% server [.] dpdk::Interface::send_burst()
  6. 9.45% server [.]CQdiscHtb::Dequeue()
  7. 4.34% server [.] update_cconfig_thread_readflag()
  8. 4.33% server [.] update_cconfig_thread_vsys_readflag(unsigned short)
  9. 4.02% server [.] _ZN4dpdk7capture10dp_processEv.clone.47
  10. 3.10% server [.] dpdk::Interface::recv_burst()
  11. 3.08%[vdso][.] __vdso_clock_gettime
  12. 2.65% server [.]CQdiscCtrl::Qos_Stream_Control(rte_mbuf*)
  13. 2.24% server [.] eth_em_recv_scattered_pkts
  14. 1.77% librt-2.15.so [.] clock_gettime
  15. 1.21% server [.] ipflow_new::flow_ha::dequeue()
  16. 0.88% server [.] DP_update_vsys_read_flag()

perf record

记录一段时间内系统/进程的性能事件。

  1. –# perf record [options][<command>]
  2. –# perf record [options]--<command>[options]
  1. –‘-e’:指定性能事件(默认事件: cycles)
  2. –‘-p’:指定待分析进程的 PID
  3. –‘-t’:指定待分析线程的 TID
  4. –‘-a’:分析整个系统的性能(Default)
  5. –‘-c’:事件的采样周期
  6. –‘-o’:指定输出文件(Default: perf.data )
  7. –‘-g’:记录函数间的调用关系
  8. –‘-r <priority>’:将 perf top 作为实时任务,优先级为
  9. <priority>
  10. –‘-u <uid>’:只分析用户<uid>创建的进程

默认在当前目录下生成数据文件:perf.data

  1. perf record -g -e cpu-clock ./a.out

或者

  1. perf record -g -e cpu-clock -p 6371

perf report

读取 perf record 生成的 perf.data 文件,并显示分析数据 .

  1. # perf report [-i <file> | --input=file]
  1. –‘-i’:输入文件名
  2. –‘-v’:显示每个符号的地址
  3. –‘-d <dso>’:只显示指定 dso 的符号
  4. –‘-n’:显示每个符号对应的事件数
  5. –‘-v’:显示每个符号的地址
  6. –‘--comms=<comm>’只显示指定 comm 的信息
  7. –‘-S <symbol name>’只考虑指定符号
  8. –‘-U’只显示已解析的符号
  9. –‘-g [type,min]’按照[type,min]指定的方式显示函数调用图
  10. –‘-g [type,min]’ 按照 [type,min] 指定的方式显示函数
    调用图
    type : flat - 线性展开所有调用链
    graph – 显示调用树,并显示每个调用树对应
    的绝对开销率
    fractal – 显示调用树,并显示每个调用树对应
    的相对开销率
    min :只显示开销率大于 min 的符号 

例如:

  1. perf report -g fractal -i perf.data
  1. # To display the perf.data header info, please use --header/--header-only options.
  2. #
  3. # Samples: 20K of event ‘cpu-clock‘
  4. # Event count (approx.): 5111500000
  5. #
  6. # Children Self Command Shared Object Symbol
  7. # ........ ........ ....... ................. ............................
  8. #
  9. 100.00%0.00% a.out libc-2.15.so [.] __libc_start_main
  10. |
  11. --- __libc_start_main
  12. 100.00%0.00% a.out a.out [.] main
  13. |
  14. --- main
  15. __libc_start_main
  16. 100.00%99.99% a.out a.out [.] test
  17. |
  18. --- test
  19. main
  20. __libc_start_main
  21. 0.00%0.00% a.out [unknown][.]0xec81485354415541
  22. |
  23. ---0xec81485354415541
  24. 0.00%0.00% a.out ld-2.15.so [.]0x0000000000014092
  25. |
  26. ---0x7fd281be9092
  27. 0xec81485354415541
  28. 0.00%0.00% a.out ld-2.15.so [.]0x000000000000325a
  29. |
  30. ---0x7fd281bd825a
  31. 0x7fd281be9092
  32. 0xec81485354415541
  33. 0.00%0.00% a.out [kernel.kallsyms][k]0x0000000000813c8a
  34. |
  35. ---0xffffffff82613c8a
  36. test
  37. main
  38. __libc_start_main
  39. 0.00%0.00% a.out ld-2.15.so [.]0x0000000000016897
  40. |
  41. ---0x7fd281beb897
  42. 0x7fd281bd825a
  43. 0x7fd281be9092
  44. 0xec81485354415541
  45. 0.00%0.00% a.out [kernel.kallsyms][k] smp_apic_timer_interrupt
  46. |
  47. --- smp_apic_timer_interrupt
  48. 0xffffffff82613c8a
  49. test
  50. main
  51. __libc_start_main
  52. 0.00%0.00% a.out [kernel.kallsyms][k]0x0000000000813152

对应测试程序:

  1. #include<stdlib.h>
  2. int test(){
  3. unsignedint i=0;
  4. while(1)
  5. i++;
  6. }
  7. int main(){
  8. test();
  9. }

null

时间: 2024-08-07 18:18:03

perf使用的相关文章

Linux下的两个辅助编程工具 perf 和 GDB

前几天在实验室做了几个小实验,受益匪浅,写代码倒是其次,最重要的是渐渐了解了真实的 计算机科学 工作方式. 很多工作都可以用 linux 下的工具高效完成,例如 要跑一组实验,其中有两个参数变动,那么就不需要手动运行多次,只用一个 Shell Script 就能完成.配合 awk 效率更高. 其中两个工具真得很受用,一个是 GDB, 一个是 perf.前者用于程序调试,后者用于程序性能侦测. GDB 是linux下很出色的调试器, 很多常用的调试工具,例如 breakpoint, call st

perf 工具介绍3

http://blog.chinaunix.net/uid-10540984-id-3854969.html http://blog.csdn.net/zhangskd/article/details/37902159 [[email protected] ~]# perf record -e cpu-clock ./t1 [ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.003

Perf Event :Linux下的系统性能调优工具

Perf Event :Linux下的系统性能调优工具 2011-05-27 10:35 刘 明 IBMDW 字号:T | T Perf Event 是一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护和发展.Perf 不仅可以用于应用程序的性能统计分析,也可以应用于内核代码的性能统计和分析.得益于其优秀的体系结构设计,越来越多的新功能被加入 Perf,使其已经成为一个多功能的性能统计工具集 .本文将介绍 Perf 在应用程序开发上的应用. AD:2014WOT全球软件技术

Perf工具

前段时间Linux下用nmon监控程序的运行,发现CPU的使用率很高,系统态Sys的比例很高.程序的速度不是很快,怀疑和上面的原因有关. 分别使用perf record,perf report和top -H -p,pstack分析发现.2种可能性,跳表skiplist和内存大量分配回收时lru回收,都会用到spin lock自旋锁,导致CPU Sys的使用率很高. 最后替换了跳表skiplist,CPU Sys的使用率很高的问题得以解决. perf工具是Linux自带的性能分析工具,常用的命令:

perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑

该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠.这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要它,下面直接给出该问题的解决思路: 找出不重叠的情况,其他的情况都是重叠的,perf中mmap__overlay函数是这样解决的: int map__overlap(struct map *l, struct map *r) {    if (l->start > r->start) { /

系统级性能分析工具perf的介绍与使用

测试环境:Ubuntu14.04  on VMWare Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化.性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码.代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能. 在性能剖析阶段,需要借助于现有的profiling工具,如perf等.在代码优化阶段往往需要借助开发者的经验,编写简洁高效的代码,甚至在汇编级别合理使用各种指令,合理安排各种指

Linux的系统级性能剖析工具-perf

一直在找个靠谱且易用的性能分析工具,perf 貌似是很符合要求的,先给出阿里整理的几篇文档: Linux的系统级性能剖析工具-perf-1.pdf Linux的系统级性能剖析工具-perf-2.pdf Linux的系统级性能剖析工具-perf-3.pdf Perf在Linux性能评估中的应用_v3.pdf Linux的系统级性能剖析工具-perf,布布扣,bubuko.com

使用perf + FlameGraph生成进程火焰图

FlameGraph代码:https://github.com/cobblau/FlameGraph 使用方法 1,perf record --call-graph dwarf -p 12345 2,perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > process.svg 使用其他工具如何生成火焰图的方法在FlameGraph的Readme只有详细的介绍

玩 perf

有一个进程happy在执行,另一个进程spy发送了一个信号把happy给杀死了 我怎么能通过perf抓到spy进程? happy进程一直执行 在spy进程中调用kill(happy's pid) ,发现了这样一条trace: spy-16049 [000] d... 57919.357992: signal_generate: sig=1 errno=0 code=0 comm=happy pid=15895 grp=1 res=0