交換空間是 Linux 虛擬記憶體系統的關鍵組成,當實體記憶體(RAM)不足時,核心將非活躍記憶體頁面換出至交換裝置,釋放 RAM 供活躍進程使用。合理規劃與管理交換空間,能避免 OOM Killer 殺死關鍵進程、支援休眠、提供崩潰核心轉儲空間。本文系統涵蓋交換空間運作原理、容量規劃建議、分區/檔案兩種建立方式、啟用與永久掛載、swappiness 調優、多交換裝置優先權、效能監控與常見誤區。
zram/zswap)。「交換空間應為 RAM 的 2 倍」是舊時代經驗法則(RAM 稀缺、休眠需求),現代大記憶體伺服器需依場景科學規劃:
| 場景 | RAM 範圍 | 建議交換空間 | 理由 |
|---|---|---|---|
| 桌面/筆電(支援休眠) | 任意 | ≥ RAM 大小 | 休眠需將全部 RAM 內容寫入交換空間 |
| 一般伺服器 | < 8 GB | 1–2 × RAM | 緩衝記憶體壓力,支援核心轉儲 |
| 一般伺服器 | 8–64 GB | 4–8 GB | 避免過大交換導致抖動,足夠核心轉儲 |
| 大記憶體伺服器/資料庫 | > 64 GB | 8–16 GB 或 1:1(視工作負載) | InnoDB/SGA 等已管理記憶體,交換僅作緩衝 |
| 高效能/即時系統 | 任意 | 最小化(1–2 GB)或關閉 | 避免交換延遲抖動,依賴 RAM 鎖定與容量規劃 |
| 嵌入式/容器 | 受限 | 依記憶體限額設定 | 配合 cgroup memory.swap.max 限制 |
核心原則: 交換空間是「安全網」而非「記憶體擴充」。長期高交換使用率(>30%)表示記憶體嚴重不足,應擴充 RAM 或優化應用,而非盲目擴大交換。
# 1. 規劃分區(fdisk/parted/gdisk),類型碼 82 (Linux swap) / 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F (GPT)
# 2. 格式化為交換區
mkswap -L SWAP_PART /dev/sdb2
# 3. 啟用
swapon /dev/sdb2
# 4. 永久掛載 /etc/fstab
LABEL=SWAP_PART none swap defaults 0 0
# 或 UUID
UUID=xxxx-xxxx none swap defaults 0 0
# 1. 建立固定大小檔案(fallocate 瞬間配置,不佔實際資料區)
fallocate -l 8G /swapfile
# 或 dd(較慢但相容所有檔案系統)
dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress
# 2. 設定權限(關鍵:僅 root 可讀寫)
chmod 600 /swapfile
# 3. 格式化並啟用
mkswap /swapfile
swapon /swapfile
# 4. 永久掛載 /etc/fstab
/swapfile none swap defaults 0 0
# 5. 驗證
swapon --show
free -h
注意: Btrfs/ZFS 上建立交換檔需停用 COW(chattr +C)並預先配置空間,否則效能極差且可能導致死鎖。建議改用專用交換分區或 zram。
# zram:將記憶體壓縮作為塊裝置交換
modprobe zram num_devices=1
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 100 /dev/zram0 # 高優先權,優先使用
# zswap:前端壓縮快取,後端仍需交換分區/檔案
echo 1 > /sys/module/zswap/parameters/enabled
echo lz4 > /sys/module/zswap/parameters/compressor
echo 20 > /sys/module/zswap/parameters/max_pool_percent
zram 適合記憶體受限裝置(嵌入式、容器、CI 執行器);zswap 適合作為實體交換前的壓縮緩衝層。
vm.swappiness(0–200,預設 60)控制核心傾向換出匿名頁面(堆疊/堆積)而非頁面快取(檔案快取)。
# 臨時生效
sysctl -w vm.swappiness=10
# 永久生效
echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf
sysctl --system
進階參數:
vm.vfs_cache_pressure(預設 100):控制目錄項/索引節點快取回收傾向,降低可保留更多檔案系統中繼資料快取。vm.watermark_scale_factor:調整 kswapd 喚醒閾值精度(大記憶體機器建議調大)。swapon -p PRIORITY(-1 至 32767,預設 -1)設定優先權,核心優先使用高優先權裝置。相同優先權輪詢(Round-robin)分散 I/O。
# 例:zram 高優先,NVMe 交換分區中優先,HDD 交換檔低優先
swapon -p 100 /dev/zram0
swapon -p 50 /dev/nvme0n1p2
swapon -p 10 /swapfile_hdd
/etc/fstab 中以 pri=值 指定:
/dev/zram0 none swap defaults,pri=100 0 0
/dev/nvme0n1p2 none swap defaults,pri=50 0 0
| 工具/指令 | 關鍵指標 | 異常判讀 |
|---|---|---|
free -h / swapon -s |
總量、已用、可用 | 交換使用率持續 >30% → 記憶體不足 |
vmstat 1 |
si (swap in), so (swap out) | si/so 持續非零 → 記憶體抖動 |
sar -W 1 |
pswpin/s, pswpout/s | 歷史趨勢分析 |
pidstat -r 1 |
Minflt, Majflt, VSZ, RSS, %MEM | 定位高交換進程 |
smem / ps aux --sort=-%mem |
PSS, USS, RSS | 精準記憶體佔用分析 |
cat /proc/vmstat | grep pg |
pgpgin, pgpgout, pgfault, pgmajfault | 核心級頁面活動統計 |
vm.swappiness=10-30,啟用 zram 做第一級緩衝,監控 si/so 指標納入告警體系。memory.swap.max 限制使用量,避免單容器耗盡宿主交換空間。交換空間管理是 Linux 系統穩定性的基石。科學規劃容量、選擇適當裝置類型、調優 swappiness、建立多層級優先權、持續監控關鍵指標,能讓系統在記憶體壓力下優雅降級而非崩潰。將交換空間視為「最後防線」而非「記憶體延伸」,並配合應用層記憶體管理(JVM Heap、InnoDB Buffer Pool、PHP opcache 等),構建彈性可靠的生產環境。

Linux 記憶體 Cache 深度分析:為何 Cache 佔用超過實體記憶體?
Linux 系統使用 mpstat 指令監控 CPU 使用率完整指南
Ubuntu Chromium 安裝 Flash Player (PepperFlash) 完整圖文教學
Linux 下 Git 與 SVN 共存協作:git svn 橋接完整實戰指南
CentOS 6.0 手动升级至 6.2:替换 163 源与 yum update 实战
Linux 安裝 Python 第三方庫報錯「Python version 2.7 required」?註冊表修復腳本解決
Linux netstat 查看 80 埠連線數完整指令集:總連線、ESTABLISHED、IP 統計與 Apache 並發分析