【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.mzph.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;一…

小红书云原生 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; 输入参数绕过…

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…

用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;实现接口…

基于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…

vr商品全景展示场景编辑软件的优点

3D模型展示网站搭建编辑器以强大的3D编辑引擎和逼真的渲染效果&#xff0c;让您轻松实现模型展示的优化。让用户通过简单的操作&#xff0c;就能满足个人/设计师/商户多样化展示的需求&#xff0c;让您的模型成为独一无二的杰作。 3D模型展示网站搭建编辑器采用国内领先的实时互…

java继承使用细节二

构造器 主类是无参构造器时会默认调用 public graduate() {// TODO Auto-generated constructor stub也就是说我这里要用构造器会直接调用父类。它是默认看不到的 &#xff0c;System.out.println("graduate");} 但当主类是有参构造器如 public father_(int s,doubl…

c语言:将小写字母转换为大写字母

//将小写字母转换为大写字母 #include <stdio.h> #include <ctype.h> int main() { char arr[]"you are low"; int i0; while(arr[i]) { if(islower(arr[i])) { arr[i]arr[i]-32; } i; } printf("%s\n",arr); return 0; }

微调Llama3实现在线搜索引擎和RAG检索增强生成功能

视频中所出现的代码 Tavily SearchRAG 微调Llama3实现在线搜索引擎和RAG检索增强生成功能&#xff01;打造自己的perplexity和GPTs&#xff01;用PDF实现本地知识库_哔哩哔哩_bilibili 一.准备工作 1.安装环境 conda create --name unsloth_env python3.10 conda activate …

dubbo复习:(8)使用sentinel对服务进行降级

一、下载sentinel-dashboard控制台应用并在8080端口启动 二、项目添加springboot 和dubbo相关依赖&#xff08;降级规则并未持久化&#xff0c;如果需要持久化&#xff0c;如果需要持久化降级规则&#xff0c;只需增加nacos相关依赖并在nacos中进行配置&#xff0c;然后配置app…

使用Python Tkinter创建GUI应用程序

大家好&#xff0c;当我们谈及使用Python Tkinter创建GUI应用程序时&#xff0c;我们涉及的不仅是技术和代码&#xff0c;更是关于创造力和用户体验的故事。Tkinter作为Python标准库中最常用的GUI工具包&#xff0c;提供了丰富的功能和灵活的接口&#xff0c;让开发者能够轻松地…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统&#xff0c;数据库为mysql&#xff0c;可用于日常学习和毕设&#xff0c;系统分为管理员、房东、用户&#xff0c;部分截图如下所示&#xff1a; 部分界面截图 用户 管理员 联系我 微信&#xff1a;Zzllh_

打开服务器远程桌面连接不上,可能的原因及相应的解决策略

在解决远程桌面连接不上服务器的问题时&#xff0c;我们首先需要从专业的角度对可能的原因进行深入分析&#xff0c;并据此提出针对性的解决方案。以下是一些可能的原因及相应的解决策略&#xff1a; 一、网络连接问题 远程桌面连接需要稳定的网络支持&#xff0c;如果网络连接…