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

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

关于这三个系统有很多东西,但没有一个能够简单地比较它们,更不用说解释它们了。 我试图理解它,但我的脑袋爆炸了。 然后我以为我得到了它所以我试着把它写下来然后我的头再次爆炸了。 (参见实现总结)我认为在这里发布这个会很有用,因为有许多stackexchange问​​题询问它们之间的成对比较。

以下内容摘要:

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

他们的实现总结:

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

细节:

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

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

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

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

我找到的最好的资源是:

  • 简而言之,超然的记忆
  • [PATCH 0/8] zswap:压缩交换缓存
  • 内核内存压缩
  • LSFMM:内核内存压缩
  • zswap压缩交换缓存

关于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  Date: Tue Oct 11 23:59:07 2016 -0700 

因此,zswap对于在写回磁盘之前很快就会忘记压缩的in-ram缓存的情况很有用。 它不适用于具有大型,长寿命堆的应用程序,最终需要由实际交换设备支持。