zswap 與 zram 的設定方式與參數調整
本文最後更新於:2026年9月7日 晚上
2026/09/07: 更新使用幾天 zswap 後的實際體驗
前言
前陣子看了 Chris Down 的這篇文章,決定把自己用了很久的 zram 換成 zswap,順便記錄一下兩者的設定方式
如無必要,建議不要使用 zram,詳見 Chris Down 的文章。zswap 實際上就包含了使用 zram 作為 swap 的概念,且 zswap 與記憶體管理子系統關係更密切,可以實現類似於加上緩存的三層結構
不使用 zram 作為 swap 最主要的原因,是 zram 的 swap 優先級總是較高。一開始產生的 cold page 會優先寫入 zram,持續佔用壓縮後的記憶體空間。等到記憶體出現壓力時,由於 zram 已滿,又會將較熱的頁面寫入實體 swap,使原先想實現的多層 swap 架構失敗。(不過我個人是沒遇到過啦,我的 zram 開的很激進,和實體 RAM 1:1,所以實際上從來沒有填滿 zram 過)
zswap
Arch 官方的核心都預設開啟了 zswap,只需要按自己需求調整參數即可,我建議是調max_pool_percent即可
可以調整的參數有幾個:
- shrinker_enabled: 預設開啟,當 zswap 中有大量冷數據時,會將這些冷數據寫入實體 swap,節省記憶體
- max_pool_percent: 預設為20,代表 zswap 壓縮後的資料最多可以佔用記憶體的幾 %。我建議可以提高到 40~60。我本身使用 zram 的時候就比較激進,平均壓縮比我猜測應該2.5x,開40%與實體 RAM 為 1:1 的 zram 應該差不多(還在測試中)
- compressor: 預設 zstd,壓縮算法,若要修改,建議在 lz4 與 zstd 之間二選一。建議不用改,要改還需要修改 initramfs 的設定(在 mkinitcpio 的 modules 中提早載入,或是其他的設定檔,看使用的 initramfs 生成器),不然改這個參數會變成先用 zstd 開機,開機後才改
- accept_threshold_percent: 預設為90,為了避免在記憶體高佔用的時候 zswap 收縮,把數據擠到 RAM 內讓壓力更大,當 zswap 達到容量上限後,必須等到使用量下降至設定的百分比,才會繼續接收寫入 zswap 的頁面。
根據用了幾天實測,實際壓縮率大約在 3.2 ~ 3.8 倍之間,zstd 的壓縮率比 lz4 高了一點,預設的 20% 應該也夠用,激進一點應該 30~40%就好,要在高可能也用不到,除非換成 lz4 或其他壓縮算法
壓縮率可以用/sys/kernel/debug/zswap/或/proc/meminfo內的資料計算,或是可以試試看我寫的一個小腳本: zswapstat
調整方式
這些參數都需要設定在 kernel cmdline 上
systemd-boot:
/boot/loader/entries/arch.conf
1 | |
grub:
/etc/default/grub
1 | |
如果其他 distro 的 kernel 沒有預設開啟 zswap,可以使用 zswap.enabled=1 啟用。
不過需要確認 kernel 是否已編譯 zswap 支援,不然可能需要用modules-load.d去載入(大部分 distro 應該都已經編譯進核心了)
可以用指令確認目前的核心是否有編譯並預設開啟
1 | |
CONFIG_ZSWAP=y代表有編譯進核心,CONFIG_ZSWAP_DEFAULT_ON=y代表預設開啟
如何 disable writeback: 簡單來說就是不寫入實體 swap,實體 swap 僅用於 hibernate,或是在啟用 zswap 時作為後端 swap 空間
其他參數
我還有調整一些 sysctl 中 vm 的相關參數,參考 zram 的建議設定進行調整
/etc/sysctl.d/99-vm-zswap-paRAMeters.conf
1 | |
考慮到是使用 SSD,swappiness設為100,如果是使用 HDD 做 swap,可以設為預設的60應該不錯
watermark_boost_factor和watermark_scale_factor和 zram 的建議值一樣,因為 zswap 和 zram 都是在記憶體中壓縮數據
注釋掉了page-cluster回到預設的3,因為會有實際寫入實體 swap 的狀況,一次讀寫較大的 chunk
zram
需要先載入 zram module
/etc/modules-load.d/zram.conf
1 | |
建立 zram 的方式有很多種,我比較喜歡使用 udev 規則建立,其他方式可以看 wiki 上的介紹
/etc/udev/rules.d/99-zram.rules
1 | |
將 zram 掛載為 swap
/etc/fstab
1 | |
sysctl 參數調整
/etc/sysctl.d/99-vm-zram-paRAMeters.conf
1 | |