当前位置:网站首页>替换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
边栏推荐
- Ask a question, my Flinkcdc has run through, I can monitor the binlog of msql, and I can also send kafk
- 图腾柱和推挽电路介绍
- 查看端口号占用
- 深度学习网络模型的改进与调整
- 2020美亚团队赛复盘
- LeetCode SQL 197. 上升的温度
- C#重点问题之Struct和Class的异同
- MySQL报错1055解决办法:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains
- Neural network
- 企业实训复现指导手册——基于华为ModelArts平台的OpenPose模型的训练和推理、基于关键点数据实现对攀爬和翻越护栏两种行为的识别、并完成在图片中只标注发生行为的人
猜你喜欢
图腾柱和推挽电路介绍
FormData上传二进制文件、对象、对象数组
吃透Chisel语言.31.Chisel进阶之通信状态机(三)——Ready-Valid接口:定义、时序和Chisel中的实现
FormData upload binary file, object, object array
LeetCode 2360. 图中的最长环
论文阅读 (64):Weakly-supervised Video Anomaly Detection with Robust Temporal Feature Magnitude Learning
LeetCode 2312. Sell Wood Blocks
2022夏暑假每日一题(六)
Azure Synapse Analytics上创建用户并赋予权限
自然语言处理 文本预处理(上)(分词、词性标注、命名实体识别等)
随机推荐
主流定时任务解决方案全横评
OC-NSDictionary
【网络】IP、子网掩码
mysql 注入
【机器学习】实验4布置:AAAI会议论文聚类分析
CSRF-跨站请求伪造-相关知识
21 days learning challenge 】 【 sequential search
OC-错误提示
你认同这个观点吗?大多数企业的数字化都只是为了缓解焦虑
在VMware上安装Metasploitable2
“蔚来杯“2022牛客暑期多校训练营4,签到题NDKHL
有关 sql中的 concat()函数问题,如何拼接
MySQL-多版本并发控制
MySQL批量更新
Chain Of Responsibility
以训辅教,以战促学 | 新版攻防世界平台正式上线运营!
Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2
神经元网络
Go 实现分布式锁
MySQL-底层设置