Linux VPS 新增 Swap 交換空間教學(適合 512MB / 1GB 小記憶體方案)
在 512 MB 或 1 GB 的雲端伺服器上,資料庫、PHP-FPM 加上一次套件更新,很容易在同一時間用光記憶體。這時核心的 OOM killer 會強制結束程式,最常被犧牲的就是 MySQL 或 MariaDB。在 Linux VPS 新增 Swap 交換空間,等於在硬碟上準備一塊溢出區,短暫的記憶體高峰不再讓服務當掉。本文在 Debian、Ubuntu、CentOS、Rocky Linux 與 AlmaLinux 上建立 swap 檔、設定開機自動掛載並調整 swappiness,同時說明小方案在什麼情況下 swap 才真正有幫助。
步驟 1:檢查目前的記憶體與 Swap
先確認伺服器有多少 RAM 與 swap、硬碟還剩多少空間,以及核心是否已經因為記憶體不足而結束過程式。
free -h
swapon --show # no output = no swap yet
df -h / # make sure there is enough free disk space
# Has the kernel already killed processes for lack of memory?
journalctl -k | grep -i -E 'out of memory|killed process'
如果 swapon --show 已經列出裝置或檔案,也許只需要調整參數(步驟 6),不必再新增一個。
步驟 2:決定合適的 Swap 大小
在 VPS 上,swap 是安全緩衝,不能取代 RAM。常見小方案可參考下表:
| 方案記憶體 | 建議 Swap | 說明 |
|---|---|---|
| 512 MB | 1 GB | 強烈建議 |
| 1 GB | 1 GB - 2 GB | 有資料庫或控制面板時建議 |
| 2 GB | 1 GB | 作為安全緩衝 |
| 4 GB 以上 | 1 GB - 2 GB 或不設 | 僅作緊急緩衝 |
swap 檔會佔用伺服器 SSD 空間,決定大小前請先確認步驟 1 的剩餘空間。
步驟 3:用 fallocate 或 dd 建立 Swap 檔
fallocate 能瞬間預留空間;部分檔案系統不支援用它建立 swap,這時改用 dd 逐區塊寫入,雖然較慢但一定可行。檔案權限必須只有 root 可讀寫。
# Fast method (ext4, XFS)
fallocate -l 1G /swapfile
# If fallocate fails, or swapon later reports "file has holes", use dd instead
rm -f /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
chmod 600 /swapfile
ls -lh /swapfile
swapon 可能出現「Operation not permitted」。步驟 4:格式化並啟用 Swap(mkswap 與 swapon)
mkswap 寫入 swap 標記,swapon 立即啟用,不需要重開機。
mkswap /swapfile
swapon /swapfile
swapon --show
free -h
步驟 5:寫入 /etc/fstab 讓 Swap 開機自動啟用
沒有 fstab 設定,重開機後 swap 就會消失。先備份檔案、加入一行,再關閉 swap 後用 swapon -a 重新啟用來測試——它讀取 fstab 的方式和開機流程相同。
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Test the fstab entry without rebooting
swapoff /swapfile
swapon -a
swapon --show
步驟 6:調整 VPS 的 swappiness
vm.swappiness 決定核心多積極地把記憶體分頁搬到 swap。預設值 60 是為桌面環境設計的;伺服器設為 10,可讓常用資料留在 RAM,只有真正吃緊時才使用 swap。調低 vfs_cache_pressure 則能讓檔案系統中繼資料快取保留久一點。
cat /proc/sys/vm/swappiness # often 60 by default
# Apply now
sysctl vm.swappiness=10
sysctl vm.vfs_cache_pressure=50
# Keep after reboot
cat > /etc/sysctl.d/99-swap.conf <<'EOF'
vm.swappiness=10
vm.vfs_cache_pressure=50
EOF
sysctl --system
步驟 7:512 MB - 1 GB 方案什麼時候適合用 Swap
swap 適合應付短暫高峰:執行 apt upgrade 或 dnf update、編譯軟體、Composer 或 npm 安裝、夜間備份,或資料庫短時間需要更多緩衝。若工作負載長期需要比方案更多的記憶體,swap 就無法解決。請檢查系統是否持續在使用 swap:
# Watch the si (swap in) and so (swap out) columns for 10 seconds
vmstat 1 10
si、so 偶爾不是 0 沒有關係;若長時間數值都很高,代表伺服器在頻繁換頁,整體會變得非常慢。這時請降低記憶體用量(減少 PHP-FPM worker、縮小資料庫緩衝),或為 VPS 加大 RAM——JUSTG 雲端伺服器可在客戶中心或透過工單加購 RAM。
步驟 8:調整大小或移除 Swap 檔
# Resize to 2 GB or remove swap
swapoff /swapfile
rm -f /swapfile
# To remove completely, also delete the fstab line:
sed -i '\|^/swapfile |d' /etc/fstab
# To resize, repeat Step 3 and Step 4 with the new size (fstab line stays)
常見問題
Swap 會讓 SSD 壽命變短嗎?
swappiness 設為 10、只在高峰時使用 swap 的情況下,寫入量很小。若長時間大量換頁,代表需要的是更多 RAM,而不是更多 swap。
Swap 檔會比 Swap 分割區慢嗎?
在新版核心上差異可以忽略。swap 檔在 VPS 上更容易建立、調整與移除,因此本文採用 swap 檔。
加了 Swap,MySQL 還是被結束,怎麼辦?
請檢查 journalctl -k | grep -i oom 與 free -h。若 swap 已用滿,請調低 innodb_buffer_pool_size 與網站伺服器 worker 數量,或升級方案的 RAM。
如需協助處理伺服器的 Swap 或記憶體問題,請至 https://www.justg.com/submitticket.php 提交工單,JUSTG 技術支援團隊會協助您。