@(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 # 實時查看各個系統調用被調用的次數