Linux内存性能提升---内存池
·
内存池基础概念
内存池(Memory Pool)一种预分配一大块内存,然后在需要时从中“切片”分配小块内存并在释放时不立即归还给操作系统,而是保留在池中供后续复用的技术。

适用场景—需求
- 高频小分配
- 多线程高并发
内存池特点
- 空间换时间:牺性一点内存,换取更快的分配/释放速度。
- 避免碎片化:固定大小对象的内存池可完全避免外部碎片。
- 绕过系统调用:减少malloc/free(c)new/delete(c++)的依赖
为什么new、malloc的性能开销大?new的底层调用也是malloc,本质上还是malloc的问题
- 系统调用(用户态与内核态切换)
- malloc 底层通过 brk 或 mmap 系统调用向操作系统申请堆内存。
- 维护内存对齐
- 管理free list(空闲链表)
- 线程安全带来的锁的竞争与等待
- 内存碎片
- 缓存(cache)不友好
malloc申请的内存在堆的不同区域上,会导致cache命中率低;
内存池存储的位置连续,cache命中高
开源 - mimalloc
特性
- 局部性优先(CacheFriendly)
mimalloc的每个“页面”(Page,即一个大小固定的内存块池)在物理上是一段连续的内存。当你连续分配多个小对象时,它们会尽可能地分布在同一个或相邻的几个页面上。这意味着,当你遍历这些对象时,CPU可以预取后续的数据,极大提高缓存命中率,避免昂贵的RAM访问。 - Thread-local设计,减少锁竞争
mimalloc为每个线程维护一个本地的空闲列表(即线程局部存储,Thread-Local Storage)。当一个线程需要分配内存时,它首先尝试从这个本地列表中获取。这个操作完全不需要加锁,因为其他线程无法访问这个列表。(局部可见) - 分层架构:FastPath/SlowPath
FastPath(快速路径)
SlowPath(慢速路径) - 延迟+批量,摊薄昂贵操作
当一个线程的本地列表为空并进入SlowPath时,它不会只申请一个内存块,而是会一次从全局堆申请一批,填入自己的本地列表。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)