linux火焰圖

火焰圖簡介

火焰圖是一種性能分析的可視化工具,它將CPU的調用棧(Call Stack)信息以矩形火焰的形式展現出來。

  • Y軸:代表調用棧的深度(函數A調用了函數B,B就疊在A上面)。

  • X軸:代表CPU的抽樣次數。一個函數在X軸上占據的寬度越長,就代表它(或它調用的子函數)消耗的CPU時間越多。

我們的目標就是找到那些又寬又平的“火焰山頂”,它們就是CPU占用過高的元兇。

流程一:準備工作 (安裝工具與依賴)

我們需要安裝 perf 工具、從GitHub上下載火焰圖的生成腳本,并且為了分析內核函數,還需要安裝內核的調試符號。

1.安裝 perf 工具

在 CentOS 7 上:

sudo yum install perf -y

在 Ubuntu 上:

sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r) -y

2.安裝內核調試符號 (非常關鍵!) 沒有這個,您在火焰圖里看到的內核函數名將是一堆看不懂的內存地址。

在 CentOS 7 上:

首先需要啟用debuginfo倉庫:

sudo yum install -y yum-utils
sudo debuginfo-install --enablerepo=base-debuginfo kernel-$(uname -r)

如果找不到,可能需要編輯 /etc/yum.repos.d/CentOS-Debuginfo.repo 文件,將 enabled=0 改為 enabled=1

在 Ubuntu 上:

需要添加一個專門的ddebs倉庫:

# 此處以
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-proposed main restricted universe multiverse
EOFsudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622
sudo apt update
sudo apt install linux-image-$(uname -r)-dbgsym -y

3.下載火焰圖生成腳本 這是由性能大神Brendan Gregg開發的Perl腳本集。

# 安裝 git
sudo yum install git -y  # CentOS
# sudo apt install git -y   # Ubuntugit clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph

(這些是Perl腳本,Linux系統通常已自帶Perl解釋器,無需額外安裝)

流程二:采集性能數據

現在,我們使用 perf 來記錄一段時間內系統范圍的CPU調用棧信息。

檢查權限設置(可選) 查看 perf_event_paranoid 的設置,如果值大于1,可能會限制非root用戶使用perf。我們用sudo運行,通常沒問題。

cat /proc/sys/kernel/perf_event_paranoid

執行 perf record 命令復現CPU占用過高的場景時,執行以下命令,讓它在后臺采集60秒的數據。

# -F 99: 以99赫茲的頻率采樣CPU(避免與系統定時器同步)
# -a: 采集所有CPU
# -g: 記錄調用圖(調用棧)
# --call-graph dwarf: 使用DWARF格式記錄調用棧,對內核函數分析更準確
# sleep 60: 讓perf持續采集60秒。在這60秒內,您需要盡量讓問題復現。
sudo perf record -F 99 -ag --call-graph dwarf -- sleep 60

命令執行結束后,當前目錄下會生成一個名為 perf.data 的文件,這就是我們的原始數據。

流程三:生成火焰圖

我們使用FlameGraph目錄下的兩個腳本,分兩步處理 perf.data 文件。

折疊調用棧 (Collapse Stacks) 此步驟將 perf 的輸出轉換成火焰圖腳本認識的格式。

# 確保您當前在 FlameGraph 目錄下
sudo perf script | ./stackcollapse-perf.pl > out.perf-folded

執行后會生成一個 out.perf-folded 文件。

生成SVG火焰圖 這是最后一步,將折疊后的數據渲染成一個可交互的SVG圖片。

./flamegraph.pl out.perf-folded > kernel_cpu.svg

執行后,您會得到一個名為 kernel_cpu.svg 的文件。這就是最終的火焰圖!

流程四:交互式分析

查看火焰圖 將生成的 kernel_cpu.svg 文件從虛擬機中下載到您本地的電腦上(可以通過Termius的SFTP功能或scp命令)。然后,用您的網頁瀏覽器(如Chrome或Firefox)打開它。

如何解讀與交互

看寬度:火焰圖從下往上看。最底層的 all 代表總采樣。越往上,函數調用棧越深。任何一層,一個函數方塊的寬度代表了它在CPU上出現的時間占比。我們的目標就是尋找那些頂層“又寬又平”的山頂(plateau)

看顏色:顏色本身沒有特殊含義,只是為了區分不同的函數。

交互-懸停:將鼠標懸停在任何一個方塊上,瀏覽器左下角會顯示完整的函數名、采樣占比等詳細信息。

交互-點擊這是最重要的交互! 當您點擊任何一個方塊時,整個火焰圖會以此方塊為頂層進行“縮放”,讓您能清晰地看到是哪些子函數導致了這個函數的CPU占用。您可以層層深入,探究問題的根源。

分析內核態CPU占用過高時,您需要重點關注那些函數名中帶有 [k] 標記、或者名字是內核API(如copy_page, ext4_, tcp_, schedule, kvm_等)的寬大方塊。 通過點擊它們,您就能追溯出是哪個系統調用路徑導致了大量的內核CPU消耗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91771.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解剖 .NET 經典:從 Component 到 BackgroundWorker

1?? 背景與定位在 .NET Framework 2.0 時代&#xff0c;微軟引入了 BackgroundWorker 來解決 WinForm/WPF 場景下“耗時操作阻塞 UI 線程”的問題&#xff1b;而 Component 早在 1.0 就已存在&#xff0c;是所有可視化/非可視化設計器的“基類”。理解這兩者的源碼與機制&…

桌面端界面設計 |貨物 TMS 系統 - SaaS UI UX 設計:審美積累之境

在物流數字化的浪潮中&#xff0c;貨物 TMS 系統的 SaaS 化與 UI/UX 設計正構建著獨特的審美坐標系。這不僅是技術與功能的融合&#xff0c;更是一場關于效率美學的深度探索&#xff0c;為行業審美積累注入了鮮活的實踐樣本。SaaS 模式賦予貨物 TMS 系統輕盈而強大的特質&#…

多架構鏡像整合全攻略:在Docker中實現單一鏡像支持同時支持amd64和arm64架構

多架構支持的挑戰 &#xff1a;隨著異構計算&#xff08;如 ARM、x86、RISC-V 等&#xff09;的普及&#xff0c;開發者需要為不同硬件平臺提供對應的鏡像&#xff0c;傳統方式需維護多個版本&#xff08;如 image:v1-amd64 和 image:v1-arm64 &#xff09;&#xff0c;導致版本…

Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i

回顧 sort sort [選項] 文件-u&#xff1a;唯一&#xff0c;去除重復 -r:按數字大小&#xff0c;倒序排序&#xff0c;大到小 -o:輸出文件 -n:按數字大小&#xff0c;順序排序&#xff0c;小到大 -t: -t后加分割符&#xff0c;按分割符為標準&#xff0c;進行篩選 -k:k后加數字…

力扣457:環形數組是否存在循環

力扣457:環形數組是否存在循環題目思路代碼題目 存在一個不含 0 的 環形 數組 nums &#xff0c;每個 nums[i] 都表示位于下標 i 的角色應該向前或向后移動的下標個數&#xff1a; 如果 nums[i] 是正數&#xff0c;向前&#xff08;下標遞增方向&#xff09;移動 |nums[i]| 步…

在 Elasticsearch 中落地 Learning to Rank(LTR)

1 為什么要引入 LTR&#xff1f; 常規檢索&#xff08;BM25、語義檢索、Hybrid、RRF …&#xff09;往往只能基于少量信號&#xff08;關鍵詞命中、向量相似度&#xff09;排序。 Learning-to-Rank 通過機器學習模型把多維度特征&#xff08;文檔屬性、查詢屬性、查詢-文檔相關…

Socket編程——TCP協議

文章目錄一、TCP傳輸二、相關接口三、多進程版本四、多線程版本一、TCP傳輸 TCP和UDP類似&#xff0c;但是在傳輸中TCP有輸入&#xff0c;輸出緩沖區&#xff0c;看下面的傳輸圖片 可以理解為TCP之間的數據傳輸都是依賴各自的socket&#xff0c;socket就充當傳輸的中介吧。 而…

GitHub使用小記——本地推送、外部拉取和分支重命名

GitHub 項目推送與拉取等操作使用隨記 本小記適用于個人項目或組織項目&#xff0c;涵蓋 GitHub 推送、拉取、分支管理、.gitignore 設置等常見需求。 1. 將已有本地工程推送至 GitHub 新倉庫 1.1 前提條件 本地項目結構完整&#xff0c;已準備好&#xff1b;本地已安裝 Git…

RabbitMQ 延時隊列插件安裝與使用詳解(基于 Delayed Message Plugin)

RabbitMQ 延時隊列插件安裝與使用詳解&#xff08;基于 Delayed Message Plugin&#xff09;&#x1f4cc; 一、什么是 RabbitMQ 延時隊列&#xff1f;&#x1f680; 二、安裝前準備? RabbitMQ 環境要求&#x1f527; 三、安裝延時隊列插件&#x1f9e9; 插件名稱&#xff1a;…

Vue項目使用ssh2-sftp-client實現打包自動上傳到服務器(完整教程)

告別手動拖拽上傳&#xff01;本教程將手把手教你如何通過ssh2-sftp-client實現Vue項目打包后自動上傳到服務器&#xff0c;提升部署效率300%。&#x1f680;一、需求場景與解決方案在Vue項目開發中&#xff0c;每次執行npm run build后都需要手動將dist目錄上傳到服務器&#…

《質光相濟:Three.js中3D視覺的底層交互邏輯》

在Three.js搭建的虛擬維度中,光照與材質的關系遠非技術參數的簡單疊加,當光線以數字形態穿越虛空,與物體表面相遇的瞬間,便開始書寫屬于這個世界的物理敘事——每一縷光斑的形狀、每一塊陰影的濃淡、每一寸肌理的反光,都是對現實光學規律的轉譯與重構。理解這種交互的深層…

無刷電機在汽車領域的應用與驅動編程技術

文章目錄引言一、核心應用場景1. 新能源汽車動力系統2. 底盤控制系統3. 車身與舒適系統4. 智能駕駛與安全系統二、無刷電機的技術優勢解析三、無刷電機驅動編程基礎1. 驅動原理2. 驅動架構四、核心控制算法與實現1. 六步換向法&#xff08;梯形波控制&#xff09;算法流程圖C語…

【游戲引擎之路】登神長階(十八):3天制作Galgame引擎《Galplayer》——無敵之道心

游戲引擎開發記錄&#xff1a;2024年 5月20日-6月4日&#xff1a;攻克2D物理引擎。 2024年 6月4日-6月13日&#xff1a;攻克《3D數學基礎》。 2024年 6月13日-6月20日&#xff1a;攻克《3D圖形教程》。 2024年 6月21日-6月22日&#xff1a;攻克《Raycasting游戲教程》。 2024年…

kotlin kmp 跨平臺環境使用sqldelight

歡迎訪問我的主頁: https://heeheeaii.github.io/ 1. 項目結構 SQLDelightKMPDemo/ ├── shared/ │ ├── src/ │ │ ├── commonMain/kotlin/ │ │ ├── androidMain/kotlin/ │ │ ├── desktopMain/kotlin/ │ │ └── commonMain/sqldel…

機器學習【五】decision_making tree

決策樹是一種通過樹形結構進行數據分類或回歸的直觀算法&#xff0c;其核心是通過層級決策路徑模擬規則推理。主要算法包括&#xff1a;ID3算法基于信息熵和信息增益選擇劃分屬性&#xff1b;C4.5算法改進ID3&#xff0c;引入增益率和剪枝技術解決多值特征偏差&#xff1b;CART…

簡單記錄一下VSCode中的一些學習記

在剛開始學習VSCode時&#xff0c;相信大家都會好奇VSCode底部區域那幾個不同的狀態欄具體有什么作用&#xff08;輸出、調試控制臺、終端、端口&#xff09;&#xff0c;貌似好像都是輸出與代碼相關的信息的&#xff1f;貌似代碼運行結果既可以出現在輸出中&#xff0c;也可以…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(二)

目錄 二、Hive、SparkSQL、Impala 比較 1. SparkSQL 簡介 2. Hive、SparkSQL、Impala 比較 &#xff08;1&#xff09;功能 &#xff08;2&#xff09;架構 &#xff08;3&#xff09;場景 3. Hive、SparkSQL、Impala 性能對比 &#xff08;1&#xff09;cloudera 公司…

C++:std::array vs 原生數組 vs std::vector

&#x1f4cc; C&#xff1a;std::array vs 原生數組 vs std::vector 引用&#xff1a; C/C 標準庫 std::vector、std::array、原生靜態數組 的區別有哪些&#xff1f; 深度剖析&#xff1a;std::vector 內存機制與 push_back 擴容策略 今天過去了 還有許許多個明天 能和大…

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安裝自動補全主節點安裝就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安裝Calico網絡插件&#xff08;主節點&#xff09;下載文件wget https://ca…

VBA代碼解決方案第二十七講:禁用EXCEL工作簿右上角的關閉按鈕

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…