English

系統 · 技術報告Windows · Linux · macOS · Android

執行摘要 · 單頁綜覽

交換空間是回收公平性,不是緊急記憶體

五個平台,一套機制。匿名記憶體 — 程序配置的一切 — 是核心唯一無處安放便無法回收的頁面類型。因此停用交換空間並未消除記憶體壓力,只是把壓力全部轉嫁給頁面快取與程式碼,而它們接著會被反覆從磁碟重讀。如今各大平台的解法一致:先在記憶體中壓縮,唯有壓縮耗盡才寫入持久儲存。Windows 稱之為記憶體壓縮,macOS 稱為 compressor pager,Linux 與 Android 稱為 ZRAM — 但架構完全相同,且交換的代價始終是同一項:以運算週期換取容量。五者之間真正的差異其實很窄,只有三件事重要。

關鍵數據 壓縮與耐久

  • ~40%頁面壓縮後佔比(Windows 10 時期數據)
  • 3:1Linux ZRAM 典型壓縮比
  • 2.4 PB耐久測試中最長壽消費級 SSD 的寫入量
  • 16.4 yr600 TBW 硬碟每日寫入 100 GB 的理論壽命

真正重要的三個面向 其餘皆為細節

面向它問的問題為何決定設計
持久層是否存在以儲存為後端的交換空間?部分 Android 實作僅調整 ZRAM — 根本沒有可落盤的第二層。
休眠該層能否承載休眠映像?唯一的硬性功能分界:壓縮層開機即清空,永遠無法承載。
可調程度暴露了多少調校機制?Windows 與 macOS 近乎全自動;Linux 開放參數;Android 僅提供一個滑桿。

全文結構 起 · 承 · 轉 · 合

段落內容
起 · 承 脈絡2各平台共同收斂的兩層架構逐項並列,以及交換空間為何仍有必要。
轉 轉折3設計的穩固處與吃緊處 — 包含哪些廠商說法經得起實測。
合 結論4頁面的實際去向、實際存在的調校參數,以及各平台的具體做法。

總結

停用交換空間並不能避免記憶體壓力下的磁碟 I/O — 只是把反覆置換從匿名頁面轉移到頁面快取與程式碼,通常更糟。

重新定位

長期偏深的交換使用量是容量訊號,而非調校問題。解法是加記憶體,不是加交換空間。

來源 · kernel.org /proc/sys/vm · Microsoft Learn · Red Hat · AOSP LMKD · Btrfs 官方文件 · Chris Down《In defence of swap》(2018) · TechReport SSD 耐久實驗 (2015)

起 — 兩層架構,五種名稱 各家共同收斂的形狀

  • 第一層 · 位於記憶體

    壓縮層

    以運算換取容量

    • Windows 記憶體壓縮 — Xpress-Huffman,存放於 System 程序內的壓縮儲存區。
    • macOS compressor pager — WKdm;Apple 得以出貨較低記憶體配置的關鍵。
    • Linux ZRAM/zswap — zstd、lzo 或 lz4,典型約 3:1。
    • Android ZRAM — 永遠是第一道防線,早於任何儲存寫入。
  • 第二層 · 位於儲存

    持久層

    僅在壓縮耗盡時觸及

    • Windows pagefile.sys;另有 swapfile.sys,以單次 I/O 搬移暫停應用的整個工作集。
    • Linux 分割區檔案 — 功能等價;檔案以一層檔案系統對映換取彈性。
    • macOS 自 Big Sur 起將動態 swapfile 置於專屬 APFS VM 卷宗。
    • Android — 選用的 UFS swapfile;這才是廠商「擴充 RAM」的真實內容。

逐平台對照 同一機制,不同暴露程度

技術後端休眠壓縮
Windows pagefileNTFS 上的檔案另存映像是 — Xpress-Huffman
Windows swapfile檔案,僅限新式應用是 — 每應用一區
Linux 分割區獨立分割區否 — 可搭配 zswap
Linux 交換檔案檔案系統上的檔案是,需 offset否 — 可搭配 zswap
Linux ZRAM記憶體中的區塊裝置永不是 — 這就是重點
macOS 動態交換APFS VM 卷宗是 — WKdm
Android ZRAM記憶體中的區塊裝置永不是 — lz4/zstd
Android 擴充 RAMUFS 上的 swapfile先經 ZRAM

承 — 交換空間為何仍有必要 左文 · 右數據

檔案頁面可丟棄後再讀回;匿名頁面卻無處可去。沒有交換空間,它們就是不可回收的,核心只能改從頁面快取與程式碼中榨取所需的每一位元組。因此支持交換空間最有力的論點不是容量,而是對稱性:讓兩類頁面同等可回收,核心才能淘汰真正較冷的那一邊。這一背書屬制度層面而非修辭 — systemd-oomd 官方 man page 直接引用此論點,並指出應啟用交換空間,否則系統會更快進入 livelock,反而餓死原本要來救援的使用者空間終止程式。

  • 2兩類頁面同等可回收
  • 4.20+支援 PSI 的核心 — OOM 前即可見壓力

來源 · Chris Down《In defence of swap》· systemd-oomd(8) · kernel.org PSI 文件 · Btrfs 上游文件

轉 — 穩固處與吃緊處 四個面向

面向穩固吃緊
休眠實體分割區或檔案可承載映像壓縮層開機即清空 — 永遠無法替代
快閃壽命六顆消費級 SSD 全數超越標示,其中一顆達 2.4 PB低階 eMMC 與伺服器長期寫入仍需審慎
廠商說法實測檔案系統即可定論 — 有些確實加了真實層級「8GB+8GB=16GB」是行銷,不是算術
混用層級各層單獨使用皆穩健ZRAM 與磁碟交換並用會引發 LRU 反轉

Android 滑桿的實際作為 以實測定論,而非讀說明

行為移動滑桿時實際改變了什麼代價
僅調整 ZRAM 目標分割區與交換區皆無變化 — 只改變分配給壓縮層的記憶體量。運算
真實儲存交換資料分割區可用空間確實減少所要求的量,而 ZRAM 池不變。UFS 寫入
兩個名稱,一件事排程與記憶體最佳化的行銷名稱並非交換空間;只有 GB 滑桿才是。混淆
4GB 記憶體以下確有助益 — 更多背景應用得以保活,而非被殺後重載。值得
12GB 記憶體以上日常幾乎用不到;評測普遍反映關閉後動畫更順。掉幀

耐久疑慮,已有定論 左文 · 右數據

「交換空間會磨損硬碟」是最頑固的疑慮,而它大致已有答案。在最著名的長期實驗中,六顆消費級 SSD 被持續寫入至損壞:第一顆故障發生在 700 TB 之後,最後倖存者吸收了 2.4 PB — 每一顆都遠超其標示耐久值。廠商也明言標示數字代表保固終點,而非故障點。換算後更為具體:一顆 600 TBW 的硬碟即使每天寫入 100 GB,理論上仍可用十六年以上,而幾乎沒人寫得這麼多。仍需審慎的只有兩種情況 — 平價手機的低階 eMMC,以及長期高強度寫入的伺服器,後者應依每日寫入量而非容量來選型。

  • 6 / 6超越標示壽命的硬碟數
  • 2仍需審慎的情況

轉捩點 依時間排序

  1. 2015長期耐久實驗結束:受測消費級 SSD 全數超越標示壽命,第一顆直到 700 TB 後才故障。
  2. 2015Windows 10 在分頁活動與 pagefile 之間插入記憶體壓縮,寫入磁碟的頁面約減半。
  3. 2018回收公平性論點發表,將交換空間從緊急備援重新定位為常規機制。
  4. 2018PSI 進入核心,使使用者空間能在 OOM killer 介入之前依停頓時間行動。
  5. 2020macOS 將交換空間移至專屬隱藏 APFS 卷宗,與系統動態共享空間。
  6. 2020→主流發行版預設啟用 ZRAM,並刻意將其作為唯一交換裝置,以避免混用層級所引發的反轉。
  7. 2021→Android 廠商推出「擴充 RAM」選項 — 有的僅調整 ZRAM,有的確實寫入儲存。

來源 · TechReport SSD 耐久實驗 · Microsoft Learn · Android Authority(對市售機的 adb 實測)· 廠商官方文件

合 — 一個頁面的去向 依序六步

  1. 01駐留位於記憶體
  2. 02壓縮仍在記憶體
  3. 03落盤寫入磁碟或 UFS
  4. 04壓力PSI 回報停頓
  5. 05提早處理使用者空間終止
  6. 06加記憶體真正的解法

實際存在的調校參數 Linux · 括號內為預設值

參數作用何時調整
vm.swappiness (60)相對於回收頁面快取,核心換出匿名記憶體的積極程度。當交換空間快於檔案系統(如 ZRAM)時,可調高於 100。
vm.vfs_cache_pressure (100)相對於頁面快取,回收目錄與 inode 快取的積極程度。少動。設為 0 會招來記憶體不足終止程式。
vm.watermark_scale_factor (10)背景回收何時喚醒,以及喚醒後釋放多少。在容易突發大量配置的機器上調高,以保留更多可用記憶體。
Android LMKD 屬性決定何時終止哪個程序的剩餘交換與反覆置換門檻。僅限 root 且依機型而異 — 核心內建終止程式多年前已移除。

兩種姿態,而非五套做法 由誰決定 — 廠商,還是你

  • Windows · macOS

    不要干預

    廠商已代為決定

    • 壓縮與落盤已整合且全自動;沒有可調之處。
    • 停用分頁檔會失去當機傾印並降低認可上限 — 不划算。
    • 在 macOS 上停用交換空間等同弱化系統保護;正解是加記憶體。
    • 看記憶體壓力指標,而非交換空間數字。
  • Linux · Android

    刻意選擇

    預設值並非決定

    • 先決定層級 — 是否休眠 — 再決定大小。
    • 寫入時複製檔案系統對交換檔案有實質限制;請遵循其專屬流程。
    • 讓壓力監測搭配使用者空間終止程式,否則機器卡住前無人處理。
    • 在手機上,把滑桿視為以幀率為代價的背景應用保活旋鈕。

建議 依平台

  • Windows — 讓系統自動管理 pagefile。為省幾 GB 而停用會失去當機傾印並可能導致不穩;SSD 壽命並非實際考量。
  • Linux — 只選一層,不要並用。桌機用 ZRAM(約記憶體一半、zstd);需休眠則用不小於記憶體的實體分割區或檔案。切勿讓 ZRAM 與磁碟交換並存。
  • Linux 伺服器 — 讓 PSI 搭配使用者空間 OOM 守護程式。否則核心終止程式只會在機器已卡住後才動作。
  • Android — 4GB 開啟,12GB 關閉。儲存比記憶體慢上數個數量級,旗艦機開啟後的實測代價是掉幀。

最終落點

只需問三個問題:是否需要休眠、是否混用層級、交換深度是否在告訴你該加記憶體?其餘皆為細節。