開始輸入,可搜尋發票、服務、域名、工單,以及 更多...
記憶體較小的 VPS 在編譯軟體、執行資料庫或流量突增時,容易因記憶體耗盡觸發 OOM,導致 MySQL 等程序被系統強制結束。Linux 新增 Swap 虛擬記憶體可以在實體記憶體不足時把不常用的資料暫存到磁碟,作為一道安全緩衝。本文介紹如何建立 swap 檔案、開機自動啟用以及調整 swappiness,適用於 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux 的 KVM VPS 和獨立伺服器。
先用 free -h 檢視記憶體和現有 swap,用 swapon --show 確認是否已啟用 swap,再用 df -h 確認根分割槽有足夠的剩餘空間。下表是常見的 swap 大小參考:
| 實體記憶體 | 建議 Swap 大小 |
|---|---|
| 1 GB 及以下 | 1–2 GB |
| 2–4 GB | 2 GB |
| 8 GB 及以上 | 2–4 GB(或按需) |
free -h
swapon --show
df -h /
fallocate 可以瞬間分配指定大小的檔案,速度最快。如果提示不支援(部分舊版檔案系統),改用 dd 逐塊寫入,耗時稍長但相容性最好。下文以 2 GB 的 /swapfile 為例。
# Create a 2 GB swap file
fallocate -l 2G /swapfile
# If fallocate fails ("Operation not supported"), use dd instead
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
swap 檔案中可能包含記憶體裡的敏感資料,必須設定為僅 root 可讀寫(600)。然後用 mkswap 格式化為 swap 格式,用 swapon 立即啟用,再次執行 free -h 應能看到 Swap 一行的容量。
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
free -h
swapon 只對本次開機有效,需要在 fstab 中加入一行才能在重啟後自動掛載 swap。修改前先備份 fstab。
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
swappiness 取值 0–100,表示核心使用 swap 的積極程度。伺服器場景通常希望優先使用實體記憶體,只在必要時才用 swap,建議設定為 10 左右。通過 /etc/sysctl.d/ 寫入配置檔案可以永久生效。
cat /proc/sys/vm/swappiness # usually 60 (Debian/Ubuntu) or 30 (some RHEL images)
sysctl vm.swappiness=10 # apply now
# Make it permanent
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.conf
sysctl --system
如果不再需要 swap 或想調整大小,先停用並從 fstab 中刪除對應行,再刪除檔案。調整大小時重新執行步驟 2–4 即可。
swapoff /swapfile
sed -i '\|^/swapfile |d' /etc/fstab
rm -f /swapfile
free -h
“Invalid argument”多見於 fallocate 在不支援的檔案系統上建立的檔案,改用 dd 重新建立即可。“Operation not permitted”通常表示伺服器是容器型虛擬化,不允許自行新增 swap,此時請聯絡支援確認。
不是。swap 過大並不會提升效能,反而佔用磁碟空間;當系統頻繁使用大量 swap 時,響應會明顯變慢。按上表設定即可,真正記憶體不足應升級配置。
可以執行 grep VmSwap /proc/*/status | sort -k2 -n | tail 檢視佔用 swap 最多的程序,或安裝 htop 並顯示 SWAP 列。
如按以上步驟操作後仍無法解決,歡迎提交工單聯絡 IMIDC 7×24 技術支援。提交時請註明伺服器 IP、作業系統、已執行的命令和報錯截圖,工程師可以更快定位問題。