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.datareport讀取產生的perf.data檔案,-i參數指定路徑