zswap
zswap是一項Linux核心的虛擬記憶體壓縮功能,可為將要交換的頁面提供壓縮回寫快取。當主記憶體頁將要交換出去時,zswap不將其移動到交換裝置,而是對其執行壓縮,然後儲存到系統RAM內動態分配的主記憶體池中。回寫到實際交換裝置的動作則會延遲,甚至能完全避免,從而顯著減少Linux系統用於交換的I/O;副作用則是壓縮所需的額外CPU周期。[1][2][3]
開發者 | 塞思·詹寧斯(Seth Jennings)及其他 |
---|---|
程式語言 | C |
作業系統 | Linux |
類型 | Linux核心功能 |
授權條款 | GNU通用公眾授權條款 |
網站 | kernel |
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需要額外的使用者空間組態(通過使用mkswap和swapon),這樣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]
參見
參考
- ^ 1.0 1.1 1.2 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).
- ^ 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.0 4.1 4.2 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).
- ^ 16.0 16.1 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