Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 交換空間完整管理指南:規劃、配置、調優與監控實戰

編輯:關於 Linux

交換空間是 Linux 虛擬記憶體系統的關鍵組成,當實體記憶體(RAM)不足時,核心將非活躍記憶體頁面換出至交換裝置,釋放 RAM 供活躍進程使用。合理規劃與管理交換空間,能避免 OOM Killer 殺死關鍵進程、支援休眠、提供崩潰核心轉儲空間。本文系統涵蓋交換空間運作原理、容量規劃建議、分區/檔案兩種建立方式、啟用與永久掛載、swappiness 調優、多交換裝置優先權、效能監控與常見誤區。

一、虛擬記憶體與交換空間運作原理

  • 分頁: 核心以 4 KB(x86_64 預設)為單位管理記憶體,將進程虛擬位址空間對映至實體頁框或交換槽位。
  • 換出: 頁面回收守護進程(kswapd)依據 LRU 演算法選擇非活躍/可丟棄頁面寫入交換裝置。
  • 換入: 進程存取已換出頁面觸發缺頁中斷,核心從交換裝置讀回實體記憶體。
  • 交換裝置類型: 區塊裝置(磁碟分區、LVM 邏輯卷、NVMe 命名空間)、交換檔案(循環掛載)、壓縮交換(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. 交換分區(傳統、效能最佳)

# 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

2. 交換檔案(彈性、適合雲端/容器/無分區空間)

# 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。

3. zram/zswap:記憶體內壓縮交換(高效能、無 I/O)

# 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 適合作為實體交換前的壓縮緩衝層。

四、swappiness 與核心交換行為調優

vm.swappiness(0–200,預設 60)控制核心傾向換出匿名頁面(堆疊/堆積)而非頁面快取(檔案快取)。

  • 0: 極度避免交換,僅在 OOM 邊緣才換出(適合資料庫、即時系統)。
  • 10–30: 保守,優先保留匿名頁在 RAM(推薦生產伺服器)。
  • 60(預設): 平衡桌面回應與快取效能。
  • 100–200: 激進換出,釋放 RAM 給快取(適合檔案伺服器、建置節點)。
# 臨時生效
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 核心級頁面活動統計

七、常見誤區與最佳實踐總結

  1. 誤區:「交換空間越大越好」 → 過大交換延長 OOM 偵測時間,導致系統長時間抖動後才殺進程。
  2. 誤區:「SSD 不能做交換」 → 現代 NVMe SSD 壽命極長(TBW 數 PB 級),交換寫入量極小,完全可用;且延遲遠低於 HDD。
  3. 誤區:「關閉交換提升效能」 → 無交換時記憶體壓力直接觸發 OOM Killer,隨機殺死進程(含資料庫、SSH),風險極高。
  4. 最佳實踐: 至少保留 1–2 GB 交換空間(分區或檔案),設定 vm.swappiness=10-30,啟用 zram 做第一級緩衝,監控 si/so 指標納入告警體系。
  5. 容器環境: 宿主機配置交換,容器透過 memory.swap.max 限制使用量,避免單容器耗盡宿主交換空間。

結語

交換空間管理是 Linux 系統穩定性的基石。科學規劃容量、選擇適當裝置類型、調優 swappiness、建立多層級優先權、持續監控關鍵指標,能讓系統在記憶體壓力下優雅降級而非崩潰。將交換空間視為「最後防線」而非「記憶體延伸」,並配合應用層記憶體管理(JVM Heap、InnoDB Buffer Pool、PHP opcache 等),構建彈性可靠的生產環境。

Linux 交換空間架構示意圖

Copyright © Windows教程網 All Rights Reserved