歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> perf學習-linux自帶性能分析工具

perf學習-linux自帶性能分析工具

日期:2017/3/1 15:53:53   编辑:關於Linux
perf學習-linux自帶性能分析工具 什麼是perf? linux性能調優工具,32內核以上自帶的工具,軟件性能分析。在2.6.31及後續版本的Linux內核裡,安裝perf非常的容易。 幾乎能夠處理所有與性能相關的事件。 什麼是性能事件? 指在處理器或者操作系統中發生,可能影響到程序性能的硬件事件或者軟件事情。 主要關注點在哪裡? 算法優化(空間復雜度、時間復雜度)、代碼優化(提到執行速度、減少內存占用) 評估程序對硬件資源的使用情況,例如各級cache的訪問次數,各級cache的丟失次數、流水線停頓周期、前端總線訪問次數等。 評估程序對操作系統資源的使用情況,系統調用次數、上下文切換次數、任務遷移次數。 基本原理? 硬件的話采用PMC(performance monitoring unit)CPU的部件,在特定的條件下探測的性能事件是否發生以及發生的次數。 軟件性能測試,內置於kernel,分布在各個功能模塊中,統計和操作系統相關性能事件。 如何使用高精度的采樣? 如果需要采用高精度的采樣,需要在制定性能事情時,在事件後添加後綴“:p”或者“:pp” 0:無精度保證 1:采樣指令好觸發性能時間的指令偏差為常數(:p) 2:盡量保證偏差為0(:pp) 3:保證偏差必須為0(:ppp) 有哪些常用的命令? 1、perf list 列出所有能夠觸發perf采樣點的事件(當前硬件環境支持的性能事件) 總體分為三類hardware(硬件產生)、software(內核軟件產生)、tradepoint(內核中靜態tracepoint觸發事件)。 List of pre-defined events (to be used in -e): cpu-cycles OR cycles [Hardware event]處理器周期事件 stalled-cycles-frontend OR idle-cycles-frontend [Hardware event] stalled-cycles-backend OR idle-cycles-backend [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] LLC-load-misses [Hardware cache event] LLC-stores [Hardware cache event] LLC-store-misses [Hardware cache event] LLC-prefetches [Hardware cache event] LLC-prefetch-misses [Hardware cache event] dTLB-loads [Hardware cache event] dTLB-load-misses [Hardware cache event] dTLB-stores [Hardware cache event] dTLB-store-misses [Hardware cache event] dTLB-prefetches [Hardware cache event] dTLB-prefetch-misses [Hardware cache event] iTLB-loads [Hardware cache event] iTLB-load-misses [Hardware cache event] branch-loads [Hardware cache event] branch-load-misses [Hardware cache event] 2、perf stat分析程序的整體性能 利用10個典型事件剖析了應用程序。 task-clock:目標任務真真占用處理器的時間,單位是毫秒,我們稱之為任務執行時間, 後面是任務的處理器占用率(執行時間和持續時間的比值) 持續時間值從任務提交到任務結束的總時間(總時間在stat結束之後會打印出來)。 context-switches:上下文切換次數,前半部分是切換次數,後面是平均每秒發生次數(M是10的6次方)。 cpu-migrations:處理器遷移,linux為了位置各個處理器的負載均衡, 會在特定的條件下將某個任務從一個處理器遷往另外一個處理器,此時便是發生了一次處理器遷移。 page-fault:缺頁異常,linux內存管理子系統采用了分頁機制, 當應用程序請求的頁面尚未建立、請求的頁面不在內存中或者請求的頁面雖在在內存中, 但是尚未建立物理地址和虛擬地址的映射關系是,會觸發一次缺頁異常。 cycles:任務消耗的處理器周期數 instructions:任務執行期間產生的處理器指令數,IPC(instructions perf cycle) IPC是評價處理器與應用程序性能的重要指標。(很多指令需要多個處理周期才能執行完畢), IPC越大越好,說明程序充分利用了處理器的特征。 branches:程序在執行期間遇到的分支指令數。 branch-misses:預測錯誤的分支指令數 cache-misses:cache時效的次數 cache-references:cache的命中次數 常用的參數如下 -e,指定性能事件 -p,指定分析進程的PID -t,指定待分析線程的TID -r N,連續分析N次 -d,全面性能分析,采用更多的性能事件 一次分析後的結果如下: Performance counter stats for process id '21787': 42677.253367 task-clock # 0.142 CPUs utilized 587,906 context-switches # 0.014 M/sec 29,209 CPU-migrations # 0.001 M/sec 117 page-faults # 0.000 M/sec 82,341,400,508 cycles # 1.929 GHz [83.48%] 61,262,984,952 stalled-cycles-frontend # 74.40% frontend cycles idle [83.28%] 43,113,701,768 stalled-cycles-backend # 52.36% backend cycles idle [66.72%] 44,023,301,495 instructions # 0.53 insns per cycle # 1.39 stalled cycles per insn [83.50%] 8,137,448,528 branches # 190.674 M/sec [83.22%] 430,957,756 branch-misses # 5.30% of all branches [83.34%] 300.393753095 seconds time elapsed 3、perf top實時顯示系統/進程的性能統計信息 默認性能事件“cycles CPU周期數”進行全系統的性能剖析 常見的參數如下: -p:指定進程PID -t:指定線程的TID -a:分析整個系統的性能(默認) -d:界面刷新周期,默認是2秒 結果輸出中,比例是該符號引發的性能時間在整個監測域中占的比例,通常稱為熱度。 samples pcnt function DSO _______ _____ ______________________________________________________________________________________ _________ 61.00 19.4% native_write_msr_safe [kernel] 18.00 5.7% JVM_InternString libjvm.so 17.00 5.4% find_busiest_group [kernel] 17.00 5.4% _spin_lock [kernel] 12.00 3.8% dev_hard_start_xmit [kernel] 11.00 3.5% tg_load_down [kernel] 9.00 2.9% futex_wake [kernel] 8.00 2.5% do_futex [kernel] 7.00 2.2% load_balance_fair [kernel] 7.00 2.2% weighted_cpuload [kernel] 7.00 2.2% update_cfs_shares [kernel] 7.00 2.2% JVM_LatestUserDefinedLoader libjvm.so 6.00 1.9% update_cfs_load [kernel] 5.00 1.6% _ZN16SystemDictionary30resolve_instance_class_or_nullE12symbolHandle6HandleS1_P6Thread libjvm.so 5.00 1.6% br_sysfs_delbr [bridge] 5.00 1.6% futex_wait [kernel] 4、perf record/report記錄一段時間內系統/進程的性能事件 默認在當前目錄下生成數據文件:perf.data report讀取生成的perf.data文件,-i參數指定路徑
Copyright © Linux教程網 All Rights Reserved