💾 Debunking zswap and zram myths

Linux内核 内存管理 zswap zram 性能优化

⭐⭐⭐⭐ (4星) · Source: lobste.rs

摘要

内核内存管理专家Chris Down澄清了关于zswap和zram的常见误解,并给出了实用的架构建议。

📌 核心建议:如果不确定,首选zswap。只有在有非常特定的原因时才使用zram。在大多数有磁盘存储的系统中,使用zram会让情况变得更糟。

架构差异

两者在内核存储层次结构中的位置有根本性差异:

zram:块设备架构

  • 创建一个压缩RAM块设备,本质上是RAM中的虚拟磁盘
  • 当进程需要swap时,内核像对待任何其他块设备一样对待zram
  • 关键问题:zram填满后没有自动驱逐机制
  • 冷页被锁定在快速RAM中,无法逐出
  • 适合:嵌入式系统、Raspberry Pi、磁盘less系统

zswap:内存管理集成

  • 不创建块设备,而是集成到内核内存管理子系统
  • 作为压缩层位于磁盘swap前面
  • 当内存池填满时,使用自己的启发式方法将LRU页面逐出到磁盘
  • 关键优势:自动在快速压缩RAM和较慢swap之间分层
  • 优雅降级:随着内存压力增加,性能逐渐下降

⚠️ 不要同时运行zram和磁盘swap

在这种设置中,zram会迅速填满快速RAM中的冷、陈旧页面,同时将活动工作集推送到慢速磁盘,使得情况比没有压缩swap时更糟。

zram的技术问题

  • vm.page-cluster问题:内核将zram视为普通块设备,应用磁盘导向的默认设置。zram中压缩页面没有局部性,但内核仍然读取8个swap-in而不是1个
  • 服务器问题:zram的内存使用与系统其他部分完全隔离,不会计入任何cgroup,破坏隔离语义
  • 无OOM管理:内核的OOM killer可能在hung几分钟后才行动
  • 上游不支持:swap on zram在上游越来越不受支持

zswap的工作原理

当内核需要swap出一个页面时,调用swap_writeout(),zswap首先拦截:

int swap_writeout(struct folio *folio, struct swap_iocb **swap_plug)
{
    if (zswap_store(folio)) { // zswap获取了页面
        count_mthp_stat(folio_order(folio), MTHP_STAT_ZSWPOUT);
        goto out_unlock;
    }
    // 只有zswap拒绝时才回退到磁盘
    __swap_writepage(folio, swap_plug);
}

当zswap池满时,会自动触发shrink worker将冷页面逐出到磁盘。

使用建议

  • 桌面用户(32GB+ RAM):使用zswap,不要用zram
  • 如果必须用zram:配合systemd-oomd或earlyoom等userspace OOM管理器
  • 服务器:zram有额外的cgroup问题,尽量避免

探索时间: 2026-03-24 · 来源: Lobsters