前言:
Perf 是Linux kernel自帶的系統性能優化工具。Perf的優勢在於與Linux Kernel的緊密結合,它可以最先應用到加入Kernel的new feature。pef可以用於查看熱點函數,查看cashe miss的比率,從而幫助開發者來優化程序性能,也可以分析程序運行期間發生的硬體事件比如 Page Fault 和進程切換,這使得 Perf 擁有了眾多的性能分析能力 ,比如 instructions retired ,processor clock cycles 等;也可以分析軟體事件。
1.Make Linux_config內 用/搜索Perf_EVENTs,然後找到路徑並勾選上相應功能
2.編譯時所需要的 library
Elfutils => 已經包含在我們的 Toolchain 內
Zlib =>已經包含在我們的 Toolchain 內
Libunwind => 路徑為 code/lib/external, 需要解壓
3.編譯perf 步驟
source build/envsetup.sh; make all
cd code/lib/external/;make libunwind;make install;
cd BSP/linux-kernel/tools/perf
make WERROR=0 LIBUNWIND_DIR=$LIBRARY_DIR/external/__install/;
cp BSP/linux-kernel/tools/perf/perf BSP/root-fs/rootfs/bin
make library; make rootfs; make pack
4.燒錄FW文件後即可使用perf工具
5.常用perf命令
Perf top:檢查當前系統的表現
perf record -e cpu-clock-event :使用perf record記錄特定事件,例如cpu事件
perf report:使用perf report查看perf record記錄的事件
Perf 火焰圖命令
1、 echo 0>/proc/sys/kernel/kptr_restrict(顯示火焰圖內接口)
2、 ./perf_sign record -F 99 -p 2984(進程pid) -g (查看系統內各種占用情況)
或 ./perf_sign record -F 99 -p 2984 (進程pid) -g --call-graph dwarf (跑20s即可)
3、./perf_sign script > out.perf (提取perf 文件 )
4、./stackcollapse-perf.pl ../out.perf > ../out.folded (火焰圖)
5、./flamegraph.pl out.folded > out.svg (火焰圖)
Perf list 使用: sudo perf list
硬體相關的event,cpu-cycles, instructions…etc
cpu-cycles: Running program real clock ticks
kernel相關,像是context-switches, cpu-clock…etc
cpu-clock:運行程序使用的真正時間
page-faults:Page fault will trigger page fault handler to fill tlb info
硬體相關cache event,L1 dcache miss, TLB miss, …
參考文獻: Linux - Perf system analysis.pdf
關於Perf的五個問答
1、為什麼使用perf而不是別的分析工具?
答:因為perf是Linux自帶的系統性能分析工具,perf利用內核中的性能計數器(performance counters)來收集系統的各種性能數據,包括CPU idle 、DDR使用等等。
2、Perf的優點?
答:由於客戶可以直接利用Linux內核的性能計數器,所以perf能夠最先應用到加入kernel的新特性,其他性能分析工具可能需要一段時間才能支持新特性。此外,perf還支持多種硬體平台,有亮良好的可移植性。
3、使用perf需要主義注意哪些問題?
答:perf使用過程中占用性能小較高,在實際生產環境中需要謹慎使用。另外,perf的結果收到整個系統負載、環境等多種因素影響,需要結合實際情況進行判斷。
4、Perf的計數模式和採樣模式有何區別?
答:
計數模式:可以指定要計數的特定性能事件,例如指令的執行數、緩存命中數、分支預測錯誤等。perf會實時監測這些事件的發生次數,並提供相應的計數結果。這樣可以對事件的頻率進行精確的計量,得到準確的計數信息。
採樣模式,同樣可以選擇相同的性能事件來進行採樣以收集數據。採樣會在程序執行過程中間隔一定的時間或事件觸發時等。採樣會提供更詳細的數據,可以用於分析熱點函數、調用關係、性進行,記錄事件發生時的上下文信息,如函數調用堆棧、指令指能瓶頸等。
雖然計數模式和採樣模式可以監測和記錄相同的性能事件,但計數模式提供了精確的事件計數,而採樣模式提供了更豐富的上下文信息。因此,在選擇模式時,需要根據具體的分析需求考慮所需的數據類型和精度。
總結:計數模式和採樣模式可以使用相同的性能事件,但它們所提供的數據類型和分析方式是不同的,具體取決於分析目標和準確度需求。
5、perf使用不同性能事件統計的區別?
答:
- CPU周期數(CPU cycles):這個事件跟蹤了 CPU 執行段。CPU 周期數可以幫助你發現某個程序瓶頸在於執行時間較長的代碼
- 指令數(instructions):這個事件跟蹤了執行的指令數量可以幫助你評估程序的指令級別的性能。指令數高的代碼段可能是CPU 密集型的部分.
- 存相關事件(Cache-related events):包括緩存命中率緩存失效等相關事件。緩存相關事件可以幫助你了解程序對緩存的使用情況,如緩存的命中效率、緩存失效引起的開銷,從而針對性地尤化程序的內存訪問模式。
- 分支預測失誤(Branch mispredictions):這個事件跟蹤分支預測錯誤的次數,分支預測錯誤會導致流水線中斷和指令重排從而影響程序的性能。
- 缺頁中斷(Page faults):這個事件跟蹤了缺頁中斷的次數,缺頁中斷通常表示內存訪問受限,可以用來評估程序的內存訪問模式和資源利用情況。
評論