在 512 MB 或 1 GB 的云服务器上,数据库、PHP-FPM 加上一次软件包更新,很容易在同一时间用光内存。这时内核的 OOM killer 会强制终止进程,最常被牺牲的就是 MySQL 或 MariaDB。在 Linux VPS 添加 Swap 交换空间,等于在硬盘上准备一块溢出区,短暂的内存高峰不再让服务崩溃。本文在 Debian、Ubuntu、CentOS、Rocky Linux 与 AlmaLinux 上创建 swap 文件、设置开机自动挂载并调整 swappiness,同时说明小套餐在什么情况下 swap 才真正有帮助。
步骤 1:检查目前的内存与 Swap
先确认服务器有多少 RAM 与 swap、硬盘还剩多少空间,以及内核是否已经因为内存不足而终止过进程。
free -h
swapon --show # no output = no swap yet
df -h / # make sure there is enough free disk space
# Has the kernel already killed processes for lack of memory?
journalctl -k | grep -i -E 'out of memory|killed process'
如果 swapon --show 已经列出设备或文件,也许只需要调整参数(步骤 6),不必再添加一个。
步骤 2:决定合适的 Swap 大小
在 VPS 上,swap 是安全缓冲,不能取代 RAM。常见小套餐可参考下表:
| 套餐内存 | 建议 Swap | 说明 |
|---|---|---|
| 512 MB | 1 GB | 强烈建议 |
| 1 GB | 1 GB - 2 GB | 有数据库或控制面板时建议 |
| 2 GB | 1 GB | 作为安全缓冲 |
| 4 GB 以上 | 1 GB - 2 GB 或不设 | 仅作紧急缓冲 |
swap 文件会占用服务器 SSD 空间,决定大小前请先确认步骤 1 的剩余空间。
步骤 3:用 fallocate 或 dd 创建 Swap 文件
fallocate 能瞬间预留空间;部分文件系统不支持用它创建 swap,这时改用 dd 逐块写入,虽然较慢但一定可行。文件权限必须只有 root 可读写。
# Fast method (ext4, XFS)
fallocate -l 1G /swapfile
# If fallocate fails, or swapon later reports "file has holes", use dd instead
rm -f /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
chmod 600 /swapfile
ls -lh /swapfile
swapon 可能出现“Operation not permitted”。步骤 4:格式化并启用 Swap(mkswap 与 swapon)
mkswap 写入 swap 标记,swapon 立即启用,不需要重启。
mkswap /swapfile
swapon /swapfile
swapon --show
free -h
步骤 5:写入 /etc/fstab 让 Swap 开机自动启用
没有 fstab 设置,重启后 swap 就会消失。先备份文件、加入一行,再关闭 swap 后用 swapon -a 重新启用来测试——它读取 fstab 的方式和开机流程相同。
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Test the fstab entry without rebooting
swapoff /swapfile
swapon -a
swapon --show
步骤 6:调整 VPS 的 swappiness
vm.swappiness 决定内核多积极地把内存页搬到 swap。默认值 60 是为桌面环境设计的;服务器设为 10,可让常用数据留在 RAM,只有真正吃紧时才使用 swap。调低 vfs_cache_pressure 则能让文件系统元数据缓存保留久一点。
cat /proc/sys/vm/swappiness # often 60 by default
# Apply now
sysctl vm.swappiness=10
sysctl vm.vfs_cache_pressure=50
# Keep after reboot
cat > /etc/sysctl.d/99-swap.conf <<'EOF'
vm.swappiness=10
vm.vfs_cache_pressure=50
EOF
sysctl --system
步骤 7:512 MB - 1 GB 套餐什么时候适合用 Swap
swap 适合应付短暂高峰:运行 apt upgrade 或 dnf update、编译软件、Composer 或 npm 安装、夜间备份,或数据库短时间需要更多缓冲。若工作负载长期需要比套餐更多的内存,swap 就无法解决。请检查系统是否持续在使用 swap:
# Watch the si (swap in) and so (swap out) columns for 10 seconds
vmstat 1 10
si、so 偶尔不是 0 没有关系;若长时间数值都很高,代表服务器在频繁换页,整体会变得非常慢。这时请降低内存用量(减少 PHP-FPM worker、缩小数据库缓冲),或把 VPS 升级到内存更大的套餐——JUSTG 云服务器可在客户中心的服务详情页升级套餐。
步骤 8:调整大小或移除 Swap 文件
# Resize to 2 GB or remove swap
swapoff /swapfile
rm -f /swapfile
# To remove completely, also delete the fstab line:
sed -i '\|^/swapfile |d' /etc/fstab
# To resize, repeat Step 3 and Step 4 with the new size (fstab line stays)
常见问题
Swap 会让 SSD 寿命变短吗?
swappiness 设为 10、只在高峰时使用 swap 的情况下,写入量很小。若长时间大量换页,代表需要的是更多 RAM,而不是更多 swap。
Swap 文件会比 Swap 分区慢吗?
在新版内核上差异可以忽略。swap 文件在 VPS 上更容易创建、调整与移除,因此本文采用 swap 文件。
加了 Swap,MySQL 还是被杀掉,怎么办?
请检查 journalctl -k | grep -i oom 与 free -h。若 swap 已用满,请调低 innodb_buffer_pool_size 与Web 服务器 worker 数量,或升级到内存更大的套餐。
如需协助处理服务器的 Swap 或内存问题,请至 https://www.justg.com/submitticket.php 提交工单,JUSTG 技术支持团队会协助您。