当前位置:网站首页>替换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
边栏推荐
猜你喜欢

Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2

【云原生】如何快速部署Kubernetes

(2022牛客多校五)C-Bit Transmission(思维)

论文阅读 (64):Weakly-supervised Video Anomaly Detection with Robust Temporal Feature Magnitude Learning

OC-error prompt

“蔚来杯“2022牛客暑期多校训练营5,签到题KBGHFCD

A full review of mainstream timed task solutions

2022.07.31(LC_6133_分组的最大数量)

图腾柱和推挽电路介绍

在VMware上安装Metasploitable2
随机推荐
Chain Of Responsibility
Splunk Filed extraction 字段截取
图腾柱和推挽电路介绍
php删除一维数组中一个值
mysql操作入门(四)-----数据排序(升序、降序、多字段排序)
MySQL - Index Optimization and Query Optimization
“蔚来杯“2022牛客暑期多校训练营4,签到题NDKHL
2022.07.31(LC_6133_分组的最大数量)
SQL执行顺序
apt & apt-get命令
倍福使用AdsRemote组件实现和C#的ADS通讯
有关 sql中的 concat()函数问题,如何拼接
View port number occupancy
Link with Game Glitch
【机器学习】实验4布置:AAAI会议论文聚类分析
(2022牛客多校五)B-Watches(二分)
企业实训复现指导手册——基于华为ModelArts平台的OpenPose模型的训练和推理、基于关键点数据实现对攀爬和翻越护栏两种行为的识别、并完成在图片中只标注发生行为的人
从云计算到函数计算
spark架构
【机器学习】实验1布置:基于决策树的英雄联盟游戏胜负预测