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

zram vs zswap vs zcache 终极指南:何时使用哪一个
  1. 它们到底是什么?它们有什么不同(我在下面的答案中写了我的理解)
  2. 在 Zswap 系统中,当页面从 zswap 移出到实际交换时,它是否以压缩形式存储?(或者在存储之前是否解压缩?据我所知它仍然是压缩的,但我不确定)
  3. zcache 的当前状态是什么?它显然在 3.11 中被删除了。这是什么意思?(http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=96256460487387d28b8398033928e06eb9e428f7

答案1

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

何时使用内容摘要:

  1. 零位随机存取存储器如果 HDD/SSD 上没有交换设备。
  2. 零点交换如果您在 HDD/SSD 上确实有交换设备。
  3. 缓存:它的功能与 ZSWAP 相同,此外还压缩和加速文件系统页面缓存。(它的内部结构要复杂得多,并且不在主线内核中,因为它仍在开发中)。

其实施总结:

  1. 零位随机存取存储器是基于压缩 RAM 的块设备(可用于交换)
  2. 零点交换是压缩的缓存如果你已经有一个交换。
  3. 缓存是一个特殊类型的后端虚拟 RAM 的东西(超越内存)可用于缓存文件系统页面或交换数据。

细节:

  • 零位随机存取记忆体(ZRAM): 在 RAM 中创建一个块设备。写入块时,该块将被压缩。用作交换设备时,zram 的优先级高于其他交换设备:交换出的页面优先发送到 zram 设备,直到其已满,然后才会使用任何其他交换设备。

    • 好处:独立于其他(物理)交换设备。可以在没有交换分区的情况下使用它来扩展可用内存。
    • 缺点:如果存在其他交换设备(HDD/SSD),则无法最佳地利用它们。由于 zram 设备是一个独立的交换设备,一旦它已满,任何需要换出的新页面都会直接发送到下一个交换设备,因此:
      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 内存系统的后端。Transcendent 内存提供类似 RAM 的内存,只能通过使用putget调用一次访问一页。这与一次只能访问一个字节的普通内存不同。frontswapcleancache系统钩子分别尝试交换和回收文件系统页面缓存,并将它们发送到 Transcendent 内存后端。当 zcache 用作后端时,数据被压缩并存储在 RAM 中。当它填满时,压缩页面将被逐出到交换区。(备用后端是 RAMster,它在联网计算机之间共享一个 RAM 池)。仅将前端frontswapzcache后端一起使用就像一样zswap。(事实上,zswap 是 zcache 的一个简化子集)

    • 好处为交换和文件系统缓存提供压缩缓存。
    • 地位:由于它非常复杂且正在进行中,因此仍未成为主流。

我发现的最佳资源是:

------

答案2

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

所以zswap适用于压缩的内存缓存在写回磁盘前可能很快被遗忘的情况。它不适用于最终需要由实际交换设备支持的大型、长期堆的应用程序。

相关内容