參考文章:
http://blog.itpub.net/24585765/viewspace-2564885/
https://www.cnblogs.com/fattyCoder/p/10167740.html
Perf (Performance Event)是 Linux 系統原生提供的性能分析工具, 會返回 CPU 正在執行的函數名以及調用棧
常用命令:
perf record
記錄信息到perf.data;
perf report
生成報告;
perf diff
對兩個記錄進行diff;
perf evlist
列出記錄的性能事件;
perf annotate
顯示perf.data函數代碼;
perf archive
將相關符號打包,方便在其它機器進行分析;
perf script
將perf.data輸出可讀性文本;
1. 以perf record開始:
perf record -F 99 -a -g -p 1234 -- sleep 30
執行完成后生成perf.data
文件
參數解釋
perf record
: 收集采樣信息,並將其記錄在數據文件中。隨后可通過其它工具對數據文件進行分析。
-F 99
:表示采樣頻率99HZ
-a
: 表示對所有CPU采樣,如果只需針對特定的CPU,可以使用-C
-g
:表示記錄調用棧
-p 1234
:表示要來分析的程序進程號為1234
sleep 30
:表示分析持續30秒
生成火焰圖:
- 獲取 FlameGraph組件
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
- 根據
perf.data
畫圖
perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > perf_your_name.svg
2.perf top: 查看實時信息,類似於linux的top命令,對系統性能進行實時分析。
-g:可以查看堆棧調用
-a:查看所有CPU
perf top -g -p 1234
輸出如下:
按?鍵,輸出如下:
Chlidren
和 Self
的含義
https://nanxiao.me/perf-note-4-profile-application/
如以下代碼,
Self表示函數本身的overhead:如果foo函數的overhead占60%,那么bar的Self overhead就是40%(刨除foo所占部分)。因為foo和bar都是main的子函數,所以二者的overhead都要計算入main的Children overhead。
void foo(void) {
/* do something */
}
void bar(void) {
/* do something */
foo();
}
int main(void) {
bar()
return 0;
}
附錄:
序號 | 命令 | 作用 |
---|---|---|
1 | annotate | 解析perf record生成的perf.data文件,顯示被注釋的代碼。 |
2 | archive | 根據數據文件記錄的build-id,將所有被采樣到的elf文件打包。利用此壓縮包,可以再任何機器上分析數據文件中記錄的采樣數據。 |
3 | bench | perf中內置的benchmark,目前包括兩套針對調度器和內存管理子系統的benchmark。 |
4 | buildid-cache | 管理perf的buildid緩存,每個elf文件都有一個獨一無二的buildid。buildid被perf用來關聯性能數據與elf文件。 |
5 | buildid-list | 列出數據文件中記錄的所有buildid。 |
6 | diff | 對比兩個數據文件的差異。能夠給出每個符號(函數)在熱點分析上的具體差異。 |
7 | evlist | 列出數據文件perf.data中所有性能事件。 |
8 | inject | 該工具讀取perf record工具記錄的事件流,並將其定向到標准輸出。在被分析代碼中的任何一點,都可以向事件流中注入其它事件。 |
9 | kmem | 針對內核內存(slab)子系統進行追蹤測量的工具 |
10 | kvm | 用來追蹤測試運行在KVM虛擬機上的Guest OS。 |
11 | list | 列出當前系統支持的所有性能事件。包括硬件性能事件、軟件性能事件以及檢查點。 |
12 | lock | 分析內核中的鎖信息,包括鎖的爭用情況,等待延遲等。 |
13 | mem | 內存存取情況 |
14 | record | 收集采樣信息,並將其記錄在數據文件中。隨后可通過其它工具對數據文件進行分析。 |
15 | report | 讀取perf record創建的數據文件,並給出熱點分析結果。 |
16 | sched | 針對調度器子系統的分析工具。 |
17 | script | 執行perl或python寫的功能擴展腳本、生成腳本框架、讀取數據文件中的數據信息等。 |
18 | stat | 執行某個命令,收集特定進程的性能概況,包括CPI、Cache丟失率等。 |
19 | test | perf對當前軟硬件平台進行健全性測試,可用此工具測試當前的軟硬件平台是否能支持perf的所有功能。 |
20 | timechart | 針對測試期間系統行為進行可視化的工具 |
21 | top | 類似於linux的top命令,對系統性能進行實時分析。 |
22 | trace | 關於syscall的工具。 |
23 | probe | 用於定義動態檢查點。 |
注:
sudo perf record -F 99 -a -g -p 118521 -- sleep 30
Warning:
PID/TID switch overriding SYSTEMPermission error mapping pages.
Consider increasing /proc/sys/kernel/perf_event_mlock_kb,
or try again with a smaller value of -m/--mmap_pages.
(current value: -1)
sleep: Terminated
增加參數: -m 2后解決
sudo perf record -F 99 -a -g -m 2 -p 118521 -- sleep 30