Perf性能分析工具

Perf全名是Performance Event,是在Linux 2.6.31 以後內建的系統效能分析工具,它隨着核心一併釋出。藉由perf,應用程式可以利用PMU (Performance Monitoring Unit), tracepoint 和核心內部的特殊計數器(counter) 來進行統計,另外還能同時分析運行中的核心程式碼,從而更全面瞭解應用程式中的效能瓶頸。

相較於OProfile和GProf,perf 的優勢在於與Linux Kernel 緊密結合,並可受益於最先納入核心的新特徵。perf 基本原理是對目標進行取樣,紀錄特定的條件下所偵測的事件是否發生以及發生的次數。例如根據tick 中斷進行取樣,即在tick 中斷內觸發取樣點,在取樣點裏判斷行程(process) 當時的context。假如一個行程90% 的時間都花費在函式foo() 上,那麼90% 的取樣點都應該落在函式foo() 的上下文中。

Perf 可取樣的事件非常多,可以分析Hardware event,如cpu-cycles、instructions 、cache-misses、branch-misses …等等。可以分析Software event,如page-faults、context-switches …等等,另外一種就是Tracepoint event。知道了cpu-cycles、instructions 我們可以瞭解Instruction per cycle 是多少,進而判斷程式碼有沒有好好利用CPU,cache-misses 可以曉得是否有善用Locality of reference ,branch-misses 多了是否導致嚴重的pipeline hazard ?另外Perf 還可以對函式進行採樣,瞭解效能卡在哪邊。

安裝
首先利用以下指令查看目前的Kernel config 有沒有啓用Perf。如果PC 上是裝一般Linux distro,預設值應該都有開啓。
$ cat "/boot/config-`uname -r`" | grep "PERF_EVENT"
前面講到,perf 是Linux 內建支持的效能優化工具,在2.6.31 版本之後,我們可以直接到Linux Kernel Archives下載對應版本的程式碼,解壓縮後到tools/perf裏面去編譯,通常過程中會有相依的套件需要安裝,依指示完成安裝後,編譯即可成功,最後再把編譯完成的perf 移至 中/usr/bin就可以使用了。這種方法通常適用於更新過kernel 的使用者,因爲更新過kernel 後會造成distribution package 與kernel version 不相符。一般使用者採用第二種方法即可。

使用apt-get 進行安裝。

$ sudo apt-get install linux-tools-common
接着輸入perf list 或perf top 檢查一下perf 可不可以使用。
如果出現以下的信息,表示還漏了些東西。

WARNING: perf not found for kernel 3.16.0-50
You may need to install the following packages for this specific kernel:
linux-tools-3.16.0-50-generic
linux-cloud-tools-3.16.0-50-generic
上面的Kernel 版本可能和你不一樣,根據指示安裝起來即可。不放心的話可以使用$ uname -r確認。

$ sudo apt-get install linux-tools-3.16.0-50-generic linux-cloud-tools-3.16.0-50-generic
到這裏perf 的安裝就完成了。不過這裏我再稍微補充一下,如果你不是切換到root 的情況下輸入
$ perf top

kernel.perf_event_paranoid 是用來決定你在沒有root 權限下(Normal User) 使用perf 時,你可以取得哪些event data。預設值是1 ,你可以輸入

$ cat /proc/sys/kernel/perf_event_paranoid
來查看權限值。一共有四種權限值:

2: 不允許任何量測。但部份用來查看或分析已存在的紀錄的指令仍可使用,如perf ls、perf report、perf timechart、 perf trace。

1: 不允許CPU events data。但可以使用perf stat、perf record 並取得Kernel profiling data。

0: 不允許raw tracepoint access。但可以使用perf stat、perf record 並取得CPU events data。

-1: 權限全開。

最後如果要檢測cache miss event ,需要先取消kernel pointer 的禁用。

$ sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"

perf top -p $pid


Perf 能觸發的事件分爲三類:

hardware : 由PMU 產生的事件,比如cache-misses、cpu-cycles、instructions、branch-misses …等等,通常是當需要了解程序對硬體特性的使用情況時會使用。

software : 是核心程式產生的事件,比如context-switches、page-faults、cpu-clock、cpu-migrations …等等。

tracepoint : 是核心中的靜態tracepoint 所觸發的事件,這些tracepoint 用來判斷在程式執行時期,核心的行爲細節,比如slab 記憶體配置器的配置次數等。

Perf 包含20 幾種子工具集
perf top 其實跟平常Linux 內建的top 指令很相似。它能夠「即時」的分析各個函式在某個event 上的熱點,找出拖慢系統的兇手,就如同上面那個範例一樣。甚至,即使沒有特定的程序要觀察,你也可以直接下達$ perf top指令來觀察是什麼程序喫掉系統效能,導致系統異常變慢。
可以發現紅色熱點就出現了。右邊第一列爲各函式的符號,左邊第一行是該符號引發的event 在整個「監視域」中佔的比例,我們稱作該符號的熱度,監視域指的是perf 監控的所有符號,預設值包括系統所有程序、核心以及核心module 的函式,左邊第二行則爲該符號所在的Shared Object 。若符號旁顯示[.]表示其位於User mode,[k]則爲kernel mode。

perf stat
相較於top,使用perf stat 往往是你已經有個要優化的目標,對這個目標進行特定或一系列的event 檢查,進而瞭解該程序的效能概況。(event 沒有指定的話,預設會有十種常用event。)

$ perf stat --repeat 5 -e cache-misses,cache-references,instructions,cycles ./perf_stat_cache_miss
--repeat <n>或是-r <n>可以重複執行n 次該程序,並顯示每個event 的變化區間。cache-misses,cache-references和instructions,cycles類似這種成對的event,若同時出現perf 會很貼心幫你計算比例。

根據這次perf stat 結果可以明顯發現程序有很高的cache miss,連帶影響IPC 只有0.65。

perf record & perf report 有別於stat,record 可以針對函式級別進行event 統計,方便我們對程序「熱點」作更精細的分析和優化。我們來對以下程式,使用perf record 進行branch 情況分析

$ perf record -e branch-misses:u,branch-instructions:u ./perf_record_example
$ perf report
:u是讓perf 只統計發生在user space 的event。最後可以觀察到迴圈展開前後branch-instructions 的差距。

另外,使用record 有可能會碰到的問題是取樣頻率太低,有些函式的訊息沒有沒顯示出來(沒取樣到),這時可以使用來調高取樣頻率,可以輸入以下查看最大值,要-F <frequcncy>更改也沒問題,但能調到多大可能還要查一下。
$ cat /proc/sys/kernel/perf_event_max_sample_rate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章