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就能夠分析出這些函數的調用關系,從而找到真正需要優化的代碼位置。
總結
以上是生活随笔為你收集整理的perf常用用法简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iis 10 配置 URL重写不生效
- 下一篇: URL重写实现会话跟踪