後端工坊 2026 年 10 月 9 日

2026-10-09 — Linux swap 兩案之爭:虛擬 swap 對上 ghost swapfile

primary=https://lkml.iu.edu/2602.2/05109.html primary=https://ratatoskr.run/linux-mm/2026/05/3545611/t primary=https://ratatoskr.run/linux-mm/2026/06/17126960/t

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
zswap153.00 MB193.00 MB(多 40 MB)
磁碟 swap89.00 MB259.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 Spaceghost 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 報導(需訂閱)


End of article
0
Would love your thoughts, please comment.x
()
x