使用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,在接收到SIGUSR1信号10时打印程序的堆栈信息。 1. 编译jemalloc 首先,确保你已经编译并安装了启用prof功能的jemalloc。以下是ubuntu18.04上的编译步骤: git c…...
树的4种遍历
目录 树的四种遍历方式的总结 1. 前序遍历(Pre-order Traversal) 2. 中序遍历(In-order Traversal) 3. 后序遍历(Post-order Traversal) 4. 层序遍历(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,A中各座位到司机处的距离h是随着座位的不同而不同的变数,例如5号座位到司机处的距离是h3,…h5,…。A移动了一段距离变为汽车B≌A,B中5号座位到司机处的距离h’h3,…h’h5…...
【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现
🔥 个人主页:空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着…...
MapStruct的用法总结及示例
MapStruct是一个代码生成器,它基于约定优于配置的原则,使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码,提高开发效率,并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…...
redis 05 复制 ,哨兵
01.redis的复制功能,使用命令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的世界里,存在了一些看起来还不错的模版引擎,比如poi-tl看起来就很不错,但是那是人家Javer们专属的,与我们.Neter关系不大。.NET的世界里Word模版引擎完全是一个空白。 很多人不得不采用使用Word XML结合其他的模版引擎来…...
MySQL中所有常见知识点汇总
存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图: 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分: 连接器:负责跟客户端建立连 接、获取权限、维持和管理…...
Flink 基于 TDMQ Apache Pulsar 的离线场景使用实践
背景 Apache Flink 是一个开源的流处理和批处理框架,具有高吞吐量、低延迟的流式引擎,支持事件时间处理和状态管理,以及确保在机器故障时的容错性和一次性语义。Flink 的核心是一个分布式流数据处理引擎,支持 Java、Scala、Pytho…...
远程访问及控制
SSH协议 是一种安全通道协议 对通信数据进行了加密处理,用于远程管理 OpenSSH(SSH由OpenSSH提供) 服务名称:sshd 服务端控制程序: /usr/sbin/sshd 服务端配置文件: /etc/ssh/sshd_config ssh存放的客户端的配置文件 ssh是服务端额…...
【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416
【代码随想录训练营】【Day 44】【动态规划-4】| 卡码 46, Leetcode 416 需强化知识点 背包理论知识 题目 卡码 46. 携带研究材料 01 背包理论基础01 背包理论基础(滚动数组)01 背包 二维版本:dp[i][j] 表示从下标为[0-i]的物…...
html5实现个人网站源码
文章目录 1.设计来源1.1 网站首页页面1.2 个人工具页面1.3 个人日志页面1.4 个人相册页面1.5 给我留言页面 2.效果和源码2.1 动态效果2.2 目录结构 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/139564407 ht…...
【内存管理】内存布局
ARM32位系统的内存布局图 32位操作系统的内存布局很经典,很多书籍都是以32位系统为例子去讲解的。32位的系统可访问的地址空间为4GB,用户空间为1GB ~ 3GB,内核空间为3GB ~ 4GB。 为什么要划分为用户空间和内核空间呢? 一般处理器…...
软件试运行方案(Word)
软件试运行方案(直接套用实际项目,原件获取通过本文末个人名片直接获取。) 一、试运行目的 二、试运行的准备 三、试运行时间 四、试运行制度 五、试运行具体内容与要求...
Redis原理篇——哨兵机制
Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要,一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢? 2.哨兵工作原理 …...
web前端的MySQL:跨领域之旅的探索与困惑
web前端的MySQL:跨领域之旅的探索与困惑 在数字化浪潮的推动下,web前端与MySQL数据库似乎成为了两个不可或缺的领域。然而,当我们将这两者放在一起,尝试探索web前端与MySQL之间的交互与关联时,却发现这是一次充满困惑…...
Postgresql源码(135)生成执行计划——Var的调整set_plan_references
1 总结 set_plan_references主要有两个功能: 拉平:生成拉平后的RTE列表(add_rtes_to_flat_rtable)。调整:调整前每一层计划中varno的引用都是相对于本层RTE的偏移量。放在一个整体计划后,需要指向一个统一…...
Python魔法之旅专栏(导航)
目录 推荐阅读 1、Python筑基之旅 2、Python函数之旅 3、Python算法之旅 4、博客个人主页 首先,感谢老铁们一直以来对我的支持与厚爱,让我能坚持把Python魔法方法专栏更新完毕! 其次,为了方便大家查阅,我将此专栏…...
Python第二语言(五、Python文件相关操作)
目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件:write与flush 4. 文件的追加操作 5. 文件操作的综合案例(文件备份操作&#x…...
Vue3 组合式 API:依赖注入(四)
provide() provide() 函数是用于依赖注入的一个关键部分。这个函数允许你在组件树中提供一个值或对象,使得任何子组件(无论层级多深)都能够通过 inject() 函数来访问这些值。 import { provide, ref } from vue; export default { setup(…...
Vue如何引入ElementUI并使用
Element UI详细介绍 Element UI是一个基于Vue 2.0的桌面端组件库,旨在构建简洁、快速的用户界面。由饿了么前端团队开发,提供丰富的组件和工具,帮助开发者快速构建高质量的Vue应用,并且以开放源代码的形式提供。 1. VueElementU…...
VS2019 QT无法打开 源 文件 “QTcpSocket“
VS2019 QT无法打开 源 文件 "QTcpSocket" QT5.15.2_msvc2019_64 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "QTcpSocket" auto_pack_line_demo D:\vs_qt_project\auto_pack_line_de…...
【Golang】Map 稳定有序遍历的实现与探索:保序遍历之道
【Golang】Map 稳定有序遍历的实现与探索:保序遍历之道 大家好 我是寸铁👊 总结了一篇【Golang】Map 稳定有序遍历的实现与探索:保序遍历之道✨ 喜欢的小伙伴可以点点关注 💝 前言🍎 在计算机科学中,数据结…...
使用Nextjs学习(学习+项目完整版本)
创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…...
KUKA机器人KRC5控制柜面板LED显示
对于KUKA机器人新系列控制柜KRC5控制柜来说,其控制柜面板LED布局如下图: 其中①②③④分别为: 1、机器人控制柜处于不同状态时,LED显示如下: 2、机器人控制柜正在运行时: 3、机器人控制柜运行时出现的故障…...
为什么选择Python作为AI开发语言
为什么Python适合AI 在当前的科技浪潮中,人工智能(AI)无疑是最热门的话题之一。无论是自动驾驶、智能推荐还是自然语言处理,AI都在不断改变我们的生活。而在这场技术革命中,Python作为主要的编程语言之一,…...
【算法篇】求最长公共前缀JavaScript版本
题目描述 给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。 数据范围: 数据范围:0<n<5000,0<len(strsi)< 5000 进阶:空间复杂度 O(1)&a…...
搭建RocketMQ主从异步集群
搭建RocketMQ主从异步集群 1、RocketMQ集群模式 为了追求更好的性能,RocketMQ的最佳实践方式都是在集群模式下完成的。RocketMQ官方提供了三种集群搭建方式: 2主2从异步通信方式:使用异步方式进行主从之间的数据复制。吞吐量大,…...
如何仿造一个网站做/成都seo排名
📄个人主页:胖虎不秃头 ✨个人简介:Java领域新星创作者,随时准备跑路的大二学生 🔥精品专栏:有这一个就够了 🌈个人名言:知道的越多,不知道的越多 💥刷题神器…...
做复印机的模板网站/宁波公司做网站
原文:http://unitjs.com/guide/introduction.html unit.js是一个javascript断言库,该库可以在node.js与浏览器上运行。它适用于任何测试runner和单元测试框架,如mocha、jasmine、karma、protractor(角度应用程序的E2E测试框架)、qunit等。 …...
网站推广方法有哪些/百度登陆页面
static int round(float a)描述 (Description)java.lang.StrictMath.round(float a)方法返回与参数最接近的int。 结果通过添加1/2来舍入为整数,取结果的底限,并将结果转换为int类型。它包括这些情况 -如果参数为NaN,则结果为0。如果参数为负…...
网站建设工作室简介/俄罗斯搜索引擎yandex官网入口
一、查看并配置环境变量 ①在控制面板——系统与安全——系统,点击远程设置弹出“系统属性”的弹框,选择“高级”,就可以找到“环境变量”(win10用户可以直接用Cortana搜索“编辑系统环境变量”) ②在系统变量中添加…...
做科技汽车的视频网站有哪些/世界十大搜索引擎排名
原标题:搞笑GIF段子:植发三天了,越来越粗壮了!!搞笑GIF段子:植发三天了,越来越粗壮了!!1.植发三天了,越来越粗壮了!!2.人在屋檐下不得…...
上线后wordpress后台无法登陆/短视频获客系统
2019独角兽企业重金招聘Python工程师标准>>> 软件工程 软件工程是一个很复杂的东西,我们需要问题定义,可行性分析,需求分析等等一系列的步骤,但是要说我最不能忍受的,就是word这个东西,我们其实…...