出自 Arch Linux 中文维基

zswap 是一個內核功能,它為交換頁提供了一個壓縮的內存緩存。原本會交換到磁碟的頁被壓縮並存儲到內存中的存儲池中。一旦池已滿或內存耗盡,最近最少使用的(LRU)頁就會被解壓縮並寫入磁碟,就好像它沒有被攔截一樣。將頁解壓縮到交換緩存後,可以釋放池中的壓縮版本。

zram 相比的區別在於,zswap 與 swap 設備協同工作,而 zram 是內存中的交換設備,不需要後備交換設備。

開關 zswap

在穩定版(stable)的 linux 官方內核中,zswap 會被默認啟用。這可以通過穩定版內核配置中的 CONFIG_ZSWAP_DEFAULT_ON 標誌進行驗證。

要在運行時禁用 zswap,請執行下面的命令:

# echo 0 > /sys/module/zswap/parameters/enabled

要永久禁用 zswap,添加 zswap.enabled=0 到你的內核參數

定製 zswap

當前參數

zswap 有幾個可自定義的參數。可以使用以下方式顯示實時設置:

$ grep -R . /sys/module/zswap/parameters
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90

zswap 文檔獲取不同參數的描述。

顯示初始配置的引導時加載消息可以通過以下方式檢索:

# dmesg | grep zswap:
[    0.317569] zswap: loaded using pool lz4/z3fold

設定參數

使用 sysfs

每個設置都可以在運行時通過 sysfs 接口進行更改。作為示例,要更改 compressor 參數:

# echo lz4 > /sys/module/zswap/parameters/compressor

使用內核引導參數

要持久化參數更改,必須在內核引導參數中添加相應的選項,例如 zswap.compressor=lz4。因此,要永久設定上述所有設置,必須添加以下內核參數

zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold

當通過引導參數更改壓縮算法時,需要確保在引導期間儘早加載相應的壓縮模塊(參考 #壓縮算法)。

最大池大小

存儲池不是預先分配的,它可以增長到可用內存總量的一定百分比,默認情況下最多占內存總量的20%。一旦達到此閾值,就會將頁從池中逐出到交換設備中。壓縮池的最大大小由參數 max_pool_percent 控制。

壓縮存儲池分配器

zpool 參數控制壓縮存儲池的管理。

使用 zbud 數據分配器,2個壓縮對象被存儲到1個頁中,這將壓縮比限制為2或更小。

更好的 z3fold 分配器允許每頁最多3個壓縮對象。z3fold 的壓縮比通常為2.7,而 zbud 的壓縮比通常為1.7。

默認情況下,會創建 z3fold 類型的 zpool。使用內核參數 zswap.zpool 在啟動時選擇另一種方法。數據分配器也可以在稍後階段通過 sysfs 接口進行更改。

壓縮算法

對於頁的壓縮,zswap 使用內核加密 API 提供的壓縮器模塊。默認情況下會使用 lz4 壓縮算法,但也可以在啟動時使用 zswap.compressor 更改壓縮算法。其他選項包括 deflate, lz4hc, lzo, lzo-rle, 842zstd

使用 sysfs 在運行時更改壓縮不會有問題,但在本例中,zswap 從 lz4 開始,並在稍後階段切換到定義的算法。要立即使用另一種算法啟動 zswap,必須通過內核引導參數進行設定,並且內核必須儘早加載相應的模塊。這可以通過以下步驟來實現:

  1. 將與所選壓縮器相關的模塊添加到 mkinitcpio#模塊(MODULES)數組中。
  2. 修改 mkinitcpio 配置後重新生成 ramdisk 環境:見 mkinitcpio#創建和啟用鏡像
  3. 內核參數中將 zswap.compressor 設定為你選擇的算法。

在下次啟動時,見 #當前參數來檢查 zswap 現在是否使用了請求的壓縮器。

另見