Zswap

zswap是一项Linux内核的虚拟内存压缩功能，可为将要交换的页面提供压缩回写缓存。当内存页将要交换出去时，zswap不将其移动到交换设备，而是对其执行压缩，然后存储到系统RAM内动态分配的内存池中。回写到实际交换设备的动作则会延迟，甚至能完全避免，从而显著减少Linux系统用于交换的I/O；副作用则是压缩所需的额外CPU周期。 zswap能减少I/O，因而有利于使用固态存储的设备，包括嵌入式设备、上网本及其它相似的低端硬件设备，也包括其它使用SSD存储的设备。由于其固有性质，闪存的寿命有限，因而避免以其提供交换空间可防止其迅速磨损。 zswap通过使用由frontswap提供的API集成入Linux内核虚拟内存子系统的剩余部分中，该接口是Linux内核中的一种机制，能对各类可用作交换空间的存储进行抽象。因此，zswap可通过提供内部可见的伪-RAM设备，以frontswap后端驱动的身份运作。换句话说，frontswap API使得zswap可在内存页交换出的时候拦截它，及已交换页面的页缺失；在获取这两个通路后，zswap便可充当交换页面的压缩回写缓存。 在内部，zswap使用由内核加密API提供的压缩模块，从而使其有可能（比如说）使用受内核支持的硬件压缩加速器，将压缩任务搬离主CPU。使用内核引导参数zswap.compressor，开机时可以动态地选择要使用的压缩模块；缺省值为deflate，表示使用Lempel-Ziv-Oberhumer（LZO）压缩。Linux操作系统是否默认启用zswap取决于内核编译配置时CONFIG_ZSWAP_DEFAULT_ON选项是否启用，此外，可以显式指定内核引导参数zswap.enabled来覆盖这一设置。 zswap可使用的内存池最大大小可由sysfs参数max_pool_percent配置，它指定池可占用的总系统RAM的最大百分比。内存池并非预先分配到所配置的最大尺寸；相反，它会根据要求增加和缩小。当在交换的过程中达到了配置的最大池大小，或者由于内存不足无法分配更多的池时，将会根据最近最少使用（LRU）原则，从内存池逐出交换页面到交换设备上。这种方式使zswap成为真正的交换缓存，因为一旦缓存已满，最旧的缓存页面将会被逐出到交换设备中去，因而较新的交换页面就能有空间压缩并缓存。 zbud是由zswap内部使用的专用内存分配器，用于存储压缩页面；它是Oracle zcache内部使用的zbud分配器的重写。zbud的工作原理是，在每张物理内存页中存储至多两张压缩页面（“buddies”，分配器因而得名），这既有优势（简单的空间收集及空闲空间复用）也有劣势（潜在的低内存利用率）。然而，由于它的设计，zbud分配的内存空间不会比最初未压缩页面所使用的还多。 zswap和zbud都由塞思·詹宁斯开发。2012年，此时代码库已经成熟，但仍标记为实验性内核功能。 zswap（连同zbud）于Linux 3.11（发布于2013年9月2日）合并入Linux内核主线。 自Linux 3.15（发布于2014年6月8日）起，zswap支持多种交换设备。 自 Linux 6.8 （发布于2024年3月11日）起，zswap 支持关闭特定 cgroup 的写回功能。 其中一个zswap的替代是zram，它向Linux内核提供了类似但有所不同的“压缩交换页面到RAM”机制。 主要区别在于，zram提供以RAM存储数据的压缩块设备，作为独立的一般交换设备。使用zram需要额外的用户空间配置（通过使用mkswap和swapon），这样zram提供的基于RAM的交换设备才能被初始化并配置使用。正如设计的那样，zram可提供交换空间，即使是没有其他可用的交换设备，从而更适合用于未提供交换空间的系统，如嵌入式设备。 相比之下，zswap则作为基于RAM的一般交换设备的压缩缓存，运行透明，不需要用户空间额外配置。zswap提供最少使用交换页面的逐出机制，而zram不支持。尽管如此，因其设计的缘故，至少需要一个已存在的交换设备，以便为其所用。 2008年初，zram（最初称为compcache）的Linux项目发布，在2013年被Chrome OS和Android 4.4采用。 2010年，IBM发布了适用于AIX 6.1的Active Memory Expansion（AME），实现了虚拟内存压缩。 2012年，某些版本的POWER7+芯片包含了AME硬件加速器，用于AIX上的虚拟内存压缩。 2013年6月，苹果宣布将在OS X Mavericks中使用WKdm算法包含虚拟内存压缩。 2015年8月10日"Windows Insider Preview" Windows 10更新加入了内存压缩支持 自由软件主题 Linux主题 缓存 Linux swap 固态硬盘上的交换分区 Seth Jennings. The zswap compressed swap cache. LWN.net. February 12, 2013 [January 22, 2014]. （原始内容存档于2021-11-28）.  Jenifer Hopper. New Linux zswap compression functionality. IBM. December 11, 2012 [January 31, 2014]. （原始内容存档于2014-10-14）.  Michael Larabel. Zswap Merged Into The Linux 3.11 Kernel. Phoronix. July 11, 2013 [February 5, 2014]. （原始内容存档于2021-05-09）.  Linux kernel documentation: Documentation/vm/zswap.txt. kernel.org. November 22, 2013 [January 22, 2014]. （原始内容存档于2022-01-07）.  Dan Magenheimer. Frontswap [PATCH 0/4] (was Transcendent Memory): Overview. gmane.org. April 22, 2010 [December 23, 2014]. （原始内容存档于2017-04-26）.  Jonathan Corbet. Cleancache and Frontswap. LWN.net. May 4, 2010 [March 26, 2014]. （原始内容存档于2021-11-08）.  zswap — The Linux Kernel documentation. docs.kernel.org. [2024-01-01]. （原始内容存档于2024-04-18）.  kernel/git/torvalds/linux.git: zswap: add to mm/. Linux kernel source tree. kernel.org. July 11, 2013 [February 5, 2014].  kernel/git/torvalds/linux.git: zbud: add to mm/. Linux kernel source tree. kernel.org. July 11, 2013 [February 5, 2014].  [PATCH 0/8] zswap: compressed swap caching. gmane.org. December 11, 2012 [January 5, 2014]. （原始内容存档于2016-03-09）.  [PATCHv10 0/4] zswap: compressed swap caching. gmane.org. May 8, 2013 [January 5, 2014]. （原始内容存档于2017-04-26）.  Linux kernel 3.11, Section 9. Zswap: A compressed swap cache. kernelnewbies.org. September 2, 2013 [January 22, 2014]. （原始内容存档于2021-11-14）.  Linux kernel 3.15, Section 4. Memory management. kernelnewbies.org. June 8, 2014 [June 15, 2014]. （原始内容存档于2018-06-11）.  kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices. Linux kernel source tree. kernel.org. April 7, 2014 [June 15, 2014].  存档副本. [2024-05-05]. （原始内容存档于2024-05-05）.  Dan Magenheimer. In-kernel memory compression. LWN.net. April 3, 2013 [March 8, 2014]. （原始内容存档于2021-10-09）.  引用错误：没有为名为zram-google-page的参考文献提供内容 引用错误：没有为名为IBM-AIX-AME的参考文献提供内容 引用错误：没有为名为IBM-POWER7+的参考文献提供内容 存档副本. [2015-08-24]. （原始内容存档于2017-01-17）.  存档副本. [2015-08-24]. （原始内容存档于2016-03-05）.  Aul, Gabe. Announcing Windows 10 Insider Preview Build 10525. Blogging Windows. Microsoft. August 18, 2015 [August 19, 2015]. （原始内容存档于2015-08-19）.  YouTube上的Linux Transparent Memory Compression, September 30, 2013, by Seth Jennings, IBM Zswap – a compressed page add-on for the Linux kswapd, March 15, 2013, University of Liege The Compression Cache: Virtual Memory Compression for Handheld Computers （页面存档备份，存于互联网档案馆）, March 16, 2000, by Michael J. Freedman