【linux性能分析】heaptrack分析內存占用

文章目錄

        • 1. Heaptrack是什么
        • 2. Heaptrack有哪些功能
        • 3. Heaptrack和valgrind massif對比
        • 4. Heaptrack安裝
        • 5. Heaptrack生成追蹤文件
        • 6. heaptrack_gui進行內存分析
        • 7. heaptrack_print也能用于堆分析
        • 8. 報錯解決
        • 9. 補充介紹:heaptrack編譯安裝

1. Heaptrack是什么
  • heaptrack是一個linux堆內存分析器, 可以分為兩個工具: 用于數據收集的heaptrack + 用于可視化顯示的heaptrack_gui. 兩者可以獨立構建, 但版本需要配套
  • heaptrack包含5個部分:
    • libheaptrack_proad.so:使用LD_preload技巧注入被調試應用程序的共享庫。可以獲取原始指令指針的回溯, 觸發共享庫上運行時信息的收集, 通過計時器了解實時的內存分配和消耗.
    • libheaptrack_inject.so:與preload variant類似,此庫用于對現有進程的運行時附著(runtime-attachment)。其他內存分析工具不能執行運行時附著
    • heaptrack_interpret:通過stdin讀取libheaptrack.so的輸出,并在libbacktrace的幫助下用DWARF調試符號注釋指令指針地址。帶注釋的數據流被發送到stdout并輸出為gzip壓縮格式以節省磁盤空間
    • heaptrack:結合了前兩個工具的腳本, 將傳遞參數作為具有正確LD_PRELOAD環境的進程來啟動.
    • heaptrack_print:此過程分析heaptracke_interpret的輸出。支持對heaptrack輸出gzip文件的透明解壓縮
2. Heaptrack有哪些功能
  • heaptrack能做的事情:
    • 跟valgrind massif一樣能分析堆內存消耗
    • 呈現分配函數的調用次數: 提供像valgrind callgraph的探查器
    • 查找泄露內存: heaptrack可以快速查看被調試對象停止時哪些內存沒有被釋放
    • 分配內存的大小與調用次數直方圖
3. Heaptrack和valgrind massif對比
  • valgrind massif提供了堆分析功能, 但存在以下問題

    • 運行速度慢: 尤其是在多線層應用程序上. valgrind是序列化代碼執行, 因此開銷很大
    • 不容易使用: massif通常需要尋找各種合適參數以進行使用, --depth、–detailed freq和–max等等, 生成的數據也偏粗糙
    • 結束時才輸出: massif要在調試對象結束時才輸出數據, 而定期檢查輸出數據很多時候是很有用的
  • 此外, gperftools也有類似heaptrack的功能, 但不能提供heaptrack那么多的數據, 也沒有那么高效.

4. Heaptrack安裝
  • 方式一: 命令安裝

    sudo apt-get install heaptrack
    sudo apt-get install heaptrack-guiheaptrack -v	# 查看版本號
    
  • 方式二: 編譯安裝 (最后補充介紹)

5. Heaptrack生成追蹤文件

按照github官網的說法, heaptrack可以通過如下方式使用:

  • heaptrack <your application and its parameters>

    touch main.cpp
    vim main.cpp		# 輸入以下測試代碼g++ -g -o main main.cpp
    
    #include <stdlib.h>
    #include <stdio.h>int main()
    {int *arr = (int *)malloc(sizeof(int) * 10);printf("After allocation %p\n", arr);arr = NULL;return 0;
    }
    
    heaptrack ./main
    
    或者: heaptrack -o output_file your_application	# output_file是輸出文件名
    

    可以輸入heaptrack --analyze xxx.gz 進行簡單分析

  • heaptrack --pid $(pidof <your application>)

    • 報錯:cannot runtime-attach, you need to set /proc/sys/kernel/yama/ptrace_scope to 0

    • 原因:無法在運行時附加到一個進程,因為系統的 ptrace 控制設置阻止了這種操作;

      • ptrace 是一種讓進程監視和控制另一個進程的 Linux 系統調用。出于安全考慮,Linux 引入了 ptrace scope 功能,通過寫入 /proc/sys/kernel/yama/ptrace_scope 文件來控制。當這個值不是 0 時,非root用戶不能ptrace附加到除其子進程以外的任何進程,以防止未授權的用戶修改或者獲取敏感信息;
    • 解決:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    • 但是會降低系統的安全性,應謹慎操作

    • 解決后再次執行命令, 可以看到在特定目錄下會生成追蹤文件

    • heaptrack會引起額外的性能開銷, 如果執行較大程序, 可能需要等待一會, 如下

    • 如果執行太慢,可以嘗試更新 libunwind

      • 先查看libunwind版本: http://download.savannah.gnu.org/releases/libunwind/
      wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.6.2.tar.gz
      tar -xf libunwind-1.1.tar.gz
      cd libunwind-1.1
      ./configure
      make
      make install
      
6. heaptrack_gui進行內存分析
  • sudo apt-get install heaptrack 會默認安裝heaptrack_gui

  • 然后執行如下命令分析內存詳情

    heaptrack_gui xxx.gz	# heaptrack生成的.gz文件
    
  • 通過編譯源碼安裝的heaptrack默認沒有裝heaptrack_gui,可通過文章最后補充介紹部分修改編譯選項進行解決

7. heaptrack_print也能用于堆分析
  • 待測試,本人未使用過該命令進行堆分析

  • 并把結果直接打印出來, 使用方式

    heaptrack_print heaptrack.APP.PID.gz | less
    
  • 輸出報告包含:

    MOST CALLS TO ALLOCATION FUNCTIONS
    PEAK MEMORY CONSUMERS
    MOST TEMPORARY ALLOCATIONS
    
  • 每個部分列出前10個熱點, 同時使用heaptrack_print還能將heaptrack數據轉換為massif數據格式, 然后可以通過flamegraph.pl生成一個折疊的堆棧消耗報告

8. 報錯解決
  • Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf ptrace: Operation not permitted.

    • 原因和解決方法: 權限不夠, 使用sudo運行; 不行的話就按照這篇博客https://blog.csdn.net/thesre/article/details/117454665 , 修改/proc/sys/kernel/yama/ptrace_scope為0并生效/etc/sysctl.d/10-ptrace.conf
  • heaptrack --pid $(pidof your_process_name)生成文件格式為.zst并且大小為0
    我們在容器內運行程序, 在容器外執行heaptrack, 注意看報錯

    Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable. Connect to gdbserver inside the container. 在不同的PID命名控件, 線程列表和數據不可靠. 用的是docker container里的gdbserver

    • 原因和解決方法:在容器外獲取到的PID可能和容器內不一致, 此外可能還有內存權限的問題, 需要在容器內執行heaptrack --pid命令
  • 容器內heaptrack生成的數據文件無法在容器外heaptrack_gui訪問

    • 原因: heaptrack_gui版本過低
    • 解決: 升級heaptrack_gui版本, 源碼編譯的時候使用cmake … -DBUILD_GUI=ON編譯選項構建帶圖形界面的版本, 即heaptrack_gui
9. 補充介紹:heaptrack編譯安裝
  • [這種方式需要單獨安裝heaptrack_gui, 可能存在版本不配套的問題]

  • 按照github或者gitee安裝指引操作:

    cd heaptrack # i.e. the source folder
    mkdir build
    cd build
    cmake -DCMAKE_BUILD_TYPE=Release ..  #look for messages about missing dependencies!
    make -j$(nproc)
    
  • cmake -DCMAKE_BUILD_TYPE=Release … 報錯:

    • 報錯1Could NOT find Libunwind(missing: LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARY LIBUNWIND_HAS_UNW_BACKTRACE)

    • 解決方法:安裝libunwind8-dev之后解決: sudo apt-get install libunwind8-dev

      • (sudo apt-get install -y libunwind-dev安裝最新版?)
    • 報錯2Could NOT find Elfutils (missing: LIBDW_LIBRARIES LIBDW_INCLUDE_DIR) (Required is at least version “0.158”)

    • 解決方法:

      sudo apt-get -y install elfutils	# 安裝后仍報錯
      # 下載源碼切換到大于0.158版本的tag后編譯安裝:
      git clone git://sourceware.org/git/elfutils.git
      git tag
      git checkout -b dev_elfutils-0.159 elfutils-0.159
      # 軟件準備
      apt-get install autoconf
      apt-get install autopoint
      apt-get install flex bison
      # cat README	# 查看README 按指導進行編譯
      autoreconf -i -f
      sudo apt-get install gawk
      ./configure --enable-maintainer-mode --disable-debuginfod
      make
      make check
      sudo make install
      
    • make check執行完之后

    • 補充: GNU elfutils是一個開源的工具集,用于處理ELF(Executable and Linkable Format)格式的可執行文件、目標文件和共享庫 elfutils工具

    • 報錯3warning 3: Could NOT find ECM (missing: ECM_DIR)

      sudo apt-get install extra-cmake-modules	# 因為只是warning, 安裝不成功好像也不影響make -j$(nproc) #完成編譯, 如下
      
    • 再執行sudo make install后完成安裝

    • heaptrack -v查看版本信息

    • 補充:通過編譯源碼安裝的heaptrack默認沒有裝heaptrack_gui?

      • 不推薦使用源碼編譯安裝heaptrack, 源碼編譯默認沒有安裝heaptrack_gui, 通過sudo apt-get install heaptrack也沒有默認安裝heaptrack_gui, 需要單獨安裝, 安裝命令如下:
      # sudo apt install heaptrack-gui #命令安裝可能不配套cd build; cmake .. -DBUILD_GUI=ON	# 編譯時安裝需要運行命令
      

?


?
創作不易,如有幫助,請點贊收藏支持
?


[參考文章]
[1]. Heaptrack - A Heap Memory Profiler For Linux, 重點參考, 和valgrind massif的區別等
[2]. Linux Ubuntu上如何安裝libunwind
[3]. sudo apt-get -y install elfutils
[4]. elfutils編譯問題記錄
[5]. 編譯eflutils方法
[6]. heaptrack檢測是否存在內存泄露
[7]. heaptrack無法檢測到內存泄露例子
[8]. ubuntu20.04安裝heaptrack
[9]. heaptrack和valgrind/massif的區別
[10]. heaptrack github官網

created by shuaixio, 2024.04.09

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

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

相關文章

內網穿透--Spp-特殊協議-上線

免責聲明:本文僅做技術交流與學習... 目錄 spp項目: 一圖通解: 1-下載spp 2-服務端執行命令 3-客戶端執行命令 4-服務端cs監聽&生馬 spp項目: GitHub - esrrhs/spp: A simple and powerful proxy 支持的協議&#xff1a;tcp、udp、udp、icmp、http、kcp、quic 支持的…

Java開發者必知的時間處理工具:SimpleDateFormat類詳解

哈嘍&#xff0c;各位小伙伴們&#xff0c;你們好呀&#xff0c;我是喵手。運營社區&#xff1a;C站/掘金/騰訊云&#xff1b;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相學習&#xff0c;一…

使用兩塊ESP8266實現ESP-NOW通信

ESP-NOW簡介 ESP-NOW是Espressif開發的一種基于Wi-Fi的低功耗通信協議。與傳統Wi-Fi通信不同&#xff0c;ESP-NOW不需要配對過程&#xff0c;設備間可以直接通信&#xff0c;非常適合需要快速傳輸小數據包的應用&#xff0c;如傳感器網絡、遙控器和智能家居設備。它的優勢在于…

小紅書云原生 Kafka 技術剖析:分層存儲與彈性伸縮

面對 Kafka 規模快速增長帶來的成本、效率和穩定性挑戰時&#xff0c;小紅書大數據存儲團隊采取云原生架構實踐&#xff1a;通過引入冷熱數據分層存儲、容器化技術以及自研的負載均衡服務「Balance Control」&#xff0c;成功實現了集群存儲成本的顯著降低、分鐘級的集群彈性遷…

[圖解]SysML和EA建模住宅安全系統-07 to be塊定義圖

1 00:00:01,970 --> 00:00:05,040 入侵者這里有個∞ 2 00:00:05,530 --> 00:00:07,000 說明它下面已經有子圖了 3 00:00:07,010 --> 00:00:08,080 我們看看里面子圖 4 00:00:10,200 --> 00:00:17,000 這里&#xff0c;我們看位置 5 00:00:19,030 --> 00:00:…

Vitis HLS 學習筆記--抽象并行編程模型-不良示例

目錄 1. 簡介 2. 基礎 kernel 2.1 pass kernel 2.2 double_pass kernel 2.3 add_kernel 2.4 split kernel 3. 三種bypass 3.1 input_bypass 3.2 middle_bypass 3.3 output_bypass 4. 總結 1. 簡介 本文展示三個在數據流水線中常見的問題&#xff1a; 輸入參數繞過…

python中模擬鍵盤按鍵和鼠標按鍵

目錄 0.作用和需安裝庫 1.模擬鍵盤按鍵 2.虛擬鍵表 3.模擬鼠標 0.作用和需安裝庫 作用&#xff1a;用程序實現達到按下鍵盤按鍵的作用&#xff0c;或者按下鼠標&#xff0c;無需真正按鍵盤或者鼠標。 需要安裝pywin32這個庫 pip install pywin32 1.模擬鍵盤按鍵 例子1…

在Mac OS下編寫第一個Flask代碼

在電腦上已經安裝了Homebrew&#xff0c;在Homebrew里已經安裝了Python。 創建一個新的Flask應用。這里發生了幾件事&#xff1a; 創建虛擬環境&#xff1a; 你使用python3 -m venv flask創建了一個名為flask的虛擬環境。激活虛擬環境&#xff1a; 通過運行source flask/bin/ac…

chatgpt線性差值 將直線漸變顏色

color(x)(x-x1)/(x2-x1) 與gpt給出的 這個位置比例可以表示為d/L是概念相同 x-x1是計算當前點距離起點距離&#xff0c;x2-x1是計算長度 例如&#xff0c;如果我們在直線上距離起點A的距離為d&#xff0c;整條直線的長度為L 用數學方式解釋 2024/5/25 18:54:30 當我們要在一…

vue+echart :點擊趨勢圖中的某一點或是柱狀圖,出現彈窗,并傳輸數據

樣式 在趨勢圖中點擊某一個柱狀圖&#xff0c;出現下面的彈窗 代碼實現 主要是在趨勢圖頁面代碼中&#xff0c;在初始化趨勢圖的設置中&#xff0c;添加對趨勢圖監聽的點擊方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

Swift 類和結構體

類和結構體 一、結構體和類對比1、類型定義的語法2、結構體和類的實例3、屬性訪問4、結構體類型的成員逐一構造器 二、結構體和枚舉是值類型三、類是引用類型1、恒等運算符2、指針 結構體和類作為一種通用而又靈活的結構&#xff0c;成為了人們構建代碼的基礎。你可以使用定義常…

python mp3轉mp4工具

成品UI 安裝moviepy庫 pip install moviepy 轉換demo from moviepy.editor import *# 創建一個顏色剪輯&#xff0c;時長與音頻相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\趙照 - 燈塔守望人.mp3") videoclip…

node-nass安裝踩坑

編譯DSS的前端&#xff0c;用1.1.4編譯&#xff0c;沒有問題&#xff0c;用1.1.1版本就有問題&#xff0c;一直是node-gyp有問題&#xff0c;怎么也解決了不了。 后來檢查發現&#xff0c;是因為要安裝node-nass才導致出現node-gyp的問題。 而1.1.4沒問題&#xff0c;是因為我…

頭歌c語言實驗答案

由于頭歌C語言實驗的具體內容和題目可能隨時間變化&#xff0c;我無法直接提供特定實驗的完整答案。但我可以基于參考文章中的內容和結構&#xff0c;給出一個通用的回答格式&#xff0c;并結合相關信息進行說明。 通用回答格式 實驗名稱和描述 實驗名稱&#xff1a;頭歌C語言…

用Python Pygame做的一些好玩的小游戲

有些游戲的代碼比較長就不公布了 1.簡簡單單 1.瘋狂的雞哥 你要準備的圖片&#xff1a; 命名為&#xff1a;ji.png 代碼&#xff1a; import pygame import random as r pygame.init() pygame.display.set_caption(aaa) pm pygame.display.set_mode((800,600))class Ls(py…

Java進階學習筆記15——接口概述

認識接口&#xff1a; Java提供了一個關鍵字Interface&#xff0c;用這個關鍵字我們可以定義一個特殊的結構&#xff1a;接口。 接口不能創建對象。 注意&#xff1a;接口不能創建對象&#xff0c;接口是用來被類實現&#xff08;implements&#xff09;的&#xff0c;實現接口…

中國電子學會(CEIT)2023年05月真題C語言軟件編程等級考試三級(含詳細解析答案)

中國電子學會(CEIT)考評中心歷屆真題(含解析答案) C語言軟件編程等級考試三級 2023年05月 編程題五道 總分:100分一、找和為K的兩個元素(20分) 在一個長度為n (n < 1000)的整數序列中,判斷是否存在某兩個元素之和為k。 時間限制: 1000 內存限制: 65536 輸入 …

基于Spring Boot的高校圖書館管理系統

項目和論文都有企鵝號2583550535 基于Spring Boot的圖書館管理系統||圖書管理系統_嗶哩嗶哩_bilibili 第1章 緒論... 1 1.1 研究背景和意義... 1 1.2 國內外研究現狀... 1 第2章 相關技術概述... 2 2.1 后端開發技術... 2 2.1.1 SpringBoot 2 2.1.2 MySQL.. 2 2.1.3 My…

unity中如何插入網頁

在Unity中插入自己的網頁通常是通過使用Unity的WebGL構建目標和HTML頁面來實現的。以下是一些步驟&#xff1a; 構建你的Unity項目為WebGL&#xff1a;在Unity中&#xff0c;選擇Build Settings&#xff08;構建設置&#xff09;&#xff0c;將Platform&#xff08;平臺&#x…

vr商品全景展示場景編輯軟件的優點

3D模型展示網站搭建編輯器以強大的3D編輯引擎和逼真的渲染效果&#xff0c;讓您輕松實現模型展示的優化。讓用戶通過簡單的操作&#xff0c;就能滿足個人/設計師/商戶多樣化展示的需求&#xff0c;讓您的模型成為獨一無二的杰作。 3D模型展示網站搭建編輯器采用國內領先的實時互…