Swap(交换分区)是 Linux 在物理内存不足时使用磁盘空间充当内存的机制。搬瓦工 VPS 内存通常在 512 MB 到 2 GB 之间,运行 MySQL、Java 等内存占用较高的应用时容易触发 OOM(内存耗尽)导致进程被强制杀死。提前添加 Swap,能有效避免此类崩溃,为系统提供一层"软缓冲"。本文带你完整配置 Swapfile 并设置开机自动挂载。

本文要点

  • 判断何时需要 Swap:内存 ≤ 1 GB 或运行 MySQL/Java 时建议添加
  • fallocate + mkswap 创建 Swapfile,无需分区
  • 调整 vm.swappiness 减少不必要的换出
  • 写入 /etc/fstab 实现开机自动挂载

何时需要 Swap

不是所有 VPS 都需要 Swap,但以下情况强烈建议添加:

场景建议 Swap 大小说明
内存 ≤ 512 MB512 MB ~ 1 GB基本保底,避免 OOM
内存 1 GB,运行 MySQL1 GBMySQL 缓冲池峰值较高
内存 2 GB,纯静态 Web256 MB ~ 512 MB预防偶发峰值
内存 ≥ 4 GB,业务稳定可选或不加物理内存充足

Swap 不能替代内存

Swap 使用磁盘 I/O,速度远低于内存(约慢 10~100 倍)。它只是防止崩溃的缓冲,不能用来替代内存升级。如果服务器长期高度依赖 Swap,应考虑升级套餐。

创建 Swapfile

推荐使用文件式 Swap(Swapfile),无需修改分区表,灵活方便:

# 1. 创建一个 1GB 的 Swap 文件(根据需要调整大小)
fallocate -l 1G /swapfile

# 若 fallocate 不可用,用 dd 替代
# dd if=/dev/zero of=/swapfile bs=1M count=1024

# 2. 设置正确的权限(仅 root 可读写)
chmod 600 /swapfile

# 3. 将文件格式化为 Swap
mkswap /swapfile

# 4. 立即启用
swapon /swapfile

# 5. 验证 Swap 已启用
free -h
swapon --show

设置开机自动挂载

上述步骤重启后会失效,需将 Swap 写入 /etc/fstab

# 在 /etc/fstab 末尾追加以下行
/swapfile none swap sw 0 0

# 验证语法正确(无报错则说明 fstab 格式正常)
mount -a

fstab 写错会导致启动失败

编辑 /etc/fstab 前务必备份:cp /etc/fstab /etc/fstab.bak。写完后用 mount -a 检验格式,有报错立即回滚,避免重启后系统无法进入。

调整 Swappiness

vm.swappiness 控制内核"有多积极地"把内存页换出到 Swap,取值 0~100,默认 60。对 VPS 服务器场景,建议调低以尽量保留应用在物理内存中:

# 临时设置(重启失效)
sysctl vm.swappiness=10

# 永久生效:在 /etc/sysctl.conf 追加
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p
swappiness 值行为推荐场景
0几乎不换出(内存耗尽才用)内存充足、追求极致性能
10低换出率(推荐服务器)VPS 服务器通用
60系统默认,主动换出桌面系统
100积极换出,尽量释放物理内存嵌入式/特殊场景

删除 Swap(如需)

  1. 停用 Swap:swapoff /swapfile
  2. 删除 /etc/fstab 中对应行
  3. 删除文件:rm /swapfile

验证 Swap 效果

添加 Swap 后,可用 free -h 查看 Swap 一行,正常会显示已配置的大小。运行一段时间后用 vmstat -s | grep swap 查看实际换出量,如果 Swap 使用量持续增长,说明内存确实存在压力。

小结

  • 内存 ≤ 1 GB 或运行 MySQL/Java 时建议添加 Swap
  • Swapfile 方式无需分区,fallocate + mkswap + swapon 三步搞定
  • 写入 /etc/fstab 才能开机自动挂载
  • vm.swappiness=10 适合服务器,减少不必要换出
  • Swap 是缓冲而非内存替代,业务长期依赖应升级套餐

常见问题

Swap 放在 SSD 上会损伤磁盘吗?

现代 SSD 写入寿命较长,适量 Swap 写入不会造成明显损耗。搬瓦工 KVM 套餐使用 SSD,正常业务的 Swap 读写量远低于损伤阈值,无需担心。

已经有 OOM 报错,添加 Swap 能解决吗?

能缓解偶发 OOM,但如果是长期内存不足,需从根本上优化应用内存用量或升级套餐。可先用 htop 找出最占内存的进程再做针对性调整。

swappiness 设为 0 是否完全不用 Swap?

不是。swappiness=0 意味着内核在内存极度紧张时才换出,并非禁用 Swap。完全禁用需要 swapoff -a,但一般不推荐。