Meta工程师Gregory Price及其团队提出了一种名为CRAM的新型内存压缩模型。与传统方案不同,CRAM通过将压缩数据保留在内存中,完全避免了交换空间(swap)的使用,从而大幅降低延迟。据演示数据显示,在特定场景下,其性能最高可达现有主流方案ZRAM的452倍。

摒弃交换层,重构内存语义

长期以来,Linux系统中的内存压缩主要依赖zswap和ZRAM,但这两者本质上仍属于交换层特性。CRAM的核心洞察在于:压缩内存的性能瓶颈并非来自压缩算法本身,而是源于页面故障(page fault)及随后的交换行为。

为此,CRAM采用了一种全新架构。它不再伪装成块设备,而是利用一个私有的NUMA节点(非统一内存访问节点)来管理压缩数据。这种设计使得Linux内核能够继续使用原有的内存语义,包括页面迁移和气球管理(ballooning),从而以更原生的方式处理压缩内存。

“Chicken Bit”机制与性能表现

内存压缩面临的一大挑战是可压缩性的不确定性:从全零数据到已压缩数据,其压缩率差异巨大,导致系统难以准确判断剩余可用逻辑内存。为防止因写入速度超过分配能力而引发的级联故障(即“毒风暴”),CRAM引入了一种被称为“Chicken Bit”的机制。该机制能在CRAM忙于管理分配时,指示系统暂停使用CRAM,从而保障稳定性。

性能测试显示,CRAM优势显著:

  • 只读场景:CRAM每秒可执行4.89亿次操作,而ZRAM仅为110万次,前者性能约为后者的452倍。由于支持完整的缓存行和字节访问,CRAM能以接近DRAM的速度运行,仅承担硬件卸载压缩的微小成本。
  • 混合写入场景:在20%写入的最坏情况下,CRAM的速度仍比ZRAM快5.4倍。性能差距缩小主要是因为写入压缩数据需要触发页面故障并将数据迁移回原始NUMA域,以避免数据损坏。

前景与挑战

目前,CRAM仍处于研究阶段,部分关键问题(如动态逻辑容量判定)尚未完全解决。鉴于ZRAM和zswap在Linux生态系统中的广泛普及,从服务器到Steam Deck等受限设备均有所应用,CRAM若能完善实现并并入Linux内核,有望为整个生态带来显著的性能提升。