perf使用


參考:
    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:上下文切換次數,前半部分是切換次數,后面是平均每秒發生次數(M106次方)。
  5. cpu-migrations:處理器遷移,linux為了位置各個處理器的負載均衡,
  6. 會在特定的條件下將某個任務從一個處理器遷往另外一個處理器,此時便是發生了一次處理器遷移。
  7. page-fault:缺頁異常,linux內存管理子系統采用了分頁機制,
  8. 當應用程序請求的頁面尚未建立、請求的頁面不在內存中或者請求的頁面雖在在內存中,
  9. 但是尚未建立物理地址和虛擬地址的映射關系是,會觸發一次缺頁異常。
  10. cycles:任務消耗的處理器周期數
  11. instructions:任務執行期間產生的處理器指令數,IPCinstructions perf cycle
  12. IPC是評價處理器與應用程序性能的重要指標。(很多指令需要多個處理周期才能執行完畢),
  13. IPC越大越好,說明程序充分利用了處理器的特征。
  14. branches:程序在執行期間遇到的分支指令數。
  15. branch-misses:預測錯誤的分支指令數
  16. cache-missescache時效的次數
  17. cache-referencescache的命中次數



  1. perf stat ./a.out
分析程序的整體性能。
‘-e’:  指定性能事件
‘-p’:  指定待分析進程的  PID
‘-t’:  指定待分析線程的  TID 
‘-r 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. }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM