跳轉到內容

Linux Swap 虛擬內存配置完全指南 | VPS 內存優化教程

Linux Swap Virtual Memory

在便宜的雲廠商(如著名的各種“靈車”廠商)處購買的 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 腳本:

bash
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

bash
free -h

看輸出的 Swap: 這一行。如果後面顯示的都是 0B 或者 0,說明咱們現在還沒有 Swap。繼續往下走。

完整內存信息查看:

bash
# 查看詳細內存使用情況
free -h

# 示例輸出:
#               total        used        free      shared  buff/cache   available
# Mem:          985Mi       412Mi        89Mi       2.0Mi       483Mi       425Mi
# Swap:            0B          0B          0B

2. 創建一個物理文件用作 Swap

使用 fallocate 命令會在根目錄 / 下快速創建一個 2G 大小的名為 swapfile 的空白文件。

bash
fallocate -l 2G /swapfile

注:如果你需要 1GB,把 2G 改成 1G 即可。

替代方法(如果 fallocate 不可用):

bash
# 使用 dd 命令創建(較慢但兼容性更好)
dd if=/dev/zero of=/swapfile bs=1M count=2048

驗證文件創建:

bash
ls -lh /swapfile
# 應該顯示:-rw-r--r-- 1 root root 2.0G ...

3. 設置嚴格的安全權限並格式化該文件

不設置好權限,系統會報錯不讓你掛載(因為這事關係統內存的安全)。

bash
chmod 600 /swapfile
mkswap /swapfile

終端會提示類似 Setting up swapspace version 1

權限說明:

  • 600 = 僅 root 用戶可讀寫
  • 其他用戶無任何權限(安全考慮)

4. 激活當前這個 Swap 文件

bash
swapon /swapfile

此時再運行一次 free -h,你看 Swap: 這一行是不是已經顯示大概 2.0G 了?說明這部分虛擬內存拿下了!

驗證激活狀態:

bash
# 方法 1:查看 Swap 使用情況
free -h

# 方法 2:查看所有啟用的 Swap
swapon --show

# 示例輸出:
# NAME      TYPE SIZE USED PRIO
# /swapfile file   2G   0B   -2

5. 設為開機自啟(永久生效)

上面的動作只要一重啟 VPS 就會失效。接下來我們需要把它寫入系統的設備掛載表 /etc/fstab 裡,讓它下次開機時自動被掛載上。

執行這行追加命令:

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

驗證 fstab 配置:

bash
# 查看 fstab 文件末尾
tail -n 5 /etc/fstab

# 應該看到類似:
# /swapfile none swap sw 0 0

測試 fstab 配置是否正確:

bash
# 模擬重啟掛載(不會真的重啟)
mount -a

# 如果沒有報錯,說明配置正確

如何優化 Swap 的使用率 (Swappiness)?

默認情況下,一旦內存稍微吃緊,Linux 會比較積極地去使用 Swap。不過既然有物理內存,咱們肯定更喜歡優先用內存(畢竟速度快)。我們可以通過修改一個叫 swappiness 的內核參數來讓內核不到迫不得已不要去碰 Swap。

swappiness 的值從 0 到 100:

  • 值接近 0:告訴系統儘可能用物理內存,不到萬不得已別碰 Swap。
  • 值接近 100:告訴系統早點把數據往硬盤(Swap)裡丟。

對大多數服務器來說,咱們把這個值設為 10 是極其推薦的。

修改步驟:

  1. 打開系統控制配置表
    bash
    nano /etc/sysctl.conf
  2. 在該文件的在最末尾換行並添加:
    text
    vm.swappiness=10
  3. Ctrl + X,再按 Y,然後回車保存退出。
  4. 應用生效:
    bash
    sysctl -p

Swappiness 值推薦

場景推薦值說明
桌面系統60默認值,平衡性能和響應
Web 服務器10優先使用物理內存
數據庫服務器1幾乎不使用 Swap
小內存 VPS10-20防止 OOM,但儘量減少使用
大內存服務器0-10充分利用物理內存

臨時修改(重啟後失效):

bash
sysctl -w vm.swappiness=10

查看當前值:

bash
cat /proc/sys/vm/swappiness
# 或
sysctl vm.swappiness

Swap 管理進階

調整 Swap 優先級

如果有多個 Swap 文件或分區,可以設置優先級:

bash
# 查看當前優先級
swapon --show

# 停用現有 Swap
swapoff /swapfile

# 重新啟用並設置優先級(數值越大優先級越高)
swapon -p 100 /swapfile

# 永久設置(編輯 /etc/fstab)
# /swapfile none swap sw,pri=100 0 0

創建 Swap 分區(而非文件)

如果硬盤有未分配空間,可以創建專用分區:

bash
# 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):

bash
# 1. 停用當前 Swap
swapoff /swapfile

# 2. 調整文件大小
fallocate -l 4G /swapfile

# 3. 重新設置權限和格式化
chmod 600 /swapfile
mkswap /swapfile

# 4. 重新啟用
swapon /swapfile

# 5. 驗證
free -h

縮小 Swap(從 4GB 到 2GB):

bash
# 確保 Swap 使用量小於目標大小
swapoff /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

監控 Swap 使用情況

實時監控工具

1. 使用 htop

bash
# 安裝 htop
apt install htop

# 運行
htop

在界面底部可以看到 Swap 使用條。

2. 使用 vmstat

bash
# 每秒刷新一次
vmstat 1

# 關注 si/so 列(swap in/out)
# 如果持續非零,說明 Swap 使用頻繁

3. 使用 sar(系統活動報告)

bash
# 安裝 sysstat
apt install sysstat

# 查看歷史 Swap 使用
sar -W

# 實時監控
sar -W 1

設置 Swap 使用告警

創建監控腳本:

bash
#!/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:

bash
# 每 5 分鐘檢查一次
crontab -e
*/5 * * * * /usr/local/bin/check_swap.sh

常見問題排查

Q1: Swap 創建失敗,提示 "No space left on device"?

原因: 硬盤空間不足

解決方案:

bash
# 檢查磁盤空間
df -h

# 清理不必要的文件
apt clean
journalctl --vacuum-size=100M
rm -rf /tmp/*

# 或者創建更小的 Swap
fallocate -l 512M /swapfile

Q2: 系統頻繁使用 Swap,導致性能下降?

可能原因:

  1. 物理內存確實不足
  2. Swappiness 值設置過高
  3. 存在內存洩漏的程序

解決方案:

bash
# 1. 降低 swappiness
sysctl -w vm.swappiness=5

# 2. 查找佔用內存最多的進程
ps aux --sort=-%mem | head -10

# 3. 檢查是否有內存洩漏
watch -n 1 'free -h'

# 4. 考慮升級 VPS 內存

Q3: 如何完全禁用 Swap?

bash
# 1. 停用所有 Swap
swapoff -a

# 2. 從 fstab 中刪除 Swap 條目
nano /etc/fstab
# 刪除或註釋掉包含 swap 的行

# 3. 刪除 Swap 文件(可選)
rm /swapfile

# 4. 驗證
free -h
# Swap 行應全為 0

Q4: Swap 文件損壞怎麼辦?

症狀: 系統啟動時報錯,或 swapon 失敗

解決方案:

bash
# 1. 停用損壞的 Swap
swapoff /swapfile

# 2. 刪除舊文件
rm /swapfile

# 3. 重新創建
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 4. 驗證
swapon --show

Q5: SSD 硬盤使用 Swap 會縮短壽命嗎?

答案: 影響很小,可以忽略。

原因:

  • 現代 SSD 壽命很長(通常 >100TBW)
  • Swap 寫入量相對較小
  • 相比系統崩潰的風險,SSD 磨損可接受

優化建議:

  • 設置較低的 swappiness(10)
  • 使用 TRIM 定期優化 SSD
bash
# 啟用定期 TRIM
systemctl enable fstrim.timer

Swap 最佳實踐總結

推薦配置方案

512MB 內存 VPS:

bash
# 創建 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 -p

1GB 內存 VPS:

bash
# 創建 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 -p

2GB+ 內存 VPS:

bash
# 創建等於內存大小的 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

關鍵要點

  1. Swap 大小:通常為物理內存的 1-2 倍
  2. 權限設置:必須是 600(僅 root 可讀寫)
  3. 開機自啟:務必添加到 /etc/fstab
  4. Swappiness:服務器建議設為 10
  5. 定期監控:關注 Swap 使用率

從此你的小雞再也不會輕易死機崩潰了!🚀✨


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: