zram vs zswap vs zcache

在 Ask Ubuntu 有一个辨析 zram vs zswap vs zcache 的文章: zram vs zswap vs zcache Ultimate guide: when to use which one :

概述

  • zram - 基于内存的压缩块存储设备 : 不需要在磁盘设备(HDD/SDD)上有交换设备,直接在内存中构建压缩块设备,可以作为常规文件系统,也可以提供内存页交换功能

  • zswap : 需要结合磁盘设备(HDD/SDD)的交换设备文件,通过拦截交换到磁盘的内存页进行内存池压缩来加速内存换页性能

  • zcache: 针对文件系统页缓存的加速,用以提高文件系统性能

对比

ZRAM

ZRAM使用:

  • ZRAM 在内存中创建块设备

  • 当数据写入ZRAM数据块块时候,数据压缩

  • 当ZRAM作为交换设备时,ZRAM比其他交换设备优先级更高: 被换出的页面优先发送到ZRAM设备(你可以理解为内存到内存),直到ZRAM满了以后才会使用其他任何交换设备

ZRAM优点:

  • 独立于其他(物理)交换设备

  • 当没有交换分区时候可以使用ZRAM来扩展可用内存: 你可以理解为ZRAM是内存中的一个天然压缩分区,所有进入这个内存区域的数据都会得到压缩,所以相对于普通内存区域可以存储更多内存数据

ZRAM缺点:

  • 会影响其他交换设备(HDD/SSD)使用: ZRAM是一个独立的交换设备,一旦满了以后,任何需要换出的新页面都会直接发送到下一个交换设备,这就导致:

    • 存在LRU(最近最少使用)反转的可能性: 最近交换的数据将进入慢速磁盘,而很久以前交换出的非活动页面将保留在快速ZRAM中(也就是因为ZRAM存满了以后,内存交换数据就会直接存到磁盘交换文件中,而不是将ZRAM中冷数据换到磁盘,热数据放到ZRAM)

    • 由于发送到磁盘交换的数据没有压缩,会导致从磁盘来回的数据消耗大量带宽

ZRAM状态:

  • ZRAM已经合并到内核主线3.14

  • 一旦在系统中启用ZRAM,就需要一些用户空间配置来设置交换设备并使用它们

ZSWAP

ZSWAP使用:

  • frontswap 系统hooks尝试换出页面,并使用zswap作为HDD/SSD交换设备的回写缓存(你可以理解为物理磁盘配置了一个巨大的缓存,所有写磁盘会经过这个缓存)

  • zswap会尝试压缩页面,但如果是可压缩性较差的数据,则直接写入磁盘;如果数据被压缩,则存储在zswap的内存池中

  • 当RAM中压缩页面总数超过一定大小时将页面换出内存,则最近最少使用(LRU)压缩页面将被写入磁盘(因为不太可能很快用到)

ZSWAP优点:

  • 非常高效地使用RAM和基于磁盘的交换: 通过减少所需的写入和读取次数(数据被压缩并保存在RAM中)以及由于数据处于压缩形式而减少这些I/O操作的带宽,最大限度地减少磁盘I/O

ZSWAP缺点:

  • zswap是基于磁盘的交换系统的增强,所以它依赖硬盘上的交换分区(实际上就是磁盘交换分区的缓存,类似于以前硬件RAID卡上的缓存)

ZSWAP状态:

  • ZSWAP已经合并到内核主线3.11

ZCACHE

ZCACHE使用:

  • zcache 相当于超级内存系统(Transcendent memory system)的后端: 这种超级内存系统提供了类似RAM的内存,通过使用 putget 调用一次只能访问一个页(这与一次只能访问一个字节的普通内存不同)

  • frontswapcleancache 系统hook分别尝试交换和回收文件系统页面缓存,并将它们发送到超级内存后端

  • zcache 用作后端时,数据被压缩并存储在RAM中

  • zcache 存满后,压缩页面将被驱逐到交换区(另一个后端是 RAMster ,它在联网计算机之间共享RAM池)

  • 仅使用 frontswap 前端和 zcache 后端的工作方式和 zswap 相似 (实际上 zswapzcache 的简化子集)

ZCACHE优点:

  • 为交换和文件系统缓存提供压缩缓存

ZCACHE缺点:

  • 仍然没有进入内核主线,因为 zcache 非常复杂并且还在开发

我的思考

在生产环境中,应用日志是我们分析系统排查故障的基础,但是日志打印也会影响应用性能,所以我们倾向于采用快速的SSD作为日志存储(但是成本较高),而 zram 给我们带来一个特定应用环境的解决方案:

  • 极端性能压榨需要比SSD更快的日志存储,并且很多日志会通过 日志系统 采集,所以不需要在本地长期存储。如果能够控制日志生成和采集的平衡,那么采用 zram 可以实现用一定的内存空间换取 性能提升 并节约本地磁盘存储(内存的读写寿命要比Flash机制的SSD存储高很多)

  • 如果内存价格便宜,我们可以为每个服务器多配置几百G的内存作为高性能存储的替代,专用于要求高性能同时不要求数据可靠性的场合: 既然日志最终是需要汇流到 日志系统 进行数据挖掘、 Machine Learning Atlas ,那么类似 zram 的场景非常适合这种 日志无盘化

    • 服务器应该 采用多网卡机构,离线日志、冷数据备份、控制台需要走和业务分流的通道 采用QoS控制,对网络数据提供优先级不同的服务,确保业务数据优先,日志和管控数据降低级别(但不会出现阻塞)。这是一种计数难度极大的架构方案,如果开发和维护成本很高,那么或许传统的多网卡分离结构也是可以考虑的(简单粗暴但有效)`

备注

  • zcache 虽然具备先进的功能,但是没有得到广泛支持,开发也出现停滞,并且在内核 3.11 中删除,所以如果要使用会比较困难,而且结果可能也不必 zswap 好多少

  • 对于桌面电脑,由于内存不足,常常需要使用swap交换分区,此时使用 zswap 可以通过内存压缩(相当于增加了一级缓存)提升性能

  • 对于服务器环境,如果有充足内存(没有完全分配完),则可以利用部分内存来实现 zram ,提供一种高性能(较小容量)日志暂存系统,对于提升系统性能会有比较大的帮助( ⚠️ 需要配套的 日志系统 )

参考