1. 程式人生 > >perf命令

perf命令

scrip foo 分析 red 上下文 添加 對象 epo -c

@(Linux基礎)[perf命令]
perf命令
----

簡介

Perf是內置於Linux內核源碼樹中的性能剖析(profiling)工具,它基於事件采樣原理,以性能事件為基礎,支持針對處理器相關性能指標與操作系統相關性能指標的性能剖析,常用於性能瓶頸的查找與熱點代碼的定位。

通過它,應用程序可以利用 PMU,tracepoint 和內核中的特殊計數器來進行性能統計。它不但可以分析指定應用程序的性能問題 (per thread),也可以用來分析內核的性能問題,當然也可以同時分析應用代碼和內核,從而全面理解應用程序中的性能瓶頸。

使用 perf,您可以分析程序運行期間發生的硬件事件,比如 instructions retired ,processor clock cycles 等;您也可以分析軟件事件,比如 Page Fault 和進程切換。這使得 Perf 擁有了眾多的性能分析能力,舉例來說,使用 Perf 可以計算每個時鐘周期內的指令數,稱為 IPC,IPC 偏低表明代碼沒有很好地利用 CPU。Perf 還可以對程序進行函數級別的采樣,從而了解程序的性能瓶頸究竟在哪裏等等。Perf 還可以替代 strace,可以添加動態內核 probe 點,還可以做 benchmark 衡量調度器的好壞。

perf命令

性能調優工具如 perf,Oprofile 等的基本原理都是對被監測對象進行采樣,最簡單的情形是根據 tick 中斷進行采樣,即在 tick 中斷內觸發采樣點,在采樣點裏判斷程序當時的上下文。假如一個程序 90% 的時間都花費在函數 foo() 上,那麽 90% 的采樣點都應該落在函數 foo的上下文中。只要采樣頻率足夠高,采樣時間足夠長,那麽以上推論就比較可靠。因此,通過 tick 觸發采樣,我們便可以了解程序中哪些地方最耗時間,從而重點分析。

perf list

功能: 查看當前軟硬件環境、支持的性能事件。

查看所有分類事件的個數:

perf list | awk -F: '/Tracepoint event/ { lib[$1]++ } END { for (l in lib) { printf " %-16s %d\n", l, lib[l] } }'
| sort | column

性能事件分類

  • 硬件性能事件
  • 軟件性能事件
  • tracepoint event

hw:Hardware event,9個
sw:Software event,9個
cache:Hardware cache event,26個

tracepoint:Tracepoint event,775個
說明:
hw和cache是由 PMU 硬件產生的事件,比如 cache 命中,當您需要了解程序對硬件特性的使用情況時,便需要對這些事件進行采樣

sw 是內核軟件產生的事件,比如進程切換,tick 數等,與硬件無關
tracepoint是內核中的靜態 tracepoint 所觸發的事件,這些 tracepoint 用來判斷程序運行期間內核的行為細節,比如 slab 分配器的分配次數等。

提示:這裏的event是預定義,可以通過perf list命令列出所有的預定義event。

perf stat

功能:分析程序的整體性能
示例:

perf stat -e task-clock ./a.out # 分析 task-clock 事件
perf stat -p 31317 # 分析 31317 進程
perf stat -t 31318 # 分析 31318 線程
perf stat -r 5 ./a.out # 分析 5 次就停止
perf stat -d ./a.out # 全面分析

perf top

功能:實時顯示系統/進程的性能統信息
示例:

perf top -a -p 31317 # 分析整個 31317 進程的性能
perf top -n -p 31317 # 顯示事件數量
perf top --show-total-period -p 31317 # 累計事件個數
perf top -G

界面解釋:

第一列: 性能事件在整個檢測域中占的比例,符號的 熱度
第二列: 符號所在 DSO(Dynamic Shared Object)
第三列: DSO 類型(ELF可執行文件,動態鏈接庫,內核,內核模塊,VDSO 等)
第四列: 符號名(函數名)

perf record/report

功能:

record: 記錄一段時間內系統/進程的性能事件,生成 perf.data 文件
report: 讀取 perf.data 文件,並顯示分析數據

示例:

perf record -g -p 31655  # 記錄一段時間的 zone_server 性能事件
perf report           # 得到分析結果
perf report -n        # 顯示對應時間的調用次數
perf report -v        # 顯示每個符號的地址
perf report -g flat,5%    #
perf report -g graph,5%   #
perf report -g fractal,5% #

perf timechart

功能: 將系統的運行狀態以 SVG 圖的形式輸出。
各處理器狀態(run, idle)
各進程的時間圖譜(run, sleep, blocked ...)
示例:

perf timechart record -p 31655

perf script

功能: 查看 perf 數據文件 (perf.data)
示例

perf script -l # 查看當前系統中可擴展腳本
perf script syscall-count # 查看系統調用被調度次數
perf script sctop # 實時查看各個系統調用被調用的次數

perf命令