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

news2025/3/18 12:24:16

文章目录

        • 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-gui
    
    heaptrack -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.coloradmin.cn/o/1694520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之函数和函数库以及自己制作静态动态链接库并使用

一&#xff1a;函数的本质 1&#xff1a;C语言为什么会有函数 &#xff08;1&#xff09;整个程序分为多个源文件&#xff0c;一个文件分为多个函数&#xff0c;一个函数分成多个语句&#xff0c;这就是整个程序的组织形式。这样的组织好处在于&#xff1a;分化问题、、便于程序…

【Python 对接QQ的接口(二)】简单用接口查询【等级/昵称/头像/Q龄/当天在线时长/下一个等级升级需多少天】

文章日期&#xff1a;2024.05.25 使用工具&#xff1a;Python 类型&#xff1a;QQ接口 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xff09;&…

【2024软考】史上最全!软考刷题+解析大合集(9万字全手工打,货真价实)

计算机基础知识 1.中断向量表用来保存各个中断源的中断服务程序的入口地址。当外设发出中断请求信号&#xff08;INTR&#xff09;以后&#xff0c;由中断控制器&#xff08;INTC&#xff09;确定其中断号&#xff0c;并根据中断号查找中断向量表来取得其中断服务程序的入口地…

基于机器学习预测未来的二氧化碳排放量(随机森林和XGBoost)

基于机器学习预测未来的二氧化碳排放量&#xff08;随机森林和XGBoost&#xff09; 简介&#xff1a; CO2排放是当今全球关注的环境问题之一。本文将使用Python对OWID提供的CO2排放数据集进行分析&#xff0c;并尝试构建机器学习模型来预测未来的CO2排放趋势。我们将探索数据…

Cloudflare Worker 部署bingai

Cloudflare Worker 部署 1. 注册 Cloudflare 账号 2. 一键部署 登录账户后, 点击下面链接 https://deploy.workers.cloudflare.com/?urlhttps://github.com/Harry-zklcdc/go-proxy-bingai 点击「Authorize Workers」, 登录 Github 账号授权 Cloudflare 点击「I have a ac…

IntelliJ IDEA常用快捷键 + 动图演示!

本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA &#xff08;Windows 版&#xff09; 的所有快捷键。并在此基础上&#xff0c;为 90% 以上的快捷键提供了动图演示&#xff0c;能够直观的看到操作效果。 该快捷键共分 11 种&#xff0c;可以方便的按各类查找…

算法:二分查找题目练习

目录 题目一&#xff1a;二分查找 朴素的二分模版 题目二&#xff1a;在排序数组中查找元素的第⼀个和最后⼀个位置 查找区间左端点 查找区间右端点 查找区间左端点二分模版 查找区间右端点二分模版 题目三&#xff1a;搜索插⼊位置 题目四&#xff1a;x的平方根 题目…

MySQL select for update 加锁

背景 当多人操作同一个客户下账号的时候&#xff0c;希望顺序执行&#xff0c;某个时刻只有一个人在操作&#xff1b;当然可以通过引入redis这种中间件实现&#xff0c;但考虑到并发不会很多&#xff0c;所以不想再引入别的中间件。 表结构 create table jiankunking_accoun…

amis 联动效果触发的几种方式

联动效果实现主要俩种方式: 1.表达式实现联动,基于组件内或数据链的变量变化的联动 比如&#xff1a; "source": "/amis/api/mock2/options/level2?name${name} " (必须是这种字符串拼接形式,在data数据映射中表达式不会触发联动) 所有初始化接口链…

【FPGA】Verilog:解码器 | 编码器 | 多路复用器(Mux, Multiplexer)

0x00 什么是解码器 解码器是根据输入信号在多个输出位中选择一个输出位的装置。例如,当解码器接收2位二进制值作为输入时,它可以接收00、01、10、11四种输入值,并根据每个输入值在4个输出位中选择一个,输出为1000、0100、0010、0001中的一种。这样的解码器被称为高电平有效…

【数据挖掘】四分位数识别数据中的异常值(附代码)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

Android四大组件 Broadcast广播机制

一 概述 广播 (Broadcast) 机制用于进程或线程间通信&#xff0c;广播分为广播发送和广播接收两个过程&#xff0c;其中广播接收者 BroadcastReceiver 是 Android 四大组件之一。BroadcastReceiver 分为两类&#xff1a; 静态广播接收者&#xff1a;通过 AndroidManifest.xm…

开源模型应用落地-食用指南-以最小成本博最大收获

一、背景 时间飞逝&#xff0c;我首次撰写的“开源大语言模型-实际应用落地”专栏已经完成了一半以上的内容。由衷感谢各位朋友的支持,希望这些内容能给正在学习的朋友们带来一些帮助。 在这里&#xff0c;我想分享一下创作这个专栏的初心以及如何有效的&#xff0c;循序渐进的…

机器视觉-硬件

机器视觉-硬件 镜头焦距凸透镜焦点不止一个相机镜头由多个镜片组成对焦和变焦 镜头光圈光圈的位置光圈系数F 镜头的景深景深在光路中的几何意义 远心镜头远心镜头的种类远心镜头特性应用场景 镜头的分辨率镜头反差镜头的MTF曲线镜头的靶面尺寸镜头的几何相差相机镜头接口螺纹接…

私域流量的真谛:构建并运营属于你自己的私域生态

大家好&#xff0c;我是来自一家专注于私域电商行业的软件开发公司的产品经理&#xff0c;拥有超过七年的行业经验。今天&#xff0c;我想和大家聊聊私域流量的真正含义&#xff0c;以及为何我们应该关注并努力打造属于自己的私域生态。 什么是私域流量&#xff1f; 私域流量&…

文心大模型4.0创建智能体:资深研发专家一对一辅导

目录 前言 一、什么是文心智能体平台&#xff1f; 1、通过平台能做什么 2、平台的优势 3、智能体类型 二、如何访问和使用这个智能体&#xff1f; 1、零代码开发&#xff1a;一句话创建智能体 2、资深研发专家一对一辅导智能体介绍 总结 前言 在当今快节奏和高度竞争的…

【高时效通路】

一 高时效通路 1.1 pathchdumper 实时数据拉取、实时数据处理、5分钟微批dump来加速时效性&#xff0c;具体来说&#xff1a; 实时数据拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接对接F0层实时拉取最新数据&#xff0c;保证该…

哥白尼哨兵系列卫星数据不能下载的解决方法

自2023年1月24日起&#xff0c;一个新的哥白尼数据空间生态系统已经启动&#xff0c;为所有哨兵数据&#xff08;Sentinel-1, Sentinel-2, Sentinel-3 and Sentinel-5P&#xff09;提供可视化和数据处理&#xff0c;地址为&#xff1a;https://dataspace.copernicus.eu/。详细介…

Linux驱动(2)---Linux内核的组成

1.Linux内核源码目录 arch包含和硬件体系相关结构相关源码&#xff0c;每个平台占用一个目录 block&#xff1a;块设备驱动程序I/O调度 crypto&#xff1a;常用加密和三列算法&#xff0c;还有一些压缩和CRC校验算法。 documentation:内核个部分的通用解释和注释.。 drive…

护眼小贴士:学生如何正确使用台灯?

随着电子设备的普及和长时间的用眼&#xff0c;长时间盯着屏幕或学习&#xff0c;眼睛需要不断调节焦距&#xff0c;导致眼睛肌肉疲劳&#xff0c;进而引发视力下降。这种现象在年轻一代甚至青少年中尤为普遍&#xff0c;这种疲劳状态不仅影响眼睛的舒适度&#xff0c;还会导致…