用jemalloc代替glibc默认ptmalloc进一步提升服务器性能和负载

2023-11-13

     启动redis时,无意中看到redis的启动信息有一个jemalloc的版本信息,处于好奇了解了一下,它是一个进一步提升服务器负载和性能的神器。

一  Ptmalloc

      Linux 系统在装载 elf 格式的程序文件时,会调用 loader 把可执行文件中的各个段依次载入到从某一地址开始的空间中(载入地址取决 link editor(ld)和机器地址位数,在 32 位机器上是 0x8048000,即 128M 处)。如下图所示,以 32 位机器为例,首先被载入的是.text 段,然后是.data 段,最后是.bss 段。这可以看作是程序的开始空间。程序所能访问的最后的地址是 0xbfffffff,也就是到 3G 地址处,3G 以上的 1G 空间是内核使用的,应用程序不可以直接访问。应用程序的堆栈从最高地址处开始向下生长,.bss 段与堆栈之间的空间是空闲的,空闲空间被分成两部分,一部分为 heap,一部分为 mmap 映射区域,mmap 映射区域一般从 TASK_SIZE/3 的地方开始,但在不同的 Linux 内核和机器上,mmap 区域的开始位置一般是不同的。Heap 和 mmap 区域都可以供用户自由使用,但是它在刚开始的时候并没有映射到内存空间内,是不可访问的。在向内核请求分配该空间之前,对这个空间的访问会导致segmentation fault。用户程序可以直接使用系统调用来管理 heap 和 mmap 映射区域,但更多的时候程序都是使用 C 语言提供的 malloc()和 free()函数来动态的分配和释放内存。Stack区域是唯一不需要映射,用户却可以访问的内存区域,这也是利用堆栈溢出进行攻击的基础。

      Linux 中 malloc 的早期版本是由 Doug Lea 实现的,它有一个重要问题就是在并行处理时多个线程共享进程的内存空间,各线程可能并发请求内存,在这种情况下应该如何保证分配和回收的正确和高效。Wolfram Gloger 在 Doug Lea 的基础上改进使得 Glibc 的 malloc 可以支持多线程——ptmalloc,在glibc-2.3.x.中已经集成了ptmalloc2,这就是我们平时使用的malloc,目前 ptmalloc 的最新版本 ptmalloc3。ptmalloc2 的性能略微比 ptmalloc3 要高一点点。ptmalloc 实现了 malloc(),free()以及一组其它的函数. 以提供动态内存管理的支持。分配器处在用户程序和内核之间,它响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序,为了保持高效的分配,分配器一般都会预先分配一块大于用户请求的内存,并通过某种算法管理这块内存。来满足用户的内存分配要求,用户释放掉的内存也并不是立即就返回给操作系统,相反,分配器会管理这些被释放掉的空闲空间,以应对用户以后的内存分配要求。也就是说,分配器不但要管理已分配的内存块,还需要管理空闲的内存块,当响应用户分配要求时,分配器会首先在空闲空间中寻找一块合适的内存给用户,在空闲空间中找不到的情况下才分配一块新的内存。为实现一个高效的分配器,需要考虑很多的因素。比如,分配器本身管理内存块所占用的内存空间必须很小,分配算法必须要足够的快。

   Ptmalloc 在设计时折中了高效率,高空间利用率,高可用性等设计目标。在其实现代码中,隐藏着内存管理中的一些设计假设,由于某些设计假设,导致了在某些情况下 ptmalloc的行为很诡异。这些设计假设包括:
1. 具有长生命周期的大内存分配使用 mmap。
2. 特别大的内存分配总是使用 mmap。
3. 具有短生命周期的内存分配使用 brk,因为用 mmap 映射匿名页,当发生缺页异常时,linux 内核为缺页分配一个新物理页,并将该物理页清 0,一个 mmap 的内存块需要映射多个物理页,导致多次清 0 操作,很浪费系统资源,所以引入了 mmap
分配阈值动态调整机制,保证在必要的情况下才使用 mmap 分配内存。
4. 尽量只缓存临时使用的空闲小内存块,对大内存块或是长生命周期的大内存块在释放时都直接归还给操作系统。
5. 对空闲的小内存块只会在 malloc 和 free 的时候进行合并,free 时空闲内存块可能放入 pool 中,不一定归还给操作系统。
6. 收缩堆的条件是当前 free 的块大小加上前后能合并 chunk 的大小大于 64KB、,并且堆顶的大小达到阈值,才有可能收缩堆,把堆最顶端的空闲内存返回给操作系统。
7. 需要保持长期存储的程序不适合用 ptmalloc 来管理内存。
8. 为了支持多线程,多个线程可以从同一个分配区(arena)中分配内存,ptmalloc假设线程 A 释放掉一块内存后,线程 B 会申请类似大小的内存,但是 A 释放的内存跟 B 需要的内存不一定完全相等,可能有一个小的误差,就需要不停地对内存块作切割和合并,这个过程中可能产生内存碎片。

     如果对想深入了解ptmalloc的内存管理方式,看大神的研究成果吧,比较晦涩难懂:http://www.valleytalk.org/wp-content/uploads/2015/02/glibc%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86ptmalloc%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%901.pdf

二  jemalloc

       jemalloc是一个能够快速分配/回收内存,减少内存碎片,对多核友好,具有可伸缩性的内存分配器。为更好的支持多核内存分配的需要,jemalloc首次在FreeBSD中引,而后被facebook发扬光大,成为了业界流行的内存分配解决方案之一。

      jemalloc的内存管理采用层级架构, 分别是线程缓存tcache, 分配区arena和系统内存memory, 不同大小的内存块对应不同的分配区。每个线程对应一个tcache, 负责当前线程使用内存块的快速申请和释放, 避免线程间锁的竞争和同步。分配arena的具体结构在前文已经提到, 采用内存池的思想对内存区域进行合理的划分和管理, 在有效保证低内存碎片的情况下实现不同大小内存块的高效管理。 system memory是系统的内存区域。

     small object:当jemalloc支持tcache时, small object的分配从tcache开始, tcache不中则从arena申请run并将剩余区域缓存到tcache, 若从arena中不能分配再从system memory中申请chunk加入arena进行管理, 不支持tcache时, 则直接从arena中申请。
     arge object: 当jemalloc支持tcache时, 如果large object的size小于tcache_maxclass,则从tcache开始分配, tcache不中则从arena申请, 只申请需要的内存块, 不做多余cache, 若从arena中不能分配则从system memory中申请。当large object的size大于tcache_maxclass或者jemmalloc不支持tcache时, 直接从arena中申请。
     huge object: huge object的内存不归arena管理, 直接采用mmap从system memory中申请并由一棵与arena独立的红黑树进行管理。
      jemalloc引入线程缓存tcache, 分配区arena来减少线程间锁的争用, 保证线程并发扩展性的同时实现了内存的快速申请释放
采用arena管理不同大小的内存对象在保证内存高效管理的同时减少了内存碎片引入红黑树管理空闲run和chunk, 相比链表具有了更高的效率在run中采用bitmap管理可分配区域来实现管理和数据分离, 且能够更快地定位到空闲区域引入了多层cache, 基于内存池的思想, 虽然增加了内存占用, 但实现了内存的快速申请释放, 除了tcache,还有bin中的runcur, arena中的spare等。

      以上知识一些简单的介绍,当然也都是搜集来的一些简要的概括,更详细的列出一些好的文章(说实话这些东西看起来确确实优点费脑子):

   1  内存优化总结:ptmalloc、tcmalloc和jemalloc:http://www.cnhalo.net/2016/06/13/memory-optimize/,里面有一些详细的性能数据对比,可以看一下。

   2 jemalloc 的源码分析:http://www.thinkingyu.com/articles/jemalloc/

   3 几种malloc实现原理 ptmalloc  tcmalloc jemallochttps://blog.csdn.net/huangynn/article/details/50700093

三  使用jemalloc 

     首先 git clone https://github.com/jemalloc/jemalloc.git
     为了验证是否替换成功,我们现在源码的关键函数处加一些log

    jemalloc_cpp.cpp  

  jemalloc.c

进入源码木目录: ./autogen.sh && make && sudo make install 

安装过程中会提示autoconf版本过低,先升级下autoconf,还会提示doc目录下缺少几个文件,直接touch + 缺少文件名,创建空文件即可

class CJeMallocTest {
    int a;
    char b;
};

int main ()
{
  CJeMallocTest* cMallocTest  = (CJeMallocTest*)malloc (sizeof (CJeMallocTest));
  free (cMallocTest);
  CJeMallocTest* cppJeMallocTest  = new CJeMallocTest;
  delete cppJeMallocTest;
  cppJeMallocTest = nullptr;
}

    编译的时候-ljemalloc 即可

     

运行结果

  最后把添加的log去掉重新编译编译安装。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用jemalloc代替glibc默认ptmalloc进一步提升服务器性能和负载 的相关文章

  • 数据库设计中常见表结构的设计技巧

    一 树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据 例如常见的类别表 即一个大类 下面有若干个子类 某些子类又有子类这样的情况 当类别不确定 用户希望可以在任意类别下添加新的子类 或者删除某个类别和其下的所有子类
  • 《大型网站技术架构》序

    推荐序一 1 传统企业应用于大型网站应用的区别 传统的企业应用系统主要面对的技术挑战是处理复杂凌乱 干变万化的所谓业务逻辑 而大型网站主要面对的技术挑战是处理超大量的用户访问和海量的数据处理 前者的挑战来自功能性需求 后者的挑战来自非功能性
  • Flume系统搭建和使用的一些经验总结-搭建篇

    对于很多公司来说 日志的收集和集中管理是一个必然要经历的阶段 我们公司在经历了一拖再拖之后 终于不得不开始搭建日志收集系统了 对于日志收集系统 我们的首选就是Flume 为何这么坚决呢 难道没有其他工具能做个这个事情么 当然有 不过 考虑到
  • 组件(component)技术介绍

    转自 http blog csdn net touzani article details 1619472 组件 component 技术是各种软件重用方法中最重要的一种方法 也是分布式计算和Web服务的基础 网络应用中的软件组件 又被称为
  • 【实践篇】DDD脚手架及编码规范

    一 背景介绍 我们团队一直在持续推进业务系统的体系化治理工作 在这个过程中我们沉淀了自己的DDD脚手架项目 脚手架项目是体系化治理过程中比较重要的一环 它的作用有两点 1 可以对新建的项目进行统一的规范 2 对于指导老项目进行DDD的改造提
  • 由一次mycat+mysql水平拆分集群问题引发的思考

    近段时间部署和测试了一个mycat 4 Percona tokudb的水平拆分集群 前段应用是将一类奖状数据不断地写入到这个库中 只有insert操作 前几天运行状态还比较好 从昨天开始 由于业务量突然增加了一些 磁盘IO负载变得很高 而且
  • 也谈系统设计的一些原则

    在进行系统设计时 不仅要考虑软件的功能性需求 还要考虑非功能性需求 比如软件的性能 Performance 可扩展性 Scalability 系统的稳定性 Reliability 部署 Deployment 和更新 Upgrade 可维护性
  • 大型网站架构核心要素之扩展性:可扩展架构

    前言 续上节大型网站架构核心要素性能之后 我们今天要讲的是第四个要素 扩展性 什么叫扩展性呢 简单的说就是在对现有系统影响最小的情况下 系统功能可持续扩展及提升的能力 讲扩展性之前 我先讲下扩展性和伸缩性的区别 因为这两个点经常有人会混淆
  • 构建SOA架构(笔记)

    1 什么是SOA架构设计师与设计和开发人员之间的差别呢 相信这些都是使大家最容易产生迷惑的问题 举个实际的例子来说 当构建一个基于SOA架构的系统的时候 针对一个具体的 service 系统设计人员主要应该关注的是这个service能够为外
  • 设计模式之六大原则

    关于设计模式的六大设计原则的资料网上很多 但是很多地方解释地都太过于笼统化 我也找了很多资料来看 发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂 因此转载过来 原作者博客链接 http blog csdn net LoveLi
  • 如何实现IM即时通信系统(一)

    在企业数字化建设过程中 如何与客户保持线上链接是重要的组成部分 而IM通信系统就属于数字化建设的基础设施 那么 如何实现一个符合企业需求的IM系统呢 采购当然是其中需要考虑的方式之一 但就我个人的经验来看 市面上好的IM厂商很稀少 因为IM
  • 做个成功的管理者

    什么是 管理 大家对这词都不陌生 但什么才是真正的管理呢 管理的真谛在 理 不在 管 管理者的主要职责就是建立一个合理的游戏规则 让每个员工按照游戏规则自我管理 游戏规则要兼顾公司的利益和个人的利益 并且把公司的利益和个人的利益统一起来 尽
  • 腾讯高性能RPC开发框架Tars实现服务治理(微服务)

    Github https github com Tencent Tars 1 介绍 Tars是基于名字服务使用Tars协议的高性能RPC开发框架 同时配套一体化的服务治理平台 帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用
  • 思考:如何保证服务稳定性?

    最近一直在忙618大促的全链路压测 稳定性保障相关工作 结果618还未开始 生产环境就出了几次生产故障 且大多都是和系统稳定性 性能相关的bad case 生产全链路压测终于告一段落 抽出时间将个人收集的稳定性相关资料整理review了一遍
  • 架构设计之道【精】

    一 本质 在了解架构本质之前先了解下架构的定义 百度百科对架构的定义 架构又名软件架构 是有关软件整体结构与组件的抽象描述 用于指导大型软件系统各个方面的设计 从定义中我们提炼出几个关键字 组件 结构 关系 组件 也可以称为软件元素或者是架
  • 大型网站架构核心要素之可用性:高可用架构

    前言 上节我们讲了网站核心要素之性能 这节我们接着讲第二个核心要素可用性 网站的可用性 描述的是一个网站是否可以正常使用的特性 这个特性是比较关键的 直接影响公司形象和利益 因此也有很多大公司把这点作为技术人员的绩效考核之一 既然那么重要
  • 基于 UML 的业务建模举例

    基于 UML 的业务建模 2011 05 30 作者 杨敏强 来源 网络 简介 对于管理流程咨询项目 大型信息化建设项目和套装管理软件实施项目 对业务环境的分析和理解对项目的成功至关重要 系统 全面理解 IT 系统所处的业务环境 可以帮助
  • 量化交易框架开发实践(一)

    量化交易平台指支持通过对数据进行多维度的定量分析 结合发现的特征定制策略 并能够基于历史数据对策略进行回测 最后支持实盘买卖的交易平台 从业务流上看 量化交易可以分解成 行情获取 gt 数据清洗 gt 指标计算 gt 策略开发 gt 策略回
  • Redis——Redis简介

    Redis是目前最流行的键值对 key value 数据库 以出色的性能著称 官方提供的数据是可以支持100000以上的 QPS Redis具有高性能的主要原因如下 Redis是基于内存的存储数据库 绝大部分的命令处理只是纯粹的内存操作 内
  • Redis HyperLogLog:数据统计的轻量级解决方案

    引言 在现代数据驱动的应用中 Redis 以其出色的性能和灵活性成为了不可或缺的工具 特别是在统计大量数据时 传统的计数方法往往既耗时又占用大量存储空间 这次 阿七将介绍一种名为 HyperLogLog 的算法 它在 Redis 中的实现让

随机推荐

  • adb server version (31) doesn't match this client

    报错信息如下 C Users linux gt adb shell adb server version 31 doesn t match this client 36 killing daemon started successfully
  • 超详细的Elasticsearch教程

    一 Elasticsearch介绍和安装 用户访问我们的首页 一般都会直接搜索来寻找自己想要购买的商品 而商品的数量非常多 而且分类繁杂 如何能正确的显示出用户想要的商品 并进行合理的过滤 尽快促成交易 是搜索系统要研究的核心 面对这样复杂
  • Expected object of backend CPU but got backend CUDA for argument #2 'weight' 报错的问题和解决办法

    很实用的工具 https blog csdn net zz2230633069 article details 93266950
  • GIT的使用

    GIT 的常规操作 常规操作也是我自己平时常用的几个命令 学自于 pro git 这本书中 git 配置文件 git的配置文件位置 针对所有用户 etc gitconfig 针对当前用户 gitconfig 查看配置的方法 git conf
  • 图像匹配算法

    图像匹配算法分为3类 基于灰度的匹配算法 基于特征的匹配算法 基于关系的匹配算法 1 基于灰度的模板匹配算法 模板匹配 Blocking Matching 是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像 基于灰度的匹配算法也称作
  • PowerShell 语法

    PowerShell是微软公司开发的一种任务自动化和配置管理框架 基于 NET框架 以下是PowerShell的一些常用语法 命令语法 标准命令语法 如 Get ChildItem 活动目录命令语法 如 Get ADUser 参数 格式为
  • 人生苦短,我用python

    如果你看到一个人穿着一个短袖 短袖上面印着 人生苦短 我用python 不用怀疑 他一定是一个python程序员 作为编程热门语言排行榜首的python 有着强大的粉丝社区 因为它的简洁 越来越多的人喜欢上了它 而这个语言 就是由吉多 范罗
  • Springboot内置Tomcat线程数测试

    SpringBoot 2 7 3 本文主要介绍SpringBoot内置Tomcat的主要参数 解析最大线程数和最大连接数的作用方式 SpringBoot各版本的参数配置可能不完全一样 本文以2 7 3版本为例进行试验 一 默认配置 Spri
  • python实验一

    1 输入带有py的字符串 替换其中出现的字符串py为python输出替换后的字符串 s input 输入带有py的字符串 print s replace py python 运行结果 2 获得用户输入的一个字符串 请输出其全小写形式 s i
  • python学习(1)图像处理指令解析

    1 img i j c i表示图片的行数 j表示图片的列数 c表示图片的通道数 RGB三通道分别对应0 1 2 坐标是从左上角开始 灰度图片访问方式为 gray i j 2 生成椒盐噪声 from skimage import io dat
  • printf标识总结(转)

    printf标识总结 转 Dev C 下基本数据类型学习小结 环境 Dev C 4 9 6 0 gcc mingw32 使用 Wall编译选项 基本类型包括字节型 char 整型 int 和浮点型 float double 定义基本类型变量
  • RFID盘点机如何使用

    RFID盘点机如何使用 在我们的生活中 RFID技术应用广泛 比如固定资产管理 一套完整的RFID系统主要包含RFID系统 RFID打印机 RFID读写器 RFID盘点机 RFID标签 缺一不可 作为RFID系统中的重要主成部分 RFID盘
  • C# 不定长参数

    C 不定长参数 C 提供一种语法 允许你设计的一个函数可以支持传入不定长的参数 例如一个用于整数计算的Add方法 可以将传入的参数累加起来 如 Add 1 2 返回3 Add 1 2 3 放回6 代码是这样的 使用params int i作
  • 自动化测试,除了coding还需要掌握什么?

    一 自动化测试项目 自动化测试本身是一个项目 它属于业务项目的子项目 因此自动化测试项目也具有项目所有的特征 既然提到自动化测试是一个项目 那么首先需要大家理解一下为什么叫做自动化测试项目 而不单单是自动化测试 1 1 软件项目生命周期 首
  • VMware虚拟机复制文件卡死的问题

    又遇到这个问题了 于是决定解决它 在这里记录下过程 百度了一下好像是因为win10更新的原因 有人给出的对策是把虚拟机更新到15 1 不过有人更新完之后还是出问题了 懒得又卸载了重新安装 所以还是决定用文件共享的方式解决算了 或者尝试先把文
  • H5 ios10+ Safari 中实现 video/audio 自动播放小技巧

    关于Safari 中禁止音视频自动播放的问题 apple 开发者声明 https developer apple com library archive documentation AudioVideo Conceptual Using H
  • QLoRA:量化 LLM 的高效微调

    此 repo 支持论文 QLoRA 量化 LLM 的高效微调 旨在使对 LLM 研究的访问民主化 QLoRA 使用bitsandbytes进行量化 并与 Hugging Face 的PEFT和transformers库集成 QLoRA 由华
  • XXE漏洞利用技巧(由简入深)-----portswigger(XXE部分WP)

    什么是XXE XXE XML External Entity xml外部实体注入 它出现在使用XML解析器的应用程序中 XXE攻击利用了XML解析器的功能 允许应用程序从外部实体引用加载数据 攻击者可以通过构造恶意的XML实体引用来读取本地
  • 后台管理系统-canvas添加水印

    展示 第一步 untils文件 gt 创建一个shuiying js 第二步 shuiying js gt 代码 const watermark const setWatermark str str1 gt const id 1 23452
  • 用jemalloc代替glibc默认ptmalloc进一步提升服务器性能和负载

    启动redis时 无意中看到redis的启动信息有一个jemalloc的版本信息 处于好奇了解了一下 它是一个进一步提升服务器负载和性能的神器 一 Ptmalloc Linux 系统在装载 elf 格式的程序文件时 会调用 loader 把