perf常用用法简介
perf是linux內(nèi)核自帶的性能分析工具,由于其和對(duì)應(yīng)的內(nèi)核版本同步發(fā)布,不需要單獨(dú)安裝,同時(shí)功能又很強(qiáng)大,因此成為了筆者的主要性能分析工具。本文主要從筆者的實(shí)際使用情況出發(fā),介紹一下perf工具的常用命令和使用場(chǎng)景。
perf常用參數(shù)
-C 指定統(tǒng)計(jì)的CPU核心編號(hào),不指定時(shí)統(tǒng)計(jì)全部核心(等價(jià)于-a)
-e 指定統(tǒng)計(jì)事件
-p 只統(tǒng)計(jì)特定pid指定的進(jìn)程中產(chǎn)生的事件
-t 只統(tǒng)計(jì)特定tid指定的線程中產(chǎn)生的事件
-K 隱藏內(nèi)核中的函數(shù)符號(hào)
-U 隱藏用戶態(tài)的函數(shù)符號(hào)
-g perf record工具專用的參數(shù),記錄函數(shù)的調(diào)用棧信息
其他參數(shù)可以通過man perf-top等命令查看perf工具集的手冊(cè)了解。
perf list
perf list命令可以列出perf支持的內(nèi)置事件列表。輸出的列表如下所示:
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追蹤點(diǎn)事件。后兩種事件都是由內(nèi)核定義的軟件事件,而硬件事件則是由CPU的PMU硬件產(chǎn)生的事件。由于不同的CPU支持的硬件事件各不相同,事件種類很多,因此perf不可能內(nèi)置所有CPU的所有事件,只能包含主流CPU型號(hào)的常用事件。但是perf可以通過參數(shù)-e r$Umask$Event來直接指定硬件事件編號(hào),從而統(tǒng)計(jì)CPU支持的任何硬件事件。在Intel的開發(fā)者手冊(cè)《Intel 64 and IA-32 Architectures Software Developer's Manual》Volume 3的19.1和19.4章節(jié),可以查到PMU支持的所有事業(yè)參數(shù)。在手冊(cè)中可以看到一些事件除了Umask和Event之外,還有cmask,inv,any等參數(shù),這些參數(shù)直接寫在umask和event前面即可。例如cmask=1,inv=1,any=1的010E事件寫成-e r01A0010E即可。在開發(fā)者手冊(cè)第三卷的18.2.1.1節(jié)Architectural Performance Monitoring Version1 Facilities中可以看到事件選擇參數(shù)寄存器的格式定義。
perf stat
perf stat可以用于統(tǒng)計(jì)分析系統(tǒng)或者特定軟件的整體執(zhí)行情況。
$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如上圖所示,在默認(rèn)情況下,perf stat會(huì)統(tǒng)計(jì)cycles、instructions、cache-misses、context-switches等對(duì)系統(tǒng)或軟件性能影響最大的幾個(gè)硬件和軟件事件。通過這些統(tǒng)計(jì)情況,基本上就能了解軟件的運(yùn)行效率是受CPU影響較大還是IO影響較大,是受運(yùn)算指令數(shù)影響較大還是內(nèi)存訪問影響較大。通過指令數(shù)、緩存訪問數(shù)等統(tǒng)計(jì)還能大致判斷軟件性能是否符合對(duì)應(yīng)的功能設(shè)計(jì),是否有代碼級(jí)優(yōu)化的可能。
perf top
perf top可以用于觀察系統(tǒng)和軟件內(nèi)性能開銷最大的函數(shù)列表。通過觀察不同事件的函數(shù)列表可以分析出不同函數(shù)的性能開銷情況和特點(diǎn),判斷其優(yōu)化方向。例如如果某個(gè)函數(shù)在perf top -e instructions中排名靠后,卻在perf top -e cache-misses和perf top -e cycles中排名靠前,說明函數(shù)中存在大量cache-miss造成CPU資源占用較多,就可以考慮優(yōu)化該函數(shù)中的內(nèi)存訪問次數(shù)和策略,來減少內(nèi)存訪問和cache-miss次數(shù),從而降低CPU開銷。
在較新的內(nèi)核版本中,perf top還可以深入到函數(shù)對(duì)應(yīng)的匯編指令中,明確指出是哪些指令占用了計(jì)算資源,可以非常明確的指明軟件性能熱點(diǎn)。
perf record和perf report
perf record一般和perf report搭配使用。perf record可以記錄系統(tǒng)或軟件一段時(shí)間內(nèi)的事件統(tǒng)計(jì)情況,再通過perf report進(jìn)行文本界面的展示。使用perf record可以將時(shí)間段內(nèi)的情況記錄下來,進(jìn)行整個(gè)時(shí)段的分析,或者復(fù)制到其他設(shè)備上做后續(xù)分析,這是其他命令不支持的。perf record還有一個(gè)特別的參數(shù)-g,可以支持記錄函數(shù)的調(diào)用關(guān)系。使用這個(gè)參數(shù),就不止能夠看到性能開銷高的函數(shù)列表,還能看到這些函數(shù)是如何被調(diào)用和使用的。在很多情況下,性能開銷高的函數(shù)都是memcpy之類的系統(tǒng)基礎(chǔ)函數(shù),其本身是沒有什么優(yōu)化空間的,能夠優(yōu)化的是調(diào)用memcpy的方式和次數(shù)。通過perf record -g就能夠分析出這些函數(shù)的調(diào)用關(guān)系,從而找到真正需要優(yōu)化的代碼位置。
總結(jié)
以上是生活随笔為你收集整理的perf常用用法简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iis 10 配置 URL重写不生效
- 下一篇: C++ 多种取整函数的使用和区别: ce