512MB、1GB内存的VPS,在安装依赖、编译程序或同时运行多个服务时,可能遇到内存不足、程序退出等问题。给主机添加适量Swap,可以为短时内存压力提供缓冲。
Swap是系统用于交换内存页面的空间。使用磁盘文件作为Swap,会占用硬盘容量,也会带来磁盘读写开销。它不能替代物理内存,业务长期内存不足时,仍需要调整程序配置或升级主机。
本文以新增 1GiB Swap文件为例,适用于使用systemd、根文件系统为 ext4或XFS 的常规Debian、Ubuntu VPS。命令在VPS系统中执行,使用root权限。

一、先检查内存、磁盘和已有Swap
执行:
free -h
swapon --show
df -h /
findmnt -n -o FSTYPE -T /
四条命令分别查看内存、已启用的Swap、根分区剩余空间和文件系统类型。
| 检查项目 | 重点看什么 |
|---|---|
free -h | Mem行的available,以及Swap行的总量 |
swapon --show | 是否已经存在Swap文件、交换分区或zram |
df -h / | Avail列是否有足够空间 |
findmnt | 文件系统是否为ext4或XFS |
判断内存是否紧张,不能只看free列。Linux会使用内存缓存文件,available对“不发生交换时还能供新程序使用多少内存”的估算更有参考价值。
如果已经配置了Swap,应先确认容量是否不足。新增1GiB文件需要占用相应磁盘空间,同时还应为日志、数据库和系统更新保留余量。
如果输出是Btrfs、overlay或其他类型,先不要执行本文的创建命令。Btrfs支持Swap文件,但有专门的配置要求;Docker等容器环境也不能直接套用普通VPS的操作方式。
二、创建并启用1GiB Swap文件
下面使用独立路径/swapfile-vps。请以root身份整段执行:
(
set -e
case "$(findmnt -n -o FSTYPE -T /)" in
ext4|xfs) ;;
*)
echo "当前文件系统不在本教程适用范围内,停止操作。"
exit 1
;;
esac
if [ -e /swapfile-vps ] || [ -L /swapfile-vps ]; then
echo "/swapfile-vps 已存在,请先检查,不会覆盖。"
exit 1
fi
umask 077
dd if=/dev/zero of=/swapfile-vps \
bs=1M count=1024 conv=excl status=progress
chmod 600 /swapfile-vps
mkswap /swapfile-vps
swapon /swapfile-vps
)
这段命令会依次创建文件、限制访问权限、写入Swap格式并启用。任一步骤报错,后续步骤会停止。
其中:
bs=1M count=1024创建1GiB文件。conv=excl在目标文件已存在时拒绝写入。chmod 600只允许文件所有者读写。mkswap初始化交换空间。swapon立即启用该文件。
这里使用dd实际写入文件,避免稀疏文件中的“空洞”导致Swap启用失败。不要用truncate直接替换这一步。
如果计划创建2GiB,应在首次执行前将count=1024改为count=2048,并先确认磁盘余量。已经启用的Swap文件不能直接覆盖重建。
三、确认Swap已经生效
执行:
swapon --show
free -h
检查swapon --show中是否出现/swapfile-vps,容量应接近1GiB。如果此前没有其他Swap,free -h的Swap总量也应接近1GiB。
刚启用时使用量为0是正常的,系统会根据实际内存压力决定是否使用。物理内存所在的Mem总量不会因此增加。
四、配置开机自动启用
先备份现有配置:
cp -a /etc/fstab "/etc/fstab.bak-swap-$(date +%Y%m%d-%H%M%S)"
用编辑器打开/etc/fstab,保留原有内容,在末尾添加下面这一行。已有相同路径时,不要重复添加:
/swapfile-vps none swap defaults,nofail 0 0
然后检查配置:
findmnt --verify --verbose
处理检查发现的错误,再重新加载systemd配置:
systemctl daemon-reload
systemd会根据/etc/fstab生成相应的Swap单元。这里的nofail表示,即使这项Swap未能成功启用,系统也会继续启动;它并不代表可以忽略配置错误。
当前Swap已经生效,无需为了添加Swap立即重启。下一次正常维护重启后,再执行swapon --show,确认自动启用成功。
五、观察是否出现频繁换页
添加Swap后,需要结合业务表现观察,而不是只看“还有多少交换空间”。
执行:
vmstat 1 6
这会输出6次报告。第一份报告中的速率统计主要反映开机以来的平均情况,观察当前负载时,重点看后续每秒采样。
| 字段 | 含义 |
|---|---|
si | 每秒从Swap换入内存的数据量 |
so | 每秒从内存换出到Swap的数据量 |
wa | CPU统计中的I/O等待时间占比 |
si、so偶尔变化,不足以说明主机存在性能问题。如果持续大量换入换出,同时网站变慢、磁盘繁忙,就需要进一步排查内存压力与存储性能。
可以查看内存占用较高的进程:
ps aux --sort=-%mem | head -n 15
根据实际业务检查PHP-FPM进程数量、数据库缓存、应用并发和后台任务。长期依赖大量Swap运行的业务,应优先降低工作集或增加物理内存。
六、常见问题处理
1.出现“File exists”怎么办?
说明指定路径已经存在。先用swapon --show确认它是否正在使用,再检查文件来源。不要为了重新运行教程直接删除文件。
2.出现“Operation not permitted”怎么办?
确认正在以root身份操作,并检查是否处于受限制的容器环境。Swap操作需要相应系统权限,仅在容器内获得root身份,并不意味着拥有宿主机的Swap管理权限。
3.是否需要把swappiness改成10?
没有适用于所有主机的固定最佳值。可以先查看当前设置:
sysctl vm.swappiness
swappiness用于影响交换I/O与文件页面回收之间的相对取舍,不是“内存剩余百分之几时开始使用Swap”。设置为0也不等于完全禁用Swap。首次添加时可以先保留当前值,再根据业务表现评估。
4.主机已有Swap,Docker容器为什么仍然OOM?
容器可能设置了单独的内存和交换空间限制。比如Docker的--memory-swap与--memory设置相同,意味着该容器不能使用Swap。增加主机Swap不会自动解除容器限制,需要同时核对容器配置。
5.Swap有占用,要不要定期清空?
不应仅因为Swap使用量不为0,就执行swapoff -a。关闭交换空间需要迁移其中的页面,内存不足时可能失败并加重压力。应优先结合available、换页速率和应用响应判断是否需要处理。






