跳去主要內容
🛠️ 得閒搞兩嘢
返上一頁

💾 1GB VPS 唔想突然 OOM:Debian / Ubuntu Swap File 實用設定

更新日期:

💾 1GB VPS 唔想突然 OOM:Debian / Ubuntu Swap File 實用設定

細 VPS 最常見嘅問題唔係 CPU,而係 RAM 太少 😅。

512MB、1GB、2GB 平時跑幾個細 Service 可以完全冇事,但一到更新 Package、Build Image、某個 Container 突然食多咗 Memory,Kernel 就有機會直接 OOM Kill 💥。

Swap 唔係免費 RAM,更加唔會令一部 1GB VPS 變成 3GB RAM。佢比較似一層緩衝:當 Memory 短時間頂到上限,畀 Kernel 多一個地方可以搬走暫時唔活躍嘅 Page,避免 Service 咁快被殺。

所以我開細機第一件事通常唔係「一定加 2GB Swap」,而係先睇清楚部機本身有冇 👀。

🔎 先睇而家有冇 Swap

swapon --show

再配:

free -h

想直接睇 Kernel 記錄:

cat /proc/swaps

有啲 VPS Provider 已經預設開咗 Swap Partition / File,呢種情況就唔需要再疊一個落去。

📏 Swap 要幾大,其實冇標準答案

以前常見「RAM 幾多,Swap 就幾多倍」呢類公式,但對 VPS 我覺得參考價值唔算高。

如果只係想防短時間 Memory Spike,可以大概由呢個範圍開始諗:

RAM可考慮嘅 Swap
512MB1GB ~ 2GB
1GB1GB ~ 2GB
2GB1GB ~ 2GB
4GB 或以上睇 Workload 再決定

真正要睇嘅係 Workload。

如果部機日常已經長期 Swap in / out 幾 GB,咁問題通常唔係 Swap 太細,而係 RAM 真係唔夠 ⚠️。

🧱 建一個 2GB Swap File

先睇 Root Filesystem:

df -T /

如果係常見 ext4,下面做法通常比較直接。

我偏向用 dd 建 File,做法保守啲:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

跟住一定要收緊權限 🔐:

sudo chmod 600 /swapfile

Swap 可能包含 Process Memory 內容,所以唔應該畀普通 User 讀。

建立 Swap Signature:

sudo mkswap /swapfile

啟用:

sudo swapon /swapfile

確認:

swapon --show
free -h

到呢度見到 /swapfile,即時使用已經完成 ✅。

🔁 Reboot 之後仲要識得自己返嚟

只做 swapon 唔夠,仲要寫入 /etc/fstab

我會先 Backup:

sudo cp /etc/fstab /etc/fstab.bak

再加:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

檢查尾幾行:

tail -n 5 /etc/fstab

之後有機會 Reboot 時,再跑:

swapon --show

確認佢真係自動掛返。

🎚️ vm.swappiness=10 唔係宇宙標準答案

以前 VPS 教學好鍾意直接叫人設:

vm.swappiness=10

但 Linux Kernel 對 vm.swappiness 嘅定義其實係一個 I/O Cost 取捨,範圍係 0200,唔係簡單「數字越低越快」。

先睇目前值:

sysctl vm.swappiness

普通 VPS 如果 Storage 唔算快,而又唔想系統太積極用 Swap,可以由 1020 呢類較低值開始觀察,但我唔會見到有少量 Swap Usage 就當成異常。

臨時改:

sudo sysctl vm.swappiness=20

用落冇問題再持久化:

echo 'vm.swappiness=20' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

用獨立 /etc/sysctl.d/ File,比不停追加 /etc/sysctl.conf 易管理好多 👍。

📊 真正要睇嘅唔係「Swap Used 幾多」

free -h 見到 Swap 用咗幾十 MB,唔代表部機有問題。

我反而會睇有冇持續 Swap I/O:

vmstat 1

留意:

如果長時間不停有大量 si / so,同時 I/O Wait、Load 都升,部機就可能已經真係 Memory Pressure 太大。

再搵邊個 Process 食 RAM:

ps aux --sort=-%mem | head

Docker 機就:

docker stats

呢個時候加多幾 GB Swap 只係延遲問題,唔係解決問題 🫠。

🌳 Btrfs 唔好照抄 ext4 做法

如果:

df -T /

見到係 btrfs,我會停一停先。

Btrfs 有 Copy-on-write,同 Swap File 有額外要求。swapon / mkswap 新版工具已經有相關支援,但做法同普通 ext4 唔完全一樣,所以最好按自己 util-linux 同 Btrfs 版本查 Manual。

呢類地方我寧願多查一次,都唔想用一條網上十年前嘅 Command 硬做 🙃。

🧹 如果唔再要 Swap

先停:

sudo swapoff /swapfile

確認:

swapon --show

再由 /etc/fstab 刪走:

/swapfile none swap sw 0 0

最後先:

sudo rm /swapfile

如果之前加過:

/etc/sysctl.d/99-swappiness.conf

而又唔再需要自訂 Swappiness,就一齊清返。

🧠 我點理解 Swap

對細 VPS 嚟講,我會將佢理解成:

正常用 RAM

短時間 Memory Spike

Swap 提供 Buffer

降低即刻 OOM 嘅機會

佢最有價值嘅地方係「頂一頂」,唔係「代替 RAM」。

如果一部機日常已經不停 Swap,最好做嘅唔係再加 Swap,而係減 Service、限制 Container Memory,或者直接升 RAM 💸。

對 1GB 左右嘅小 VPS,我通常會留一個合理大小嘅 Swap File,再配合 vmstat 觀察。咁樣比單純追求「Swap 越大越穩」實際得多。

📚 參考資料


Share 哩篇文:

上一篇文
🔐 唔用 Certbot 都得:Debian 13 用 NGINX 官方 ACME 自動管 SSL
下一篇文
🌐 網絡唔通先別跑 Speedtest:用 204 URL + curl 快速定位問題