Linux監控&性能調優分析-perf(3)火焰圖

来源:https://www.cnblogs.com/testing-/p/18385491
-Advertisement-
Play Games

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文件可使用瀏覽器查看。

參考資料

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • Scoop 安裝 環境需求 PowerShell 5 + .NET Framework 4.5 + 安裝 指定安裝位置(配置環境變數) 以管理員身份打開PowerShell $env:SCOOP='D:\Applications\Scoop' [Environment]::SetEnvironmen ...
  • 第二十一章 machine.UART類實驗 1)實驗平臺:正點原子DNK210開發板 2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+ ...
  • 概述 Windows 遠程桌面(也稱為 RDP)允許你從一臺電腦遠程連接到另一臺運行 Windows 操作系統的電腦。 開啟遠程桌面 在“設置”中前往“系統>遠程桌面”,將“遠程桌面”設置為“開”。 確保Windows正確存儲微軟賬號的密碼 絕大多數情況下,我們將使用微軟賬號及其密碼來登錄“遠程 ...
  • liwen01 2024.09.01 前言 最近十幾年,通信技術發展迅猛,通信標準更新頻繁,有的設備還在使用 802.11/b/g/n 協議,有的已支持到 WiFi6、WiFi7。 而國內有關無線 WiFi 的書籍或資料卻很少,就算能找著的,大多也是比較老舊。本文試圖使用最新的數據來介紹 WiFi ...
  • 本章將和大家分享Docker中常用的命令。廢話不多說,下麵我們直接進入主題。 1、配置鏡像加速源 拉取鏡像慢,配置載入鏡像地址: 創建一個或修改 /etc/docker/daemon.json 文件(如果不存在則創建): vim /etc/docker/daemon.json 並添加或修改regis ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...