zram vs zswap vs zcache 终极指南:何时使用哪一个

sta*_*icd 74 performance swap kernel ram

  1. 他们是什么鬼?它们有什么不同(我已经在下面的答案中写下了我的理解)
  2. 在 Zswap 系统中,当一个页面从 zswap 驱逐到实际交换时,它是否存储在一个压缩的 from 中?(还是在存储之前解压缩了?,AFAICT它仍然被压缩,但我不能确定)
  3. zcache 的当前状态是什么?它显然已被删除或在 3.11 中删除。这是什么意思?(http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=96256460487387d28b8398033928e06eb9e428f7

sta*_*icd 95

关于这三个系统有很多东西,但都没有对它们进行简单的比较,更不用说很好地解释它们了。我试图理解它,但我的头爆炸了。然后我以为我明白了,所以我试着把它写下来,我的头又爆炸了。(请参阅实现摘要)我认为在此处发布此内容会很有用,因为有许多关于它们之间成对比较的 stackexchange 问题。

什么时候使用的总结:

  1. 如果您在 HDD/SSD 上没有交换设备,则为 ZRAM
  2. ZSWAP如果您在 HDD/SSD 上确实有交换设备。
  3. ZCACHE:它做 ZSWAP 做的事情,并且还压缩和加速文件系统页面缓存。(它在内部要复杂得多,并且不在主线内核中,因为它仍在开发中)。

他们的实现总结:

  1. ZRAM是一种基于 RAM 的压缩交换设备
  2. 如果您已经有交换,ZSWAP是一个压缩缓存
  3. ZCache是一种特殊类型的虚拟 RAM(超验内存)的后端,可用于缓存文件系统页面或交换数据。

细节:

  • ZRAM: 在 RAM 中创建交换设备。此处发送的页面在存储时会被压缩。它比其他交换设备具有更高的优先级:被换出的页面优先发送到 zram 设备,直到它已满,然后才使用任何其他交换设备。

    • 优点:独立于其他(物理)交换设备。当没有交换分区时可以使用它来扩展可用内存。
    • 缺点:如果存在其他交换设备 (HDD/SSD),则它们无法得到最佳使用。由于zram设备是一个独立的swap设备,一旦满了,任何需要换出的新页面都会直接发送到下一个swap设备,因此:
      1. LRU(最近最少使用)反转的可能性很大:最近交换的数据将进入慢速磁盘,而很久以前交换出的非活动页面将保留在快速 ZRAM 中
      2. 由于未压缩,发送到磁盘和从磁盘读取的数据将消耗大量带宽。
    • 状态:合并到主线内核 3.14。一旦在系统上启用,它需要一些用户空间配置来设置交换设备并使用它们。
  • ZSWAP:frontswap系统挂钩尝试换出的页面和用途zswap作为回写缓存的HDD / SSD交换设备:试图压缩页面,如果它不好包含可压缩数据是直接写入到磁盘中。如果数据被压缩,则存储在 zswap 内存池中。如果当 RAM 中的总压缩页面超过特定大小时页面被换出内存,则最近最少使用 (LRU)压缩页面将写入磁盘,因为它不太可能很快被需要。

    • 优点:非常有效地使用 RAM 和基于磁盘的交换。通过减少所需的写入和读取次数(数据被压缩并保存在 RAM 中)以及在数据处于压缩形式时减少这些 I/O 操作的带宽来最小化磁盘 I/O。
    • 限制:它是基于磁盘的交换系统的增强,因此依赖于硬盘上的交换分区。
    • 状态:合并到 3.11 主线 linux 内核。
  • ZCache:它是 Transcendent 内存系统的后端。超验内存提供了类似 RAM 的内存,通过使用putget调用,一次只能访问一个页面。这与一次可以访问一个字节的普通内存不同。在frontswapcleancache系统挂钩的企图交换和回收文件系统缓存页分别并将它们发送到超越的存储后端。当zcache用作后端时,数据被压缩并存储在RAM中。当它填满时,压缩的页面被驱逐到交换区。(另一个后端是 RAMster,它在联网的计算机之间共享一个 RAM 池)。仅使用frontswap前端与zcache后端的工作方式就像zswap. (其实zswap是zcache的一个简化子集)

    • 优点为交换和文件系统缓存提供压缩缓存。
    • 状态:仍然没有主线,因为它非常复杂并且正在处理中。

我找到的最好的资源是:


  • 同时使用 zram 和 zswap 是否可能和/或合理? (7认同)
  • 每一个说 `zram` 是一个 `swap` 的答案都是完全错误的。`zram` 不是 `swap`。`swap` 只能存储在 `zram` 中。但这是许多可能的用例之一!。这是一个例子:“一些用例包括 /tmp 存储,用作交换磁盘,/var 下的各种缓存,也许还有更多 :)” https://www.kernel.org/doc/Documentation/blockdev/zram.txt例如,我将它用于临时存储,我像任何其他普通块设备一样对其进行格式化和挂载。 (5认同)
  • 三个都不需要/不应该同时运行。zswap 需要一个基于磁盘的交换作为后端,不像 ZRAM 不需要专用的交换分区。但是,如果您有交换,那么 ZRAM + 交换分区的效率远低于 zswap+交换分区。 (4认同)
  • 考虑添加:【使用zswap,压缩页面在写入磁盘前先解压】(https://unix.stackexchange.com/a/192155/143394) (3认同)
  • @VictorYarema 我同意。`zram` 在技术上是一个压缩的 ramdrive,而不是一个交换设备。可以像使用任何其他块设备一样使用该 ramdrive,并将其格式化为例如 `ext4` 或针对它运行 `mkswap`。最常见的用法是将其格式化为交换并将其用作交换设备。 (3认同)

mni*_*ish 5

关于2.,zswap 似乎确实解压了回写页面,证实了@Cbhihe 的评论。

mm/zswap.c,第 828 行:

/*
 * Attempts to free an entry by adding a page to the swap cache,
 * decompressing the entry data into the page, and issuing a
 * bio write to write the page back to the swap device.
 * ...
 */
static int zswap_writeback_entry(struct zpool *pool, unsigned long handle)
{
    ...
    
    case ZSWAP_SWAPCACHE_NEW: /* page is locked */
        /* decompress */
        ...
        
        ret = crypto_comp_decompress(tfm, src, entry->length,
                         dst, &dlen);
        ...
        kunmap_atomic(dst);    


$ git show
commit 1573d2caf713874cfe0d1336c823d0fb548d8bed
Merge: 4cdf8db 0a86248
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Tue Oct 11 23:59:07 2016 -0700
Run Code Online (Sandbox Code Playgroud)

因此,zswap 对于压缩的内存缓存在写回磁盘之前可能很快被遗忘的情况非常有用。它不适用于具有大型且长期存在的堆的应用程序,这些堆最终需要实际交换设备的支持。

  • 我发现了 zswap 的一个潜在危险行为。当应用程序分配许多页面并向其中写入压缩效果很好的数据(例如一系列零)时,zswap 很乐意将它们存储在内核平板内存中。然而,当某些东西触发实际的磁盘交换时,存储的数据会突然“爆发”——内存中“仅”千兆字节的页面上的许多零现在在磁盘上解压缩到数百千兆字节。 (11认同)
  • 攻击者可能尝试在服务器上存储低熵数据。当某些东西触发交换时,服务器就会死掉。 (2认同)