当前位置:网站首页>替换ptmalloc,使用tcmalloc和jemalloc
替换ptmalloc,使用tcmalloc和jemalloc
2022-08-02 07:02:00 【HjasnJH】
ptmalloc
目前,linux上使用的ptmalloc实现对内存的管理,其时glibc的默认内存分配器。
ptmalloc的内存分配器中,分为主分配区main_area和非主分配区no_main_area。
1. 主分配区和非主分配区形成一个环形链表进行管理。
2. 每一个分配区利用互斥锁使线程对于该分配区的访问互斥。
3. 每个进程只有一个主分配区,也可以允许有多个非主分配区。
4. ptmalloc根据系统对分配区的争用动态增加分配区的大小,分配区的数量一旦增加,则不会减少。
5. 主分配区可以使用brk和mmap来分配,而非主分配区只能使用mmap来映射内存块
6. 申请小内存时会产生很多内存碎片,ptmalloc在整理时也需要对分配区做加锁操作。
分配释放步骤:
1、线程会尝试对分配区加锁,加锁成功,则分配完成,加锁失败,则遍历分配区。
2、释放分配区,同样会获取分配区的锁,获取到才可以释放内存
其实现目前存在如下问题:
- 如果后分配的内存先释放,无法及时归还系统。因为 ptmalloc 收缩内存是从 top chunk 开始,如果与 top chunk 相邻的 chunk 不能释放, top chunk 以下的 chunk 都无法释放。
- 内存不能在线程间移动,多线程使用内存不均衡将导致内存浪费
- 每个chunk至少8字节的开销很大
- 不定期分配长生命周期的内存容易造成内存碎片,不利于回收。
- 加锁耗时,在内存分配和释放时,会首先加锁。
所以就有了tcmalloc和jemalloc
tcmalloc
tcmalloc是Google开发的内存分配器,在Golang、Chrome中都有使用该分配器进行内存分配。有效的优化了ptmalloc中存在的问题。
TCMalloc是专门对多线并发的内存管理而设计的,TCMalloc 实现了三级缓存,分别是ThreadCache(线程级缓存),Central Cache(中央缓存:CentralFreeeList),PageHeap(页缓存),最后两级需要加锁访问。实现了线程级的无锁内存分配。如图为内存分配

ThreadCache中包含一个链表数组FreeList list_[kNumClasses],维护了不同规格的空闲内存的链表;当申请内存的时候可以直接根据大小寻找恰当的规则的内存。如果ThreadCache的对象不够了,就从 CentralCache 进行批量分配;如果 CentralCache 依然没有,就从PageHeap申请Span;Tcmalloc一次最少向系统申请1MB的内存,默认情况下,使用sbrk申请,在sbrk失败的时候,使用mmap申请。
缺点:
tcmalloc使用自旋锁虽然减少了加锁效率,但是如果使用大内存较多的情况下,内存在Central Cache或者Page Heap加锁分配。而tcmalloc对大小内存的分配过于保守,在一些内存需求较大的服务(如推荐系统),小内存上限过低,当请求量上来,锁冲突严重,CPU使用率将指数暴增。
jemalloc
jemalloc是facebook,目前在firefox,android,redis中都有使用。 jemalloc最大的优势还是其强大的多核/多线程分配能力。

jemalloc 按照内存分配请求的尺寸,分了 small object (例如 1 – 57344B)、 large object (例如 57345 – 4MB )、 huge object (例如 4MB以上)。jemalloc同样有一层线程缓存的内存名字叫tcache,当分配的内存大小小于tcache_maxclass时,jemalloc会首先在tcache的small object以及large object中查找分配,tcache不中则从arena中申请run,并将剩余的区域缓存到tcache。若arena找不到合适大小的内存块, 则向系统申请内存。当申请大小大于tcache_maxclass且大小小于huge大小的内存块时,则直接从arena开始分配。而huge object的内存不归arena管理, 直接采用mmap从system memory中申请,并由一棵与arena独立的红黑树进行管理。
jemalloc的优势
- 多线程下加锁大大减少
推荐使用:
jemalloc,相对多核环境稳定,占用内存较多,但现在内存占用基本不太时服务器的瓶颈。
参考来源
https://www.cyningsun.com/07-07-2018/memory-allocator-contrasts.html
边栏推荐
- LeetCode 2312. Sell Wood Blocks
- mysql操作入门(四)-----数据排序(升序、降序、多字段排序)
- 如何设计静态资源缓存方案
- A Preliminary Study on the Basic Principles of Formal Methods
- regular expression
- 逆变器绝缘检测检测功能及软件实现
- 有关 sql中的 concat()函数问题,如何拼接
- 查找最大的n个文件
- Ask a question, my Flinkcdc has run through, I can monitor the binlog of msql, and I can also send kafk
- mysql 注入
猜你喜欢

责任链模式(Chain Of Responsibility)

2022.07.31(LC_6132_使数组中所有元素都等于零)

概率论与数理统计
![WebGPU 导入[2] - 核心概念与重要机制解读](/img/8f/195a3b04912d8872d025df58ab5960.png)
WebGPU 导入[2] - 核心概念与重要机制解读

Chain Of Responsibility

A full review of mainstream timed task solutions

雷达人体存在感应器方案,智能物联网感知技术,实时感应人体存在

【图像去噪】基于matlab双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】

吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现

深度学习网络模型的改进与调整
随机推荐
请教一下,Flink SQL ,JDBC sink 入 mysql 库,想要搞一个自增主键,要怎么写
自然语言处理 文本预处理(上)(分词、词性标注、命名实体识别等)
(2022牛客多校五)B-Watches(二分)
MySQL database design specification
Metasploit(MSF)基础超级详细版
新产品立大功 伟世通第二季度营收双增
有趣的网站
海缆探测仪TSS350(二)
逆变器锁相原理及DSP实现
Agile, DevOps and Embedded Systems Testing
暑假第五周总结
入门opencv,欢笑快乐每一天
【图像隐藏】基于matlab混合DWT-HD-SVD数字图像水印方法技术【含Matlab源码 2007期】
jvm 二之 栈帧内部结构
MySQL-索引优化和查询优化
以训辅教,以战促学 | 新版攻防世界平台正式上线运营!
Neural network
MySQL-数据库设计规范
Link with Game Glitch(spfa判负环)
OC-NSDictionary