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參數指定路徑