SevenTnewS

内存管理

mimalloc:微软的微型内存工作引擎,正静默驱动大规模AI应用

微软研究院的 mimalloc 内存分配器专为高并发和大内存规模设计,正静默驱动大规模AI与云服务。其采用线程本地设计与数千个空闲列表,最大限度减少竞争,兼具速度与内存效率。

Emmanuel Fabrice Omgbwa Yasse

2026-07-03 · 阅读需 4 分钟

mimalloc:微软的微型内存工作引擎,正静默驱动大规模AI应用

在竞争激烈的内存分配器领域,一个诞生于微软研究院实验室的项目已悄然成为主力, , 不仅服务于小型编程语言运行时,还支撑大规模云服务。mimalloc(Microsoft malloc)分配器作为开源替代品,可替代 malloc 和 free,在对高并发、高内存需求的工作负载(包括大型语言模型,LLM)中表现尤为出色。open-by-design-ai2-brings-fully-open-ai-infrastructure-online-with-nsf-omai

mimalloc 由微软研究院(MSR)的 RiSE 团队开发,最初于2020年作为 Lean 定理证明器和 Koka 编程语言(均使用编译器引导的引用计数)的快速分配器问世。但研究人员在近期博客文章中写道,其可扩展设计在微软内部大型服务中表现出色,通过与产品团队紧密合作,显著提升了必应等服务的响应时间。microsoft-research-introduces-generative-causal-testing-to-turn-black-box-ai-brain-models-into-readable-theories

如今,mimalloc 已广泛应用于公司内外。它驱动 NoGIL CPython 3.13+,集成于虚幻引擎和《死亡搁浅》等游戏中,并在 GitHub 上获得超过12,000颗星。其 Rust 封装器单日下载量超过100,000次。llms-corrupt-your-documents-when-you-delegate-a-close-look-at-the-delegate-52-benchmark

紧凑代码库,强不变性

尽管应用范围从小型编译器到内存占用超过500 GiB、数百线程的服务,mimalloc 的代码库仍保持紧凑,约12,000行C语言。项目强调清晰的数据结构与强不变性,使其比许多工业级分配器更易于理解和推理。这种清晰性帮助其移植到 Windows、macOS、Linux、FreeBSD、NetBSD、DragonFly 和多种游戏主机。

“正如弗雷德·布鲁克斯在其著名著作《人月神话》中所言:‘给我看你的流程图但隐藏你的表格,我仍然感到困惑。给我看你的表格,我就不需要你的流程图;一切将显而易见。’”研究人员如此解释其设计哲学。

透明的数据结构还让 Sam Gross 等人采用 mimalloc 作为 NoGIL CPython 的并发分配器,从而在其上轻松实现循环垃圾回收。how-local-llms-like-gemma-and-qwen-are-taming-open-source-repository-triage-at-scale

最小化同步的快速路径

mimalloc 的核心使用线程本地堆(theaps),与其他可扩展分配器(如 tcmalloc 和 jemalloc)类似。每个线程拥有自己的堆,堆包含一组 mimalloc 页面(通常64 KiB)。每个页面包含固定大小的块,按大小分类以减少内部碎片。通过为每个线程分配独立堆和页面,分配和释放通常无需同步。

仅当线程释放由另一线程分配的块时才会涉及原子操作。实践中,大多数分配非常小,通常小于1 KiB,对于这些分配,mimalloc 提供极速路径。主分配函数仅需几条x64指令,且只有两个罕见分支。

类似地,mimalloc 在释放块时也有快速路径。大多数块由分配它们的线程释放,分配器检查当前线程ID是否与对应页面中存储的ID匹配。若匹配,则无需锁或原子操作,直接将块推入页面的空闲列表。aleph-alpha-builds-theoretical-inference-model-for-deepseek-deriving-performance-from-hardware-primitives

三个空闲列表与随机化启发

mimalloc 设计的一个关键洞察在于每64 KiB页面拥有三个空闲列表:一个用于分配,一个用于已释放块,一个用于跨线程释放。这意味着程序可轻松拥有数千个空闲列表,这对可扩展性和缓存局部性至关重要。

研究人员从随机化算法中获得灵感。“许多多线程分配器依赖复杂的并发数据结构同步对共享空闲列表的访问。相比之下,mimalloc 使用每页线程空闲列表,任何线程均可通过简单的原子比较交换操作推送块,”他们写道。“由于存在数千个此类列表,多个线程同时向同一页面释放块的几率很低。因此,大多数推送操作是无竞争的原子更新。”

平衡可扩展性与内存效率

该设计解决了基本矛盾:为每个线程提供独占所有权可最小化同步但浪费内存;而将所有页面全局共享并加锁则优化内存使用却牺牲可扩展性。

基准测试结果展示了这一权衡。标准系统分配器表现出出色的内存效率(提交内存与活跃数据之比为1.1倍),但基准运行期间仅分配56 GiB。另一高并发分配器分配了262 GiB,但提交内存是活跃数据的四倍,在大内存场景下不可接受。

“最终图表显示了最新的 mimalloc 分配器。与第二个分配器类似,它在基准运行期间分配262 GiB,同时将提交内存降至活跃数据的1.3倍,实现了可扩展性与线程间内存高效共享,”研究人员指出。

这一改进源于“页面窃取”技术,该技术允许线程在不进行昂贵跨线程同步的情况下获取页面所有权,与微软 Azure Cosmos DB 团队紧密合作开发。该团队表示近期将发布关于这些改进的技术报告。microsoft-open-sources-data-formulator-07-for-enterprise-ai-analytics