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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...