Linux swap 兩案之爭:虛擬 swap 對上 ghost swapfile
LKML/linux-mm 郵件列表 · 2026-10-08(LWN 報導日)
Linux 核心的 swap 項目不再必須等於 swapfile 上的一個實體 slot,兩套互相競爭的補丁都想把這條綁定拆開:Nhat Pham 的 Virtual Swap Space,與 Kairui Song、Chris Li 的 ghost swapfile。LWN 在 10 月 8 日的《The [vx]swap showdown》報導稱,兩案仍未合併;該文需訂閱才能閱讀,以下內容改依郵件列表上的 cover letter 撰寫。
原本的問題
現行設計裡,每個被換出的頁面都佔一個實體 swap slot,這個 slot 同時是 swap cache 與 swap cgroup 的索引鍵。依 Pham 的 RFC v2 cover letter,這帶來四個麻煩:
- 存進 zswap 的頁面、全零頁面,以及 zswap 拒收(且停用 writeback)的頁面,仍然佔用實體 slot。
- 沒有空閒磁碟空間的裝置無法用 zswap,只能改用 zram,兩個後端的功能因此重複。
- zswap 的容量實際上被 swapfile 大小限制,雖然它吃的正是它省下的記憶體。
- 管理員得預先猜 swap 要開多大,高記憶體機器上更難猜。
此外,把頁面從一個後端搬到另一個(例如 zswap 寫回磁碟)、或執行 swapoff,都得走訪頁表與 rmap,成本很高。
方案一:Virtual Swap Space
Pham 的做法是在 swap 之上加一層虛擬 slot:PTE 存虛擬 slot,後端可以是 zswap entry、全零頁、實體 swap slot 或記憶體中的頁面。[PATCH v6 00/22](2026-05-05)每個虛擬 slot 配一個 24 bytes 的 struct swp_desc,總共 22 個補丁、新增 mm/vswap.c,改動 33 個檔案。
v6 的重點是壓低 CPU 與記憶體開銷。cover letter 對 32 GB swapfile、用量 100% 的估算如下:
| 情境 | 舊設計 | vswap |
|---|---|---|
| zswap | 153.00 MB | 193.00 MB(多 40 MB) |
| 磁碟 swap | 89.00 MB | 259.00 MB(多 170 MB) |
在 zram 後端(作者認為是 vswap 開銷最壞的情境)上,並行的 usemem(52 threads × 300 MB,20 輪)實際時間相對基準,v5 慢 +22.4%,v6 為 -1.1%,其餘 benchmark 也回到誤差內。v6 的優化動機之一,是 Kairui Song 回報了快速 swapfile 後端(PMEM)上的退步;Pham 沒有 PMEM 可測,才改在 zram 上驗證。
約一個月後,Pham 又送出建立在 swap table 之上的精簡版:[RFC PATCH v2 0/7] Swap Table Edition(2026-06-12),只有 7 個補丁、新增 mm/vswap.h,以 CONFIG_VSWAP 控制;關閉時行為應與原本相同。在 zswap(zstd)上,usemem 的 free 時間為 6646 ms,基準為 7821 ms,快 15.0%,核心編譯則與基準持平。
方案二:ghost swapfile
Song 在 [PATCH RFC 00/15](2026-02-19)把 swap table 第四階段與 ghost swapfile 合併送出。ghost swapfile 是一個可在執行期成長的 swap 空間,cluster 資訊放在 Xarray,叢集內重用既有的配置器與 swap table;一般 swap 不增加查找成本。測試時以 swapon /dev/ghostswap 啟用,在 /proc/swaps 中和一般 swap 檔一樣顯示。
cover letter 稱想法由 Chris Li 提出,Nhat 建議用 Xarray 做動態大小。作者主張:只允許一個 ghost 檔、設為無限大並放在最上層,結果就等同虛擬 swap,但改動的行數少得多,且執行期可選用。這是 15 個補丁中的後 3 個,前 12 個是 swap table 第四階段;作者形容 ghost 部分只是最小可行的概念驗證。
swapon /dev/ghostswap # 測試用 ghost 裝置
cat /proc/swaps # 與一般 swapfile 並列兩案的差異
| Virtual Swap Space | ghost swapfile | |
|---|---|---|
| 抽象層 | PTE 存虛擬 slot,後端另配 | ghost 檔是一個特殊 swap 裝置 |
| 啟用方式 | 編譯期 CONFIG_VSWAP | 執行期 swapon |
| 規模 | v6 22 個補丁;RFC v2 7 個 | RFC 15 個(ghost 部分 3 個) |
| 每 slot 開銷 | 24 bytes 描述子(v6) | ghost/zswap 16 bytes,使用反向對應時 24 bytes |
兩案共用 swap table 這個基礎層,也都用 Xarray 做動態 cluster 配置,並都想讓 zswap 脫離 swapfile 大小的限制。
影響範圍
最直接受益的是跑 zswap 的無碟或小碟裝置:現在要用 zswap 就得先備一個 swapfile,之後可以不必。維護 swap 或 memcg 相關程式的人要留意兩處介面變動:vswap 的 swap entry 不再等於實體 slot,且沒有實體後端的虛擬 slot 不計入 memcg swap 計數,依賴舊行為的 cgroup 記帳工具要重新確認;ghost 則是新增一種 swap 裝置。
調校 swap 的管理員暫時不需動作,兩案都還沒進主線,且 LWN 標題所說的 showdown 尚未分出勝負。要在自己的 workload 上驗證,目前能做的是對照兩封 cover letter 的 benchmark:它們的硬體、後端與 LRU 設定各不相同,數字不能直接互比。
原始來源:ghost swapfile RFC 00/15、Virtual Swap Space v6 00/22、Swap Table Edition RFC v2 0/7、LWN 報導(需訂閱)