perf常用用法簡介
perf是linux核心自帶的效能分析工具,由於其和對應的核心版本同步釋出,不需要單獨安裝,同時功能又很強大,因此成為了筆者的主要效能分析工具。本文主要從筆者的實際使用情況出發,介紹一下perf工具的常用命令和使用場景。
perf常用引數
-C 指定統計的CPU核心編號,不指定時統計全部核心(等價於-a)
-e 指定統計事件
-p 只統計特定pid指定的程序中產生的事件
-t 只統計特定tid指定的執行緒中產生的事件
-K 隱藏核心中的函式符號
-U 隱藏使用者態的函式符號
-g perf record工具專用的引數,記錄函式的呼叫棧資訊
其他引數可以通過man perf-top等命令檢視perf工具集的手冊瞭解。
perf list
perf list命令可以列出perf支援的內建事件列表。輸出的列表如下所示:
List of pre-defined events (to be used in -e): cpu-cycles OR cycles [Hardware event] instructions [Hardware event] … cpu-clock [Software event] task-clock [Software event] context-switches OR cs [Software event] … ext4:ext4_allocate_inode [Tracepoint event] kmem:kmalloc [Tracepoint event] module:module_load [Tracepoint event] workqueue:workqueue_execution [Tracepoint event] sched:sched_{wakeup,switch} [Tracepoint event] syscalls:sys_{enter,exit}_epoll_wait [Tracepoint event] …
可以看到事件分為三類:Hardware event硬體事件、Software event軟體事件和Tracepoint event追蹤點事件。後兩種事件都是由核心定義的軟體事件,而硬體事件則是由CPU的PMU硬體產生的事件。由於不同的CPU支援的硬體事件各不相同,事件種類很多,因此perf不可能內建所有CPU的所有事件,只能包含主流CPU型號的常用事件。但是perf可以通過引數-e r$Umask$Event來直接指定硬體事件編號,從而統計CPU支援的任何硬體事件。在Intel的開發者手冊《Intel 64 and IA-32 Architectures Software Developer's Manual》Volume 3的19.1和19.4章節,可以查到PMU支援的所有事業引數。在手冊中可以看到一些事件除了Umask和Event之外,還有cmask,inv,any等引數,這些引數直接寫在umask和event前面即可。例如cmask=1,inv=1,any=1的010E事件寫成-e r01A0010E即可。在開發者手冊第三卷的18.2.1.1節Architectural Performance Monitoring Version1 Facilities中可以看到事件選擇引數暫存器的格式定義。
perf stat
perf stat可以用於統計分析系統或者特定軟體的整體執行情況。
$perf stat ./t1
Performance counter stats for './t1':
262.738415 task-clock-msecs # 0.991 CPUs
2 context-switches # 0.000 M/sec
1 CPU-migrations # 0.000 M/sec
81 page-faults # 0.000 M/sec
9478851 cycles # 36.077 M/sec (scaled from 98.24%)
6771 instructions # 0.001 IPC (scaled from 98.99%)
111114049 branches # 422.908 M/sec (scaled from 99.37%)
8495 branch-misses # 0.008 % (scaled from 95.91%)
12152161 cache-references # 46.252 M/sec (scaled from 96.16%)
7245338 cache-misses # 27.576 M/sec (scaled from 95.49%)
0.265238069 seconds time elapsed
如上圖所示,在預設情況下,perf stat會統計cycles、instructions、cache-misses、context-switches等對系統或軟體效能影響最大的幾個硬體和軟體事件。通過這些統計情況,基本上就能瞭解軟體的執行效率是受CPU影響較大還是IO影響較大,是受運算指令數影響較大還是記憶體訪問影響較大。通過指令數、快取訪問數等統計還能大致判斷軟體效能是否符合對應的功能設計,是否有程式碼級優化的可能。
perf top
perf top可以用於觀察系統和軟體內效能開銷最大的函式列表。通過觀察不同事件的函式列表可以分析出不同函式的效能開銷情況和特點,判斷其優化方向。例如如果某個函式在perf top -e instructions中排名靠後,卻在perf top -e cache-misses和perf top -e cycles中排名靠前,說明函式中存在大量cache-miss造成CPU資源佔用較多,就可以考慮優化該函式中的記憶體訪問次數和策略,來減少記憶體訪問和cache-miss次數,從而降低CPU開銷。
在較新的核心版本中,perf top還可以深入到函式對應的彙編指令中,明確指出是哪些指令佔用了計算資源,可以非常明確的指明軟體效能熱點。
perf record和perf report
perf record一般和perf report搭配使用。perf record可以記錄系統或軟體一段時間內的事件統計情況,再通過perf report進行文字介面的展示。使用perf record可以將時間段內的情況記錄下來,進行整個時段的分析,或者複製到其他裝置上做後續分析,這是其他命令不支援的。perf record還有一個特別的引數-g,可以支援記錄函式的呼叫關係。使用這個引數,就不止能夠看到效能開銷高的函式列表,還能看到這些函式是如何被呼叫和使用的。在很多情況下,效能開銷高的函式都是memcpy之類的系統基礎函式,其本身是沒有什麼優化空間的,能夠優化的是呼叫memcpy的方式和次數。通過perf record -g就能夠分析出這些函式的呼叫關係,從而找到真正需要優化的程式碼位置。