💾 Debunking zswap and zram myths
摘要
内核内存管理专家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