Mac上HomeBrew安裝及換源教程 Mac的Mac OS系統來源於Unix系統,得益於此Mac系統的使用類似於Linux,因此Linux系統中的包管理概念也適用於Mac,而HomeBrew便是其中的一個優秀的包管理工具,而包管理工具是什麼呢?軟體包管理工具,擁有安裝、卸載、更新、查看、搜索等功能 ...
10 火焰圖(flamegraph)
perf火焰圖是一種可視化性能分析工具,它通過將性能數據繪製成一個類似火焰的圖,直觀地展示了程式的調用棧,幫助開發者快速定位性能瓶頸。特點如下:
- 可視化性能數據:火焰圖將性能數據映射到一個二維的圖中,橫軸表示採樣時間,縱軸表示調用棧。
- 火焰形狀:圖中每個矩形代表一個函數調用,矩形的寬度表示該函數占用的時間比例,高度表示調用棧的深度。
- 顏色:火焰圖通常使用熱力圖的顏色來表示性能開銷,紅色表示開銷較大,藍色表示開銷較小。
perf火焰圖的優勢
- 直觀:火焰圖將複雜的性能數據以一種直觀的方式展示出來,讓人一目瞭然。
- 快速定位問題:通過火焰圖,可以快速定位到占用CPU時間最多的函數,從而有針對性地進行優化。
- 深入分析:火焰圖可以展示完整的調用棧,幫助開發者瞭解程式的執行流程,並找到性能瓶頸的根源。
可以使用 flamegraphs 創建用 perf 工具記錄的系統性能數據的可視化效果。
堆棧跟蹤採樣是使用 perf 工具剖析 CPU 性能的常用技術。遺憾的是,使用 perf 分析堆棧跟蹤的結果可能非常冗長,分析起來也非常耗費精力。 flamegraph 是根據 perf 記錄的數據創建的可視化圖形,可以更快、更輕鬆地識別熱門代碼路徑。
10.1 安裝 flamegraphs
# yum install js-d3-flame-graph
# 如果沒有可到此處下載
# wget https://www.rpmfind.net/linux/centos-stream/9-stream/AppStream/aarch64/os/Packages/js-d3-flame-graph-4.0.7-1.el9.noarch.rpm
10.2 在整個系統中創建火焰圖
# perf script flamegraph -a -F 99 sleep 60
------------------------------------------------------------
perf_event_attr:
size 120
{ sample_period, sample_freq } 99
sample_type IP|TID|TIME|CALLCHAIN|ID|CPU|PERIOD
read_format ID
disabled 1
inherit 1
freq 1
precise_ip 3
sample_id_all 1
exclude_guest 1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:
type 1
size 120
config 0x9
{ sample_period, sample_freq } 99
sample_type IP|TID|TIME|CALLCHAIN|ID|CPU|PERIOD
read_format ID
inherit 1
mmap 1
comm 1
freq 1
task 1
sample_id_all 1
mmap2 1
comm_exec 1
ksymbol 1
bpf_event 1
------------------------------------------------------------
------------------------------------------------------------
perf_event_attr:
type 1
size 120
config 0x9
watermark 1
sample_id_all 1
bpf_event 1
{ wakeup_events, wakeup_watermark } 1
------------------------------------------------------------
dumping data to flamegraph.html
10.3 在特定進程上創建 flamegraph
# perf script flamegraph -a -F 99 -p 2041785 sleep 20
10.4 解釋火焰圖
火焰圖中的每個方框代表堆棧中的不同函數。y 軸顯示堆棧的深度,每個堆棧中最頂端的方框代表實際運行在 CPU 上的函數,下麵的所有方框都是其祖先。x 軸顯示的是調用圖採樣數據的群體。
在給定行中,堆棧的子堆棧是根據每個函數的採樣次數按x軸降序顯示的;x 軸並不代表時間的流逝。單個方框越寬,表示在數據採樣時,CPU 上的函數或 CPU 上祖先函數的頻率越高。
要顯示以前可能未顯示的函數名稱併進一步研究數據,請單擊火焰圖中的方框,放大該位置的堆棧:
要返回火焰圖的預設視圖,請單擊 “重置縮放”。
在 flamegraph 中,代表用戶空間函數的方框可能被標記為未知,因為函數的二進位被剝離。必須安裝可執行文件的 debuginfo 包,如果可執行文件是本地開發的應用程式,則必須使用調試信息編譯該應用程式。在這種情況下,使用 GCC 中的 -g 選項來顯示函數名稱或符號。
10.5 利用鯤鵬開發套件命令行工具生成火焰圖
- 下載:
https://www.hikunpeng.com/developer/devkit/download
比如:
# wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng%20DevKit/Kunpeng%20DevKit%2024.0.RC2/DevKit-CLI-24.0.RC2-Linux-Kunpeng.tar.gz
# tar xzvf DevKit-CLI-24.0.RC2-Linux-Kunpeng.tar.gz
# cd DevKit-CLI-24.0.RC2-Linux-Kunpeng
註意X86版本暫時沒有生成火焰圖功能。
- 生成火焰圖
$ sudo ./devkit tuner hotspot -c 0-56 -d 3 -i 1 -o ./hotspot_cpu -g --package --long-name
[sudo] password for test:
Hotspot Summary Report-1 Time:2024/08/29 11:08:51
================================================================================
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Function Cycles Module Cycles(%)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
MX_Sim_Explicit::NodeData::updateVelocity(double, double) [clon 3,353,102,915 /home/projects/maixi/packages/102/packed/lib/libMxSimExplicit.s 56.29
e ._omp_fn.0] o
MX_Sim_Explicit::Hexa1stR::computeHourglassForce(int, double co 674,768,176 /home/projects/maixi/packages/102/packed/lib/libMxSimExplicit.s 11.33
nst (*) [3][8], double const (*) [3][8], int, double const (*) o
[8][8], double (*) [8], double (*) [3][8], double, double (*) [
...
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3044 milliseconds time elapsed
Callstack is saved to ./callstack-20240829-110851.log
Flamegraph is saved to ./Flamegraph-20240829-110851.html
The report ./hotspot_cpu.tar is generated successfully.
To view summary report. you can run: devkit report -i ./hotspot_cpu.tar
To view detail report. you can import the report to the WebUI or IDE to view details.
生成的火焰圖html文件預設生成在用戶所在目錄,火焰圖html文件可使用瀏覽器查看。
參考資料
- 軟體測試精品書籍文檔下載持續更新 https://github.com/china-testing/python-testing-examples 請點贊,謝謝!
- 本文涉及的python測試開發庫 謝謝點贊! https://github.com/china-testing/python_cn_resouce
- python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品書籍下載 https://www.cnblogs.com/testing-/p/17438558.html
- https://medium.com/@techhara/profiling-visualize-program-bottleneck-with-flamegraph-3e0c5855b2fe
- https://github.com/grafana/pyroscope
- https://github.com/flamegraph-rs/flamegraph
- https://crates.io/crates/flamegraph
- https://middleware.io/blog/flame-graphs/
- https://www.hikunpeng.com/document/detail/zh/kunpengdevps/userguide/cliuserguide/KunpengDevKitCli_0065.html
- https://joemario.github.io/blog/2016/09/01/c2c-blog/
- 如需技術支持聯繫釘ding或微信pythontesting , 郵箱: xurongzhong#126.com
10.6 傳統生成火焰圖的方法
https://github.com/flamegraph-rs/flamegraph
# git clone https://github.com/brendangregg/FlameGraph # or download it from github
# cd FlameGraph
# perf record -F 99 -a -g -- sleep 60
# perf script | ./stackcollapse-perf.pl > out.perf-folded
# ./flamegraph.pl out.perf-folded > perf.svg
參考:https://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
這種方式生成的火焰圖沒有搜索功能。
10.7 Rust flamegraph生成火焰圖的方法
https://github.com/flamegraph-rs/flamegraph是Rust開發的火焰圖生成工具
# cargo install flamegraph
# flamegraph --open --cmd "record -g" -- gunzip < cmake-3.19.8-Linux-x86_64.tar.gz > cm
[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 0.690 MB perf.data (4844 samples) ]
會在當前目錄生成flamegraph.svg