当前位置: 首页 > news >正文

使用jemalloc实现信号驱动的程序堆栈信息打印

使用jemalloc实现信号驱动的程序堆栈信息打印

本文介绍应用如何集成jemalloc,在接收到SIGUSR1信号10时打印程序的堆栈信息。

1. 编译jemalloc

首先,确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤:

git clone https://github.com/jemalloc/jemalloc.git  # 本文测试的版本是jemalloc-5.3.0
cd jemalloc
./configure --prefix=/usr/local --enable-prof
make -j10
make install

2. 测试

假如你的需要集成的程序为example,通过LD_PRELOAD同时加载jemalloc和钩子库,按照以下步骤运行和测试:

  • 设置环境变量:

    export MALLOC_CONF="prof:true,prof_active:true,lg_prof_sample:0,tcache:false,prof_prefix:jeprof.out"
    
    • prof:true 启用配置文件
    • prof_active:true 启用性能分析
    • lg_prof_sample:0 设置采样率为最频繁
    • tcache:false:禁用线程缓存(Thread Cache)。
      • 禁用线程缓存可能会影响性能,但在进行性能分析时,可以提供更准确的内存分配数据。
    • prof_prefix:jeprof.out 指定性能分析输出文件前缀
  • 使用killall -10 example发送SIGUSR1信号以触发堆栈信息打印:

    killall -10 example # 或者 killall -SIGUSR1 example
    
  • 通过以上步骤,你可以在接收到SIGUSR1信号时打印jemalloc的堆栈信息,并将其输出到本地目录。

    本文得到的堆栈信息文件名为jeprof.out.60571.0.m0.heap ,通过如下命令分析该堆栈信息文件:

    jeprof --show_bytes --text --lines ./example ./jeprof.out.60571.0.m0.heap
    
  • 解析的结果为:

    $ jeprof --show_bytes --text --lines ./example ./jeprof.out.60571.0.m0.heap 
    Using local file ./example.
    Using local file ./jeprof.out.60571.0.m0.heap.
    Total: 83512 B83512 100.0% 100.0%    83512 100.0% prof_backtrace_impl /home/test/jemalloc-5.3.0/src/prof_sys.c:1030   0.0% 100.0%     1024   1.2% _IO_new_file_overflow /build/glibc-2ORdQG/glibc-2.27/libio/fileops.c:7590   0.0% 100.0%     1024   1.2% _IO_new_file_xsputn /build/glibc-2ORdQG/glibc-2.27/libio/fileops.c:12660   0.0% 100.0%     1024   1.2% __GI__IO_doallocbuf /build/glibc-2ORdQG/glibc-2.27/libio/genops.c:3650   0.0% 100.0%     1024   1.2% __GI__IO_file_doallocate /build/glibc-2ORdQG/glibc-2.27/libio/filedoalloc.c:1010   0.0% 100.0%     1024   1.2% __GI__IO_fwrite /build/glibc-2ORdQG/glibc-2.27/libio/iofwrite.c:390   0.0% 100.0%     1592   1.9% __libc_start_main /build/glibc-2ORdQG/glibc-2.27/csu/../csu/libc-start.c:3100   0.0% 100.0%    81920  98.1% _dl_start_user :?0   0.0% 100.0%     1592   1.9% _start ??:?0   0.0% 100.0%        8   0.0% allocateDouble /home/test/jemalloc_test/example.cpp:190   0.0% 100.0%       80   0.1% allocateDynamicArray /home/test/jemalloc_test/example.cpp:32 (discriminator 1)0   0.0% 100.0%      448   0.5% allocateIntArray /home/test/jemalloc_test/example.cpp:130   0.0% 100.0%     1024   1.2% allocateIntArray /home/test/jemalloc_test/example.cpp:140   0.0% 100.0%     1472   1.8% allocateMemory /home/test/jemalloc_test/example.cpp:510   0.0% 100.0%        8   0.0% allocateMemory /home/test/jemalloc_test/example.cpp:520   0.0% 100.0%       32   0.0% allocateMemory /home/test/jemalloc_test/example.cpp:530   0.0% 100.0%       80   0.1% allocateMemory /home/test/jemalloc_test/example.cpp:540   0.0% 100.0%       32   0.0% allocateString /home/test/jemalloc_test/example.cpp:250   0.0% 100.0%    81920  98.1% call_init /build/glibc-2ORdQG/glibc-2.27/elf/dl-init.c:720   0.0% 100.0%    83512 100.0% imalloc (inline) /home/test/jemalloc-5.3.0/src/jemalloc.c:26940   0.0% 100.0%    83512 100.0% imalloc_body (inline) /home/test/jemalloc-5.3.0/src/jemalloc.c:25500   0.0% 100.0%    83512 100.0% je_malloc_default /home/test/jemalloc-5.3.0/src/jemalloc.c:27220   0.0% 100.0%    83512 100.0% je_prof_backtrace /home/test/jemalloc-5.3.0/src/prof_sys.c:2840   0.0% 100.0%    83512 100.0% je_prof_tctx_create /home/test/jemalloc-5.3.0/src/prof.c:1950   0.0% 100.0%     1592   1.9% main /home/test/jemalloc_test/example.cpp:730   0.0% 100.0%    83512 100.0% prof_alloc_prep (inline) /home/test/jemalloc-5.3.0/include/jemalloc/internal/prof_inlines.h:1410   0.0% 100.0%    81920  98.1% std::__once_callable ??:00   0.0% 100.0%     1024   1.2% std::__ostream_insert ??:?0   0.0% 100.0%     1024   1.2% std::operator<<  ??:?0   0.0% 100.0%      568   0.7% void* fallback_impl /home/test/jemalloc-5.3.0/src/jemalloc_cpp.cpp:98

3. 本人测试的example.cpp代码

以下是完整的example.cpp代码,编译方法: g++ -g -o example example.cpp

// g++ -g -o example example.cpp
#include <jemalloc/jemalloc.h>  // jemalloc
#include <sys/mman.h>           // mmap, munmap
#include <unistd.h>             // usleep
#include <csignal>              // signal, sigaction
#include <cstdlib>              // rand()和srand()
#include <ctime>                // time()
#include <iostream>
#include <string>
#include <vector>// 分配int数组
void allocateIntArray() {const int* intPtr = new int[100];std::cout << "Allocated int array at: " << intPtr << std::endl;
}// 分配double
void allocateDouble() {const double* doublePtr = new double(3.14);std::cout << "Allocated double at: " << doublePtr << ", value: " << *doublePtr << std::endl;
}// 分配字符串
void allocateString() {const std::string* strPtr = new std::string("Hello, World!");std::cout << "Allocated string at: " << strPtr << ", value: " << *strPtr << std::endl;
}// 分配动态数组
void allocateDynamicArray() {size_t arraySize = 10;size_t* const arrayPtr = new size_t[arraySize];std::cout << "Allocated array of " << arraySize << " ints at: " << arrayPtr << std::endl;for (size_t i = 0; i < arraySize; ++i) {arrayPtr[i] = i;}
}// 使用mmap分配内存
void allocateMmap() {size_t mmapSize = 4096;  // 4KBconst void* mmapPtr = mmap(nullptr, mmapSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);if (mmapPtr == MAP_FAILED) {perror("mmap failed");} else {std::cout << "Allocated mmap at: " << mmapPtr << ", size: " << mmapSize << " bytes" << std::endl;}
}void allocateMemory() {allocateIntArray();allocateDouble();allocateString();allocateDynamicArray();allocateMmap();
}// 信号处理函数
void signalHandler(int signum) {std::cout << "Signal (" << signum << ") received, printing heap profile:" << std::endl;mallctl("prof.dump", nullptr, nullptr, nullptr, 0);
}int main() {// 设置信号处理函数struct sigaction action;action.sa_handler = signalHandler;sigemptyset(&action.sa_mask);action.sa_flags = 0;sigaction(SIGUSR1, &action, nullptr);usleep(100000);  // 100msallocateMemory();while (true) {usleep(100000);  // 100ms}return 0;
}

相关文章:

使用jemalloc实现信号驱动的程序堆栈信息打印

使用jemalloc实现信号驱动的程序堆栈信息打印 本文介绍应用如何集成jemalloc&#xff0c;在接收到SIGUSR1信号10时打印程序的堆栈信息。 1. 编译jemalloc 首先&#xff0c;确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤&#xff1a; git c…...

树的4种遍历

目录 树的四种遍历方式的总结 1. 前序遍历&#xff08;Pre-order Traversal&#xff09; 2. 中序遍历&#xff08;In-order Traversal&#xff09; 3. 后序遍历&#xff08;Post-order Traversal&#xff09; 4. 层序遍历&#xff08;Level-order Traversal 或 广度优先遍…...

深入探讨5种单例模式

文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览 以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。 …...

SPOOL

-----How to Pass UNIX Variable to SPOOL Command (Doc ID 1029440.6) setenv只有csh才有不行啊PROBLEM DESCRIPTION: You would like to put a file name in Unix and have SQL*Plus read that file name, instead of hardcoding it, because it will change.You want to pa…...

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…...

【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着…...

MapStruct的用法总结及示例

MapStruct是一个代码生成器&#xff0c;它基于约定优于配置的原则&#xff0c;使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码&#xff0c;提高开发效率&#xff0c;并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…...

redis 05 复制 ,哨兵

01.redis的复制功能&#xff0c;使用命令slaveof 2. 2.1 2.2 3. 3.1 3.1.1 3.1.2 3.1.3 4 4.1 4.2 例子 5.1 这里是从客户端发出的指令 5.2 套接字就是socket 这里是和redis事件相关的知识 5.3 ping一下...

强大的.NET的word模版引擎NVeloDocx

在Javer的世界里&#xff0c;存在了一些看起来还不错的模版引擎&#xff0c;比如poi-tl看起来就很不错&#xff0c;但是那是人家Javer们专属的&#xff0c;与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…...

MySQL中所有常见知识点汇总

存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图&#xff1a; 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分&#xff1a; 连接器&#xff1a;负责跟客户端建立连 接、获取权限、维持和管理…...

Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践

背景 Apache Flink 是一个开源的流处理和批处理框架&#xff0c;具有高吞吐量、低延迟的流式引擎&#xff0c;支持事件时间处理和状态管理&#xff0c;以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎&#xff0c;支持 Java、Scala、Pytho…...

远程访问及控制

SSH协议 是一种安全通道协议 对通信数据进行了加密处理&#xff0c;用于远程管理 OpenSSH(SSH由OpenSSH提供) 服务名称&#xff1a;sshd 服务端控制程序&#xff1a; /usr/sbin/sshd 服务端配置文件&#xff1a; /etc/ssh/sshd_config ssh存放的客户端的配置文件 ssh是服务端额…...

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416

【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46&#xff0c; Leetcode 416 需强化知识点 背包理论知识 题目 卡码 46. 携带研究材料 01 背包理论基础01 背包理论基础&#xff08;滚动数组&#xff09;01 背包 二维版本&#xff1a;dp[i][j] 表示从下标为[0-i]的物…...

html5实现个人网站源码

文章目录 1.设计来源1.1 网站首页页面1.2 个人工具页面1.3 个人日志页面1.4 个人相册页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/139564407 ht…...

【内存管理】内存布局

ARM32位系统的内存布局图 32位操作系统的内存布局很经典&#xff0c;很多书籍都是以32位系统为例子去讲解的。32位的系统可访问的地址空间为4GB&#xff0c;用户空间为1GB ~ 3GB&#xff0c;内核空间为3GB ~ 4GB。 为什么要划分为用户空间和内核空间呢&#xff1f; 一般处理器…...

软件试运行方案(Word)

软件试运行方案&#xff08;直接套用实际项目&#xff0c;原件获取通过本文末个人名片直接获取。&#xff09; 一、试运行目的 二、试运行的准备 三、试运行时间 四、试运行制度 五、试运行具体内容与要求...

Redis原理篇——哨兵机制

Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要&#xff0c;一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢&#xff1f; 2.哨兵工作原理 …...

web前端的MySQL:跨领域之旅的探索与困惑

web前端的MySQL&#xff1a;跨领域之旅的探索与困惑 在数字化浪潮的推动下&#xff0c;web前端与MySQL数据库似乎成为了两个不可或缺的领域。然而&#xff0c;当我们将这两者放在一起&#xff0c;尝试探索web前端与MySQL之间的交互与关联时&#xff0c;却发现这是一次充满困惑…...

Postgresql源码(135)生成执行计划——Var的调整set_plan_references

1 总结 set_plan_references主要有两个功能&#xff1a; 拉平&#xff1a;生成拉平后的RTE列表&#xff08;add_rtes_to_flat_rtable&#xff09;。调整&#xff1a;调整前每一层计划中varno的引用都是相对于本层RTE的偏移量。放在一个整体计划后&#xff0c;需要指向一个统一…...

Python魔法之旅专栏(导航)

目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先&#xff0c;感谢老铁们一直以来对我的支持与厚爱&#xff0c;让我能坚持把Python魔法方法专栏更新完毕&#xff01; 其次&#xff0c;为了方便大家查阅&#xff0c;我将此专栏…...

从CSV文件到3D点云:用Qt+OpenGL打造一个简易的激光雷达数据查看器

从CSV文件到3D点云&#xff1a;用QtOpenGL打造激光雷达数据查看器 激光雷达技术正在重塑自动驾驶、机器人导航和三维测绘的格局。当数百万个空间数据点从激光雷达设备中喷涌而出时&#xff0c;工程师们面临着一个关键挑战&#xff1a;如何快速验证和可视化这些原始数据&#xf…...

现代C++中的编译期反射替代思路

现代C中的编译期反射替代思路C 长期缺乏完整标准反射能力&#xff0c;但工程上依然经常需要“遍历字段、生成元信息、自动序列化、自动注册”。在正式反射广泛可用之前&#xff0c;开发者通常通过宏、模板特化、tuple 适配和代码生成等方式实现替代方案。一种常见思路是手工提供…...

内容做了一大堆,流量就是起不来?初创公司低成本获流的真实解法

内容做了一大堆&#xff0c;流量就是起不来&#xff1f;初创公司低成本获流的真实解法 我见过太多这样的团队&#xff1a;每周雷打不动三篇公众号&#xff0c;两条短视频&#xff0c;外加若干条推特&#xff0c;数据面板安安静静&#xff0c;后台没有咨询&#xff0c;评论区只…...

别再手动绑骨了!用Mixamo+Unity 2022,5分钟搞定二次元角色动画(附材质修复全流程)

二次元角色动画高效制作指南&#xff1a;Mixamo与Unity 2022的完美配合 在独立游戏开发领域&#xff0c;角色动画制作往往是耗时最长的环节之一。传统手动绑骨流程不仅需要专业技能&#xff0c;还会消耗大量时间成本。对于二次元风格或Low Poly风格的独立游戏开发者来说&#x…...

自建个人数字图书馆:基于Go+Vue+SQLite的Alexandria部署与优化指南

1. 项目概述&#xff1a;一个现代数字图书馆的诞生如果你和我一样&#xff0c;是个重度数字内容爱好者&#xff0c;硬盘里塞满了从各种渠道收集的电子书、论文、技术文档、漫画&#xff0c;甚至是整理好的网页存档&#xff0c;那你一定体会过那种“找东西”的痛苦。文件散落在不…...

SLO-Warden:云原生时代SLO自动化管理的工程实践

1. 项目概述&#xff1a;当SLO成为运维的“紧箍咒”在云原生和微服务架构成为主流的今天&#xff0c;服务的稳定性和可靠性不再是锦上添花&#xff0c;而是业务的生命线。对于运维工程师和SRE&#xff08;站点可靠性工程师&#xff09;而言&#xff0c;我们每天都在和各种指标、…...

如何用DankDroneDownloader实现无人机固件完全掌控:Windows用户终极指南

如何用DankDroneDownloader实现无人机固件完全掌控&#xff1a;Windows用户终极指南 【免费下载链接】DankDroneDownloader A Custom Firmware Download Tool for DJI Drones Written in C# 项目地址: https://gitcode.com/gh_mirrors/da/DankDroneDownloader 你是否曾因…...

【限时技术白皮书】ElevenLabs尼泊尔文语音质量评估体系(含MOS打分标准、基线数据集、及与Google Cloud Text-to-Speech Nepali v1.3对比)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs尼泊尔文语音质量评估体系概述 ElevenLabs 对尼泊尔文&#xff08;नेपाली&#xff09;语音合成的支持虽属新兴能力&#xff0c;但其质量评估需兼顾语言学特性、声学保真度与文化适配性…...

声明式工作流编排框架:从计划到执行的自动化实践

1. 项目概述&#xff1a;从“计划清单”到“框架”的蜕变如果你和我一样&#xff0c;在职业生涯中经历过从零到一构建复杂应用&#xff0c;或者维护过多个技术栈各异、需求多变的项目&#xff0c;那你一定对“计划”和“清单”这两个词深有感触。我们每天都在做计划&#xff0c…...

大语言模型记忆增强框架:LightMem原理、实现与工程实践

1. 项目概述&#xff1a;当大模型遇上“记忆”瓶颈最近在折腾大语言模型&#xff08;LLM&#xff09;应用开发的朋友&#xff0c;估计都遇到过同一个头疼的问题&#xff1a;模型记不住事儿。你精心设计了一个对话系统&#xff0c;希望它能记住用户的历史偏好&#xff0c;比如“…...