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 MB | 512 MB ~ 1 GB | 基本保底,避免 OOM |
| 内存 1 GB,运行 MySQL | 1 GB | MySQL 缓冲池峰值较高 |
| 内存 2 GB,纯静态 Web | 256 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 -afstab 写错会导致启动失败
编辑
/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(如需)
- 停用 Swap:
swapoff /swapfile - 删除
/etc/fstab中对应行 - 删除文件:
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,但一般不推荐。