问题描述
-
他们到底是怎么回事?他们有什么不同(我在下面的答案中写下了我的理解)
-
在Zswap系统中,当一个页面被从zswap驱逐到实际交换时,它是否存储在一个压缩的? (或者在存储之前它是否已解压缩?,AFAICT它仍然被压缩但我无法确定)
-
zcache的当前状态是什么?它显然已被移除或3.11中的某些东西。这是什么意思? (http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=96256460487387d28b8398033928e06eb9e428f7)
最佳解决方案
关于这三个系统有很多东西,但没有一个能够简单地比较它们,更不用说解释它们了。我试图理解它,但我的脑袋爆炸了。然后我以为我已经得到它所以我试着把它写下来然后我的头再次爆炸了。 (参见实现总结)我认为在这里发布这个会很有用,因为有许多stackexchange问题询问它们之间的成对比较。
以下内容摘要:
-
如果您在HDD /SSD上没有交换设备,则使用ZRAM。
-
如果您在HDD /SSD上有交换设备,则为ZSWAP。
-
ZCACHE:它执行ZSWAP所做的事情,并且还压缩和加速文件系统页面缓存。 (它内部更加复杂,并且不在主线内核中,因为它仍在开发中)。
他们的实现摘要:
-
ZRAM是基于压缩RAM的交换设备
-
如果您已经有交换,ZSWAP是一个压缩缓存。
-
ZCache是一种特殊类型的虚拟RAM(Transcendent memory)的后端,可用于缓存文件系统页面或交换数据。
细节:
-
ZRAM:在RAM中创建交换设备。此处发送的页面在存储时会进行压缩。它具有比其他交换设备更高的优先级:交换的页面优先发送到zram设备,直到它满,然后才使用任何其他交换设备。
-
优点:独立于其他(物理)交换设备。当没有交换分区来扩展可用内存时,可以使用它。
-
缺点:如果存在其他交换设备(HDD /SSD),则不能以最佳方式使用它们。由于zram设备是一个独立的交换设备,一旦它满了,任何需要换出的新页面都会被直接发送到下一个交换设备,因此:
-
LRU(最近最少使用)反转的可能性很小:它将是最近交换到慢速磁盘的数据,而很久以前被换出的非活动页面将保留在快速ZRAM中
-
发送到磁盘和从磁盘读取的数据在未压缩时将消耗大量带宽。
-
-
状态:合并到主线内核3.14。在系统上启用后,需要一些用户空间配置来设置交换设备并使用它们。
-
-
ZSWAP:
frontswap
系统挂钩尝试换出页面并使用zswap作为write-back-cache用于HDD /SSD交换设备:尝试压缩页面,如果它包含可压缩性差的数据,则直接写入磁盘。如果数据被压缩,则将其存储在zswap内存池中。如果RAM中的总压缩页面超过特定大小时页面被换出内存,则最近最少使用(LRU)压缩页面将写入磁盘,因为不太可能很快需要。-
优点:非常有效地使用RAM和基于磁盘的交换。通过减少所需的写入和读取次数(数据被压缩并保存在RAM中)以及通过在压缩形式下减少这些I /O操作的带宽来最小化磁盘I /O.
-
限制:它是基于磁盘的交换系统的增强,因此取决于硬盘上的交换分区。
-
状态:合并到3.11主线linux内核中。
-
-
ZCache:它是Transcendent内存系统的后端。超越内存提供RAM-like内存,只能使用
put
和get
调用一次访问一页。这与普通存储器不同,可以一次访问一个字节。frontswap
和cleancache
系统挂钩尝试分别交换和回收file-system页面缓存,并将它们发送到超越内存后端。当zcache用作后端时,数据被压缩并存储在RAM中。当它填满时,压缩的页面被驱逐到交换。 (备用后端是RAMster,它在联网计算机之间共享一个RAM池)。仅将frontswap
前端与zcache
后端一起使用就像zswap
一样。 (事实上,zswap是zcache的简化子集)-
优点为交换和文件系统缓存提供压缩缓存。
-
状态:仍然没有主题,因为它非常复杂并且正在进行中。
-
我找到的最好的资源是:
次佳解决方案
关于2.,zswap似乎解压缩了write-back上的页面,确认了@ 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
因此,zswap对于在写回磁盘之前很快就会忘记压缩的in-ram缓存的情况很有用。它不适用于具有大型,长寿命堆的应用程序,最终需要由实际交换设备支持。