- 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》

         本文属于专栏《构建工业级QPS百万级服务》​​​​​        


 1、前置知识        

        c++的内存管理,主要说的是堆内存管理。现代计算机系统中,用户进程的堆内存,由内核映射。

  • 堆内存的来源
    •  主要是通过mmap()函数,在进程的虚拟地址空间中创建新的映射
  •  为什么需要malloc
    •  因为mmap()是按照page size(一般是4096字节)分配的,如果是程序员直接使用很容易照成浪费,高效地使用内存,是共同需求,所以有了malloc
  • 为什么需要tcmalloc和jemalloc
    •  malloc在内存碎片和多线程性能方面做得不好
  • 三方的内存管理库运行原理,就是alias malloc和free函数以及operator new(注意不是new operator)
#define ALIAS(tc_fn)   __attribute__ ((alias (#tc_fn), used))

extern "C" { 
  void* malloc(size_t size) __THROW               ALIAS(tc_malloc);
  void free(void* ptr) __THROW                    ALIAS(tc_free);
}   // extern 
  • 两个常用的内存分配算法
    •  Buddy allocation:连续的内存,分配时不断折半,直到刚好满足需要的内存
    • Slab allocation:将内存管理起来,分成很多个大小相同的小片,用一个管理类去记录内存的分配和释放

2、TCMalloc(Thread Cache Malloc)

  • 实现原理:
  • 首先,glibc中,内存分配相关的函数都是弱符号,TCMalloc定义了自己的函数并将其覆盖
    • 主要思想是每个线程有自己的缓存,在自己线程缓存不够用时,找Central Heap
    • 内存分配时,不同大小有不同的策
      • 小内存:
        • 每个线程缓存有一个单链表,每个节点后面跟着的也是一个链表,如下图,calss0 位8bytes,class1为16bytes,class2为32bytes。当thread cache不够,就找central heap,当central heap不够,就找内核分配。如果Thread Cache的链太短,会频繁找去central分配(自旋锁),如果太长会浪费一些空间
        • tcmalloc_max_total_thread_cache_bytes参数表示的是在当前thread cache中,最多的缓存的不释放回central cache的内存。设置太低会导致在高qps的服务中,有频繁释放和申请小内存时,会和central cache交互频繁,导致加锁太多
        • 为了设置合适的free list(class 0 后面跟着的链表)长度,使用了慢启动算法来决定每个独立的free list的链表长度,频繁的申请会增加长度,频繁的释放会抑制长度
      • 中内存CentralCache(256kb <= size <= 1MB)
        • 这里的个page为8kb
      • 大内存PageHeap,从pageHeap中找,如果没有就向OS申请
      • 调优化经验
        • 对于应用使用堆内存量大的,如几个G甚至上百G的。虽然版本不同,但是一般给每个线程默认管理的内存大小不超过100M。所以在高配置应用中,使用TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES来增加单个线程可管理的内存是有显著性能提升的。如:export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=1073741824

3、JeMalloc

  • 与tcmalloc类似,只是中内存不是从central heap中取,还是从线程的缓存中取,jemalloc的线程缓存管理范围更广,更复杂,但是效率更高
  • 原理
    • 几个名词
      • page ,操作系统提供的内存,来自于mmap
      • chunk,jemalloc申请内存的大小单位,是page size的n倍,默认2Mb
      • base,jemalloc自身使用的堆内存结构
      • arena,jemalloc最重要的部分,内存管理器(每个线程一个),分配算法是Buddy和Slab的组合
        • chunk 使用buddy算法划分不同的run,run使用不同的算法划分固定大小的region,大部分内存分配直接查找对应的run,从中分配空闲的region
      • bin:bin管理相同类型的run,记录了run相关信息。用红黑树管理有空闲的region的run,并按照地址排序
    • 分配流程
      • small内存去bin管理的内存中找,bin找不到再去arena管理的内存找
      • large的直接去arena中找
      • huge也是去arena找,只是这里用的是线程共享的arena,但是这里频率很低,影响小

          所以一般来说,频繁创建和删除线程的使用tcmalloc,用固定线程的使用jemalloc效率更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/387701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux技术宝典】深入理解Linux基本指令:命令行新手指南

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅Linux技术宝典 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、Linux下基本指令1. ls 指令2. pwd指令3. clear指令4. cd指令什么是家目录&#xf…

【AI视野·今日Robot 机器人论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 17 Jan 2024 Totally 49 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Safe Mission-Level Path Planning for Exploration of Lunar Shadowed Regions by a Solar-Powered Rover Authors Olivier L…

【Pandas 统计函数和自定义函数的使用】

文章目录 前言一、统计函数1. 描述性统计2. 直方图 二、自定义函数1. 自定义函数示例 总结 前言 Pandas 是基于 NumPy 的数据分析工具&#xff0c;它提供了各种数据结构&#xff0c;如 Series 和 DataFrame&#xff0c;以及各种功能强大的函数&#xff0c;用于数据的统计、清洗…

随机过程及应用学习笔记(四) 马尔可夫过程

马尔可夫过程是理论上和实际应用中都十分重要的一类随机过程。 目录 前言 一、马尔可夫过程的概念 二、离散参数马氏链 1 定义 2 齐次马尔可夫链 3 齐次马尔可夫链的性质 三、齐次马尔可夫链状态的分类 四、有限马尔可夫链 五、状态的周期性 六、极限定理 七、生灭过…

Android adb使用超级大全

Android adb使用超级大全 ADB&#xff0c;即Android Debug Bridge&#xff0c;是一款强大的工具&#xff0c;对于Android开发/测试人员来说是不可或缺的&#xff0c;同时也是Android设备玩家的好玩具。本文将详细介绍ADB的使用方法。 ADB的基本用法如下&#xff1a; 命令语法…

chatglm3-6b使用

源码地址 GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 创建环境 conda create -n chatglm36 python3.11.7 修改源码中依赖&#xff0c;使得使用cuda&#xff0c;否则太慢了 pip3 install torch2.1.2 torchvision0.16.2 to…

SpringBoot3 + Vue3 由浅入深的交互 基础交互教学

说明&#xff1a;这篇文章是适用于已经学过SpringBoot3和Vue3理论知识&#xff0c;但不会具体如何实操的过程的朋友&#xff0c;那么我将手把手从教大家从后端与前端交互的过程教学。 目录 一、创建一个SpringBoot3项目的和Vue3项目并进行配置 1.1后端配置: 1.1.1applicatio…

C语言第二十四弹---指针(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、数组和指针笔试题解析 1.1、字符数组 1.1.1、代码1&#xff1a; 1.1.2、代码2&#xff1a; 1.1.3、代码3&#xff1a; 1.1.4、代码4&#xff1a; 1…

StringJoiner

JDK8开始有&#xff0c;用来操作字符串&#xff0c;不仅可以提高字符串的操作效率&#xff0c;而且在某些场景使用它操作字符串&#xff0c;代码会更加简洁。 import java.util.StringJoiner;public class Test {public static void main(String[] args) {//StringJoiner的应用…

ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)

ChatGPT高效提问—prompt实践&#xff08;漏洞风险分析-重构建议-识别内存泄漏&#xff09; 1.1 漏洞和风险分析 ChatGPT还可以帮助开发人员预测代码的潜在风险&#xff0c;识别其中的安全漏洞&#xff0c;而不必先运行它&#xff0c;这可以让开发人员及早发现错误&#xff0…

探索设计模式的魅力:创建型设计模式的比较与决策

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…

【漏洞扫描】网络空间安全工具—Goby 快速入门使用指南

下载地址 Goby&#xff08;含1322个POC&#xff09; v2.8.9 社区版 介绍 Goby是一款基于网络空间测绘技术的新一代网络安全工具&#xff0c;它通过给目标网络建立完整的资产知识库&#xff0c;进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别&#xff0c;目前…

串行通信的艺术:深入解析UART与奇偶校验

发送数据位是电流传输吗&#xff1f; 在UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通信中&#xff0c;发送数据位不直接以电流的形式传输。而是通过改变电压水平或者光信号&#xff08;在光纤通信中&#xff09;来表示不同的数据位&#xff08…

C#利用接口实现选择不同的语种

目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 &#xff08;1&#xff09;检查给定字符串中是否包含中文字符 &#xff08;2&#xff09;编码和还原前后 6.Encoding.GetS…

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

数仓建模—数据网格

数据网格 随着数字化时代的到来,近几年数据领域的新技术概念不断涌现,无论是数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格,很多还爬上了Gartner曲线,其中数据网格备受关注,数据网格从字面意思来看挺抽象的,会劝退很多人,但当你深入去理解这个概念时,才…

数据存储以及内存

数据在内存中的存储是因不同的类型而不同的。 但首先我们需要知道的是&#xff0c;在C语言中&#xff0c;数据在内存中的存储是以变量的形式存储的。每个变量都有一个地址&#xff0c;指向内存中的特定位置。变量的值存储在这个地址对应的内存单元中。不同类型的变量在内存中占…

react【三】受控组件/高阶组件/portals/fragment/严格模式/动画

文章目录 1、受控组件1.1 认识受控组件1.2 checkout1.3 selected1.4 非受控组件 2、高阶组件2.1 认识高阶组件2.2 应用1-props增强的基本使用2.3 对象增强的应用场景-context共享2.4 应用2-鉴权2.5 应用3 – 生命周期劫持2.6、高阶组件的意义 3、Portals4、fragment5、StrictMo…

【无标题】Matlab之annotation函数——创建图形注释(箭头、椭圆、矩形)

应用1&#xff1a;创建文本箭头注释 创建一个简单线图并向图窗添加文本箭头。用归一化的图窗坐标指定文本箭头位置&#xff0c;起点为 (0.3,0.6)&#xff0c;终点为 (0.5,0.5)。通过设置 String 属性指定文本说明。 figure plot(1:10) x [0.3 0.5]; y [0.6 0.5]; annotation…

Linux网络基础1

目录 计算机网络背景协议OSI七层模型TCP/IP五层&#xff08;四层&#xff09;模型网络传输基本流程以太网通信原理IP地址理解 计算机网络背景 到目前为止&#xff0c;我们之前所有的编程都是单机的&#xff0c;不是多机互联。以前计算机被发明的时候是为了军事用途&#xff0…
最新文章