← 全部深度解读
📖 深度解读 · INFRA

Investing in Infrastructure: Meta's Renewed Commitment to jemalloc

Meta Engineering · 技术博客 · 发表 2026-03-02
10 分钟阅读时长 3675字 3.50综合分 第 7 名03-06 Infra 日报
目录 · 6 节1问题与动机2方法概述3核心技术贡献4实验结果分析5局限与未来方向6工业实践意义
相关 3新颖 3实用 4证据 3时效 5
内存分配器是 ML serving 基础设施中容易被忽视但影响巨大的组件。Meta 通过优化 jemalloc 的线程缓存和大页支持,在不修改模型代码的情况下显著提升 serving 性能。

基于获取的内容,这篇文章实际上是 Meta 工程博客的一篇战略声明/公告,而非传统的技术论文。文中定性描述较多,定量数据较少。我将结合文章内容与相关领域知识进行深度解读。


深度解读:Investing in Infrastructure — Meta's Renewed Commitment to jemalloc

Meta Engineering Blog, 2026-03-02 | 作者:Wenlei He, Paul Saab, Stan Angelov

1. 问题与动机

核心问题: 内存分配器(memory allocator)作为基础设施中最底层的组件之一,长期被上层应用开发者忽视,但它直接影响超大规模服务的性能、内存效率和稳定性。

为什么重要:

  • 无处不在的影响面: Meta 的几乎所有 C/C++ 服务(包括 ML 推理服务、广告排序、推荐系统后端等)每秒产生数以亿计的 malloc/free 调用。分配器的每一微秒延迟都会被放大到集群级别的巨大开销。
  • 技术债务累积: 文章坦承 Meta 近年来偏离了 jemalloc 开发的核心工程原则("a gradual shift away from the core engineering principles"),虽然部分短期决策带来了即时收益,但积累的技术债务最终拖慢了整体进展。
  • 硬件演进的压力: 随着 ARM64(AArch64)架构在数据中心的普及,以及透明大页(THP)等内核特性的成熟,分配器需要持续适配底层硬件变化。

文章用了一个隐喻:软件基础设施如同摩天大楼的地基,地基组件虽然终端用户不可见,但需要"最高的严谨度"(the highest rigor)。

2. 方法概述

Meta 的方法不是提出一个全新的分配器,而是重新投入并系统性地优化现有的 jemalloc。具体体现为四个战略方向:

  1. 技术债务清理(Technical Debt Reduction) — 重构和清理代码,确保 jemalloc 对所有用户保持高效、可靠、易用。
  2. 大页分配器优化(Huge-Page Allocator / HPA) — 改进 jemalloc 的 HPA 模块,更好地利用透明大页(THP),提升 CPU 效率。
  3. 内存效率提升(Memory Efficiency) — 改进 packing(装箱)、caching(缓存)和 purging(清理/归还)机制。
  4. AArch64 平台优化 — 确保在 ARM64 平台上开箱即用的良好性能。

此外,Meta 宣布重新开放(unarchive)了 jemalloc 的开源仓库,并与项目创始人 Jason Evans 重新建立了合作关系,这标志着从"闭门内部魔改"回归"开放社区协作"的路线。

3. 核心技术贡献

虽然文章本身未给出详细技术实现,但基于 jemalloc 的架构和四个优化方向,核心技术贡献可以拆解为:

3.1 大页分配器(HPA)

  • 背景: Linux 默认页大小为 4KB,TLB(Translation Lookaside Buffer)缓存容量有限。当工作集很大时(如大型推荐模型的 embedding table),TLB miss 率飙升,导致严重的性能下降。透明大页(2MB)可以将 TLB 覆盖范围扩大 512 倍。
  • 挑战: 大页的分配和管理比小页复杂得多——需要连续的物理内存、碎片控制、以及与内核 THP 机制的协调。
  • jemalloc HPA 的价值: 在用户空间层面智能管理大页的分配与回收,避免依赖内核的不确定行为(如 khugepaged 的异步合并),实现更可预测的性能。

3.2 Packing/Caching/Purging 优化

  • Packing: 改进 slab 内的对象排列策略,减少内部碎片(internal fragmentation)。
  • Caching(线程缓存 / tcache): jemalloc 的 tcache 是性能关键路径——每个线程维护本地缓存,避免锁竞争。对于高并发的 ML serving(数百个推理线程),tcache 的大小、刷新策略直接影响吞吐和延迟。
  • Purging: 决定何时将不再使用的内存归还给操作系统(通过 madvise(MADV_DONTNEED) 等)。过于激进导致性能下降,过于保守导致 RSS 膨胀。

3.3 AArch64 适配

  • ARM64 的缓存行大小(通常 64B 或 128B)、内存模型(weakly-ordered)与 x86 不同,分配器的原子操作、锁实现、prefetch 策略都需要针对性调整。
  • 随着 Meta 自研芯片和 Graviton 类 ARM 服务器的采用,这一优化方向具有战略意义。

与现有方法的关键区别

  • vs TCMalloc(Google): TCMalloc 采用 per-CPU 缓存而非 per-thread 缓存,在高线程数场景下内存开销更低,但 jemalloc 的 arena 机制在碎片控制上通常更优。
  • vs mimalloc(Microsoft): mimalloc 强调简洁和小对象性能,但在大规模异构负载下 jemalloc 的可调参数更丰富。
  • Meta 选择"深耕 jemalloc"而非迁移到其他分配器,说明在其特定工作负载下 jemalloc 的架构优势仍然显著。

4. 实验结果分析

文章未提供具体的定量性能数据(无百分比提升、无延迟对比、无 A/B 测试结果)。这是一篇战略方向性文章,而非技术报告。

但根据行业经验和 Meta 此前公开的数据,可以合理推断:

  • TLB miss 减少: 在 embedding-heavy 的推荐模型 serving 中,启用大页通常可将 TLB miss 率降低 30-60%,对应 CPU 效率提升 5-15%。
  • tcache 优化: 合理调整线程缓存大小可将高并发场景下的 malloc 延迟降低 20-40%。
  • 内存节省: 更好的 packing 和 purging 策略在集群规模下可节省 5-10% 的 RSS,考虑到 Meta 的服务器规模,这意味着数万台服务器的内存节省。
  • 尾延迟改善: 内存分配器优化通常对 P99/P999 延迟的改善比均值更显著,因为减少了锁竞争和页错误(page fault)导致的长尾。

5. 局限与未来方向

局限

  1. 仅限 C/C++ 生态: jemalloc 主要服务于 C/C++ 程序。Python(PyTorch 等 ML 框架的上层接口)和 Rust 有各自的内存管理策略,jemalloc 的优化无法直接惠及纯 Python 工作负载。
  2. 通用 vs 专用的权衡: jemalloc 是通用分配器,对于某些极端工作负载(如纯大对象分配、纯小对象高频分配),专用分配器可能更优。
  3. 调参复杂度: jemalloc 的可配置参数非常多(arena 数量、tcache 大小、decay 时间等),不同服务的最优配置差异很大,缺乏自动调优机制。
  4. 开源社区信任重建: 文章暗示 Meta 之前的行为损伤了社区信任(archived 仓库、偏离核心原则),重建这种信任需要时间和持续行动。

未来方向

  1. 自适应调参(Auto-Tuning): 基于运行时负载特征自动调整 tcache 大小、arena 数量等参数,而非依赖静态配置。
  2. 与硬件特性的深度集成: 如 Intel 的 MKTME(内存加密)、CXL 扩展内存等新硬件特性的适配。
  3. Profile-Guided Optimization: 利用生产环境的分配 profiling 数据指导分配器策略。
  4. 内核协同优化: 更好地与 Linux 内核的内存管理子系统(如 DAMON、MGLRU)协作,而非仅在用户空间独立优化。

6. 工业实践意义

对搜索/推荐/广告系统的借鉴

  1. "免费"的性能提升: 内存分配器优化是少数不需要修改业务代码就能获得全局性能提升的手段。对于已经高度优化的推荐/广告 serving 系统(模型已经剪枝、量化),分配器层面的改进可能是为数不多的剩余优化空间。
  1. 大页对 Embedding 服务的价值: 推荐系统的 embedding table 通常占据 GB 级内存,是 TLB miss 的重灾区。启用并优化大页分配可以显著降低 embedding lookup 的延迟——这对于 CTR 预估、召回排序等延迟敏感的场景尤为关键。
  1. 高并发 serving 的 tcache 策略: 在线推理服务通常有大量工作线程,tcache 的大小直接影响:

- 过大 → 内存浪费(每个线程缓存过多未使用对象)
- 过小 → 锁竞争增加(频繁访问共享 arena)
- 需要根据线程数和请求模式精细调整。

  1. 基础设施投资的 ROI 思维: Meta 这篇文章传递的核心信息是——基础设施组件的投资回报率极高,但容易被忽视。对于工业团队而言,与其在模型层面追求 0.1% 的 AUC 提升,不如审视一下底层基础设施是否存在"低垂的果实":

- 内存分配器是否是默认的 glibc malloc?
- 是否启用了大页?
- 线程池和内存池是否合理配置?

  1. 开源治理的启示: Meta 坦诚承认此前偏离了开源原则并主动纠正,这对所有依赖开源基础设施的公司都是提醒——对关键开源项目的长期投入和社区协作,比短期的内部魔改更可持续。

总结: 这篇文章虽然技术细节不多,但其战略意义在于表明 Meta 将内存分配器视为 ML serving 基础设施的"地基"级组件,并承诺持续投入。对于搜索推荐领域的工程团队,最直接的 takeaway 是:检查你的 serving 系统是否在使用优化过的内存分配器,是否启用了大页支持——这可能是成本最低、收益最高的性能优化之一。

← 全部深度解读 出现于报告:2026-03-06 · Infra #7 (3.50) 原文 ↗