Linux Swap 虛擬內存配置完全指南 | VPS 內存優化教程
在便宜的雲廠商(如著名的各種“靈車”廠商)處購買的 VPS,內存經常只有 512MB 甚至更小。當咱們運行一點稍微複雜的應用環境(如安裝了 Docker、1Panel 或是跑個稍微耗點資源的後端服務)時,經常會遇到整個系統突然死掉、或者程序莫名其妙被系統強制殺死 (OOM-Kill) 的情況。
為了解決這個問題,添加並開啟 Swap 是一項必備技能操作。
什麼是 Swap?有什麼用?
Swap(交換空間) 其實就相當於 Windows 系統裡的“虛擬內存”。 當你的物理內存(RAM)即將被耗盡不夠用時,Linux 內核就會借用硬盤上的部分空間當作內存來湊合用,把那些很久沒被訪問的內存數據暫且移動到硬盤裡,以此騰出真實的物理內存來運行眼前的急需任務。
雖然硬盤的速度遠不如內存快,但這好歹“不至於讓程序直接崩潰退出”。
Swap vs 物理內存對比
| 特性 | 物理內存 (RAM) | Swap(虛擬內存) |
|---|---|---|
| 速度 | 極快(納秒級) | 較慢(毫秒級) |
| 容量 | 有限(取決於硬件) | 幾乎無限(取決於硬盤) |
| 成本 | 昂貴 | 便宜 |
| 用途 | 活躍數據處理 | 不常用數據暫存 |
| 斷電後 | 數據丟失 | 數據保留 |
什麼時候需要 Swap?
✅ 推薦場景:
- VPS 內存 ≤ 1GB
- 運行 Docker 容器
- 部署數據庫(MySQL/PostgreSQL)
- 編譯大型項目
- 運行 Java 應用
❌ 不需要場景:
- 內存 ≥ 8GB 且負載低
- 使用 SSD 硬盤且 IO 敏感
- 實時性要求極高的應用
一鍵腳本(懶人最愛)
如果你不想敲過多代碼,著名的開源腳本其實能完美處理。這裡提供甬哥的一鍵添加/刪除 Swap 腳本:
wget -O swap.sh https://raw.githubusercontent.com/yqs12/swap/main/swap.sh && bash swap.sh運行後會根據菜單提示,輸入你想添加的大小數字(比如添加 1024 代表添加 1GB 或者添加 2048 代表 2GB)即可。
如果你有安全潔癖喜歡純手動掌控的過程,請往下看咱們極簡的手動教程。
純手工添加 Swap 文件教程(5個步驟)
下面以添加一個大小為 2GB 的 Swap 交換文件為例。全過程需要 root 權限去執行。
1. 檢查當前是否已有 Swap
free -h看輸出的 Swap: 這一行。如果後面顯示的都是 0B 或者 0,說明咱們現在還沒有 Swap。繼續往下走。
完整內存信息查看:
# 查看詳細內存使用情況
free -h
# 示例輸出:
# total used free shared buff/cache available
# Mem: 985Mi 412Mi 89Mi 2.0Mi 483Mi 425Mi
# Swap: 0B 0B 0B2. 創建一個物理文件用作 Swap
使用 fallocate 命令會在根目錄 / 下快速創建一個 2G 大小的名為 swapfile 的空白文件。
fallocate -l 2G /swapfile注:如果你需要 1GB,把 2G 改成 1G 即可。
替代方法(如果 fallocate 不可用):
# 使用 dd 命令創建(較慢但兼容性更好)
dd if=/dev/zero of=/swapfile bs=1M count=2048驗證文件創建:
ls -lh /swapfile
# 應該顯示:-rw-r--r-- 1 root root 2.0G ...3. 設置嚴格的安全權限並格式化該文件
不設置好權限,系統會報錯不讓你掛載(因為這事關係統內存的安全)。
chmod 600 /swapfile
mkswap /swapfile終端會提示類似 Setting up swapspace version 1。
權限說明:
600= 僅 root 用戶可讀寫- 其他用戶無任何權限(安全考慮)
4. 激活當前這個 Swap 文件
swapon /swapfile此時再運行一次 free -h,你看 Swap: 這一行是不是已經顯示大概 2.0G 了?說明這部分虛擬內存拿下了!
驗證激活狀態:
# 方法 1:查看 Swap 使用情況
free -h
# 方法 2:查看所有啟用的 Swap
swapon --show
# 示例輸出:
# NAME TYPE SIZE USED PRIO
# /swapfile file 2G 0B -25. 設為開機自啟(永久生效)
上面的動作只要一重啟 VPS 就會失效。接下來我們需要把它寫入系統的設備掛載表 /etc/fstab 裡,讓它下次開機時自動被掛載上。
執行這行追加命令:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab驗證 fstab 配置:
# 查看 fstab 文件末尾
tail -n 5 /etc/fstab
# 應該看到類似:
# /swapfile none swap sw 0 0測試 fstab 配置是否正確:
# 模擬重啟掛載(不會真的重啟)
mount -a
# 如果沒有報錯,說明配置正確如何優化 Swap 的使用率 (Swappiness)?
默認情況下,一旦內存稍微吃緊,Linux 會比較積極地去使用 Swap。不過既然有物理內存,咱們肯定更喜歡優先用內存(畢竟速度快)。我們可以通過修改一個叫 swappiness 的內核參數來讓內核不到迫不得已不要去碰 Swap。
swappiness 的值從 0 到 100:
- 值接近 0:告訴系統儘可能用物理內存,不到萬不得已別碰 Swap。
- 值接近 100:告訴系統早點把數據往硬盤(Swap)裡丟。
對大多數服務器來說,咱們把這個值設為 10 是極其推薦的。
修改步驟:
- 打開系統控制配置表bash
nano /etc/sysctl.conf - 在該文件的在最末尾換行並添加:text
vm.swappiness=10 Ctrl + X,再按Y,然後回車保存退出。- 應用生效:bash
sysctl -p
Swappiness 值推薦
| 場景 | 推薦值 | 說明 |
|---|---|---|
| 桌面系統 | 60 | 默認值,平衡性能和響應 |
| Web 服務器 | 10 | 優先使用物理內存 |
| 數據庫服務器 | 1 | 幾乎不使用 Swap |
| 小內存 VPS | 10-20 | 防止 OOM,但儘量減少使用 |
| 大內存服務器 | 0-10 | 充分利用物理內存 |
臨時修改(重啟後失效):
sysctl -w vm.swappiness=10查看當前值:
cat /proc/sys/vm/swappiness
# 或
sysctl vm.swappinessSwap 管理進階
調整 Swap 優先級
如果有多個 Swap 文件或分區,可以設置優先級:
# 查看當前優先級
swapon --show
# 停用現有 Swap
swapoff /swapfile
# 重新啟用並設置優先級(數值越大優先級越高)
swapon -p 100 /swapfile
# 永久設置(編輯 /etc/fstab)
# /swapfile none swap sw,pri=100 0 0創建 Swap 分區(而非文件)
如果硬盤有未分配空間,可以創建專用分區:
# 1. 使用 fdisk 創建分區
fdisk /dev/sda
# 按 n 創建新分區,類型設為 82 (Linux swap)
# 2. 格式化為 Swap
mkswap /dev/sda2
# 3. 啟用
swapon /dev/sda2
# 4. 添加到 fstab
echo '/dev/sda2 none swap sw 0 0' >> /etc/fstab動態調整 Swap 大小
擴展 Swap(從 2GB 到 4GB):
# 1. 停用當前 Swap
swapoff /swapfile
# 2. 調整文件大小
fallocate -l 4G /swapfile
# 3. 重新設置權限和格式化
chmod 600 /swapfile
mkswap /swapfile
# 4. 重新啟用
swapon /swapfile
# 5. 驗證
free -h縮小 Swap(從 4GB 到 2GB):
# 確保 Swap 使用量小於目標大小
swapoff /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile監控 Swap 使用情況
實時監控工具
1. 使用 htop
# 安裝 htop
apt install htop
# 運行
htop在界面底部可以看到 Swap 使用條。
2. 使用 vmstat
# 每秒刷新一次
vmstat 1
# 關注 si/so 列(swap in/out)
# 如果持續非零,說明 Swap 使用頻繁3. 使用 sar(系統活動報告)
# 安裝 sysstat
apt install sysstat
# 查看歷史 Swap 使用
sar -W
# 實時監控
sar -W 1設置 Swap 使用告警
創建監控腳本:
#!/bin/bash
# /usr/local/bin/check_swap.sh
SWAP_THRESHOLD=80 # 告警閾值(百分比)
# 獲取 Swap 使用百分比
SWAP_USAGE=$(free | grep Swap | awk '{if($2>0) print int($3/$2*100); else print 0}')
if [ $SWAP_USAGE -gt $SWAP_THRESHOLD ]; then
echo "警告:Swap 使用率已達 ${SWAP_USAGE}%" | mail -s "Swap 告警" admin@example.com
fi添加到 crontab:
# 每 5 分鐘檢查一次
crontab -e
*/5 * * * * /usr/local/bin/check_swap.sh常見問題排查
Q1: Swap 創建失敗,提示 "No space left on device"?
原因: 硬盤空間不足
解決方案:
# 檢查磁盤空間
df -h
# 清理不必要的文件
apt clean
journalctl --vacuum-size=100M
rm -rf /tmp/*
# 或者創建更小的 Swap
fallocate -l 512M /swapfileQ2: 系統頻繁使用 Swap,導致性能下降?
可能原因:
- 物理內存確實不足
- Swappiness 值設置過高
- 存在內存洩漏的程序
解決方案:
# 1. 降低 swappiness
sysctl -w vm.swappiness=5
# 2. 查找佔用內存最多的進程
ps aux --sort=-%mem | head -10
# 3. 檢查是否有內存洩漏
watch -n 1 'free -h'
# 4. 考慮升級 VPS 內存Q3: 如何完全禁用 Swap?
# 1. 停用所有 Swap
swapoff -a
# 2. 從 fstab 中刪除 Swap 條目
nano /etc/fstab
# 刪除或註釋掉包含 swap 的行
# 3. 刪除 Swap 文件(可選)
rm /swapfile
# 4. 驗證
free -h
# Swap 行應全為 0Q4: Swap 文件損壞怎麼辦?
症狀: 系統啟動時報錯,或 swapon 失敗
解決方案:
# 1. 停用損壞的 Swap
swapoff /swapfile
# 2. 刪除舊文件
rm /swapfile
# 3. 重新創建
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 4. 驗證
swapon --showQ5: SSD 硬盤使用 Swap 會縮短壽命嗎?
答案: 影響很小,可以忽略。
原因:
- 現代 SSD 壽命很長(通常 >100TBW)
- Swap 寫入量相對較小
- 相比系統崩潰的風險,SSD 磨損可接受
優化建議:
- 設置較低的 swappiness(10)
- 使用 TRIM 定期優化 SSD
# 啟用定期 TRIM
systemctl enable fstrim.timerSwap 最佳實踐總結
推薦配置方案
512MB 內存 VPS:
# 創建 1GB Swap(2倍內存)
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 設置 swappiness
echo 'vm.swappiness=20' >> /etc/sysctl.conf
sysctl -p1GB 內存 VPS:
# 創建 2GB Swap(2倍內存)
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 設置 swappiness
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p2GB+ 內存 VPS:
# 創建等於內存大小的 Swap
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 設置 swappiness
echo 'vm.swappiness=5' >> /etc/sysctl.conf
sysctl -p關鍵要點
- ✅ Swap 大小:通常為物理內存的 1-2 倍
- ✅ 權限設置:必須是 600(僅 root 可讀寫)
- ✅ 開機自啟:務必添加到
/etc/fstab - ✅ Swappiness:服務器建議設為 10
- ✅ 定期監控:關注 Swap 使用率
從此你的小雞再也不會輕易死機崩潰了!🚀✨
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。