Zswap

zswap
開發者塞思·詹宁斯(Seth Jennings)及其他
编程语言C
操作系统Linux
类型Linux内核功能
许可协议GNU通用公共许可证
网站kernel.org

zswap是一项Linux内核的虚拟内存压缩功能,可为将要交换的页面提供压缩回写缓存。当内存页将要交换出去时,zswap不将其移动到交换设备,而是对其执行压缩,然后存储到系统RAM内动态分配的内存池中。回写到实际交换设备的动作则会延迟,甚至能完全避免,从而显著减少Linux系统用于交换的I/O;副作用则是压缩所需的额外CPU周期。[1][2][3]

zswap能减少I/O,因而有利于使用固态存储的设备,包括嵌入式设备上网本及其它相似的低端硬件设备,也包括其它使用SSD存储的设备。由于其固有性质闪存的寿命有限,因而避免以其提供交换空间可防止其迅速磨损。[4]

内部机制

zswap通过使用由frontswap提供的API集成入Linux内核虚拟内存子系统的剩余部分中,该接口是Linux内核中的一种机制,能对各类可用作交换空间的存储进行抽象[5]。因此,zswap可通过提供内部可见的伪-RAM设备,以frontswap后端驱动的身份运作。换句话说,frontswap API使得zswap可在内存页交换出的时候拦截它,及已交换页面的页缺失;在获取这两个通路后,zswap便可充当交换页面的压缩回写缓存[1][6]

在内部,zswap使用由内核加密API提供的压缩模块,从而使其有可能(比如说)使用受内核支持的硬件压缩加速器,将压缩任务搬离主CPU。使用内核引导参数zswap.compressor,开机时可以动态地选择要使用的压缩模块;缺省值为deflate,表示使用Lempel-Ziv-Oberhumer(LZO)压缩。Linux操作系统是否默认启用zswap取决于内核编译配置时CONFIG_ZSWAP_DEFAULT_ON选项是否启用,此外,可以显式指定内核引导参数zswap.enabled来覆盖这一设置。[7]

zswap可使用的内存池最大大小可由sysfs参数max_pool_percent配置,它指定池可占用的总系统RAM的最大百分比。内存池并非预先分配到所配置的最大尺寸;相反,它会根据要求增加和缩小。当在交换的过程中达到了配置的最大池大小,或者由于内存不足无法分配更多的池时,将会根据最近最少使用(LRU)原则,从内存池逐出交换页面到交换设备上。这种方式使zswap成为真正的交换缓存,因为一旦缓存已满,最旧的缓存页面将会被逐出到交换设备中去,因而较新的交换页面就能有空间压缩并缓存。[1][4][8]

zbud是由zswap内部使用的专用内存分配器,用于存储压缩页面;它是Oracle zcache内部使用的zbud分配器的重写。zbud的工作原理是,在每张物理内存页中存储至多两张压缩页面(“buddies”,分配器因而得名),这既有优势(简单的空间收集及空闲空间复用)也有劣势(潜在的低内存利用率)。然而,由于它的设计,zbud分配的内存空间不会比最初未压缩页面所使用的还多。[3][9]

历史

zswap和zbud都由塞思·詹宁斯开发。2012年,此时代码库已经成熟,但仍标记为实验性内核功能。[10][11]

zswap(连同zbud)于Linux 3.11(发布于2013年9月2日)合并入Linux内核主线。[4][12]

自Linux 3.15(发布于2014年6月8日)起,zswap支持多种交换设备。[13][14]

自 Linux 6.8 (发布于2024年3月11日)起,zswap 支持关闭特定 cgroup 的写回功能。[15]

替代

其中一个zswap的替代是zram,它向Linux内核提供了类似但有所不同的“压缩交换页面到RAM”机制。

主要区别在于,zram提供以RAM存储数据的压缩块设备,作为独立的一般交换设备。使用zram需要额外的用户空间配置(通过使用mkswapswapon),这样zram提供的基于RAM的交换设备才能被初始化并配置使用。正如设计的那样,zram可提供交换空间,即使是没有其他可用的交换设备,从而更适合用于未提供交换空间的系统,如嵌入式设备。[16]

相比之下,zswap则作为基于RAM的一般交换设备的压缩缓存,运行透明,不需要用户空间额外配置。zswap提供最少使用交换页面的逐出机制,而zram不支持。尽管如此,因其设计的缘故,至少需要一个已存在的交换设备,以便为其所用。[16]

关联项目

  • 2008年初,zram(最初称为compcache)的Linux项目发布,在2013年被Chrome OS[17]Android 4.4采用。
  • 2010年,IBM发布了适用于AIX 6.1的Active Memory Expansion(AME),实现了虚拟内存压缩。[18]
  • 2012年,某些版本的POWER7+芯片包含了AME硬件加速器,用于AIX上的虚拟内存压缩。[19]
  • 2013年6月,苹果宣布将在OS X Mavericks中使用WKdm算法包含虚拟内存压缩。[20][21]
  • 2015年8月10日"Windows Insider Preview" Windows 10更新加入了内存压缩支持[22]

参见

  • 自由软件主题
  • iconLinux主题

参考

  1. ^ 1.0 1.1 1.2 Seth Jennings. The zswap compressed swap cache. LWN.net. February 12, 2013 [January 22, 2014]. (原始内容存档于2021-11-28). 
  2. ^ Jenifer Hopper. New Linux zswap compression functionality. IBM. December 11, 2012 [January 31, 2014]. (原始内容存档于2014-10-14). 
  3. ^ 3.0 3.1 Michael Larabel. Zswap Merged Into The Linux 3.11 Kernel. Phoronix. July 11, 2013 [February 5, 2014]. (原始内容存档于2021-05-09). 
  4. ^ 4.0 4.1 4.2 Linux kernel documentation: Documentation/vm/zswap.txt. kernel.org. November 22, 2013 [January 22, 2014]. (原始内容存档于2022-01-07). 
  5. ^ Dan Magenheimer. Frontswap [PATCH 0/4] (was Transcendent Memory): Overview. gmane.org. April 22, 2010 [December 23, 2014]. (原始内容存档于2017-04-26). 
  6. ^ Jonathan Corbet. Cleancache and Frontswap. LWN.net. May 4, 2010 [March 26, 2014]. (原始内容存档于2021-11-08). 
  7. ^ zswap — The Linux Kernel documentation. docs.kernel.org. [2024-01-01]. 
  8. ^ kernel/git/torvalds/linux.git: zswap: add to mm/. Linux kernel source tree. kernel.org. July 11, 2013 [February 5, 2014]. 
  9. ^ kernel/git/torvalds/linux.git: zbud: add to mm/. Linux kernel source tree. kernel.org. July 11, 2013 [February 5, 2014]. 
  10. ^ [PATCH 0/8] zswap: compressed swap caching. gmane.org. December 11, 2012 [January 5, 2014]. (原始内容存档于2016-03-09). 
  11. ^ [PATCHv10 0/4] zswap: compressed swap caching. gmane.org. May 8, 2013 [January 5, 2014]. (原始内容存档于2017-04-26). 
  12. ^ Linux kernel 3.11, Section 9. Zswap: A compressed swap cache. kernelnewbies.org. September 2, 2013 [January 22, 2014]. (原始内容存档于2021-11-14). 
  13. ^ Linux kernel 3.15, Section 4. Memory management. kernelnewbies.org. June 8, 2014 [June 15, 2014]. (原始内容存档于2018-06-11). 
  14. ^ kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices. Linux kernel source tree. kernel.org. April 7, 2014 [June 15, 2014]. 
  15. ^ https://github.com/torvalds/linux/commit/501a06fe8e4c185bbda371b8cedbdf1b23a633d8
  16. ^ 16.0 16.1 Dan Magenheimer. In-kernel memory compression. LWN.net. April 3, 2013 [March 8, 2014]. (原始内容存档于2021-10-09). 
  17. ^ 引用错误:没有为名为zram-google-page的参考文献提供内容
  18. ^ 引用错误:没有为名为IBM-AIX-AME的参考文献提供内容
  19. ^ 引用错误:没有为名为IBM-POWER7+的参考文献提供内容
  20. ^ 存档副本. [2015-08-24]. (原始内容存档于2017-01-17). 
  21. ^ 存档副本. [2015-08-24]. (原始内容存档于2016-03-05). 
  22. ^ 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
组织
内核
支持
技术
调试
  • CRIU英语CRIU
  • ftrace英语ftrace
  • kdump
  • Linux内核oops
  • SystemTap英语SystemTap
启动过程
ABI
API
用户空间
FS守护进程
封装库
内核部分
系统调用接口
内核内
  • ALSA
  • DRI
  • Video4Linux
  • New API英语New API
  • Crypto API英语Crypto API (Linux)
内核组件
  • 内核模块
  • BlueZ英语BlueZ
  • cgroups
  • 控制台
  • bcache英语bcache
  • 设备映射器
  • dm-cache英语dm-cache
  • dm-crypt
  • DRM
  • EDAC
  • evdev英语evdev
  • 内核同页合并(KSM)
  • LIO
  • 帧缓冲区(Framebuffer)
  • LVM
  • KMS驱动
  • Netfilter
  • Netlink
  • nftables
  • 网络调度器
  • perf英语perf (Linux)
  • SLUB
  • zram
  • zswap
  • 安全模块AppArmor
  • Exec Shield英语Exec Shield
  • grsecurity英语grsecurity
    • PaX英语PaX
  • seccomp英语seccomp
  • SELinux
  • Smack
  • TOMOYO Linux英语TOMOYO Linux
  • Linux PAM英语Linux PAM
  • initramfs
  • kexec
  • kGraft英语kGraft
  • kpatch英语kpatch
  • Ksplice
变种
虛擬化
采用
使用范围
采用者
  • Linux采用者列表
  • GENIVI联盟
  • Linux专有软件
人物
  • 分类 分类
  • 共享资源页面 共享资源
  • 维基百科图书 教科书
  • 维基学院页面 学院
  • 主题 主题
  • 操作系统的内存管理功能英语Memory management (operating systems)
手动内存管理英语Manual memory management
虚拟内存
  • 按需分页英语Demand paging
  • 分頁表
  • 分頁
  • 虚拟内存压缩英语Virtual memory compression
硬件内存管理
垃圾回收
記憶體分段
記憶體安全
针对的问题
其它
  • 自动变量
  • 内存管理国际研讨会英语International Symposium on Memory Management
  • 基于区域内存管理英语Region-based memory management
概述
  • 宣传英语Operating system advocacy
  • 比较英语Comparison of operating systems
  • 鑑識软件工程英语Forensic software engineering
  • 历史
  • 爱好者开发英语Hobbyist operating system development
  • 列表
  • 年表
  • 份额
内核
组件
行程管理
概念
调度算法
記憶體管理和資源保护
存储访问和文件系统
操作系统列表
其他概念