如何在 Linux VPS 内存不足时设置交换空间

小型 VPS 实例最常见的问题之一是内存意外耗尽——尤其是当 MySQL、Nginx 和 PHP-FPM 同时运行时。结果是:OOM Killer(内存不足终止器)会悄无声息地终止进程,导致网站在没有明显原因的情况下下线。

交换空间(Swap Space)是 Linux 将 SSD 的一部分用作溢出 RAM 的机制。当物理内存耗尽时,不常用的数据会被转移到交换空间,使系统继续运行而不崩溃。本指南将带您完成在 Ubuntu 上的完整设置流程。

前提条件:Ubuntu 20.04 / 22.04 / 24.04 VPS,具有 root 或 sudo 访问权限,至少有 1–2 GB 的可用磁盘空间。

交换空间 vs. 内存 — 有什么区别?

RAM 是 CPU 直接读取的高速易失性内存。交换空间是存储设备上的空间,当 RAM 满载时用作溢出内存。关键区别在于速度——SSD 上的交换空间比 RAM 慢约 10 到 100 倍,但远比进程被突然终止要好。

交换空间无法从根本上解决长期内存不足的问题,但它在流量峰值或资源密集型任务期间提供了安全缓冲。

注意:部分 VPS 提供商会限制在共享存储上创建交换文件。请事先向您的提供商确认。AsiaGB VPS 所有套餐均支持创建交换空间。

推荐的交换空间大小

物理内存推荐交换空间典型用途
512 MB – 1 GB2 GB小型网站 + PHP 应用
2 GB2–4 GBWordPress + MySQL
4 GB2–4 GBNode.js / Python 应用
8 GB+2 GB(可选)几乎不需要交换空间

避免创建过大的交换空间。SSD 的写入寿命有限,频繁的交换会加速磁盘磨损。

第一步 — 检查现有交换空间

在创建交换空间之前,先确认是否已存在:

sudo swapon --show

没有输出表示当前没有激活的交换空间。同时检查可用内存和磁盘空间:

free -h
df -h

第二步 — 创建交换文件

创建一个 2 GB 的交换文件(根据需要调整大小):

# Create a 2 GB file (change 2G to 4G for more)
sudo fallocate -l 2G /swapfile

如果您的文件系统不支持 fallocate,请改用 dd:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

第三步 — 设置权限并激活

所有用户均可读取的交换文件存在安全风险,请先锁定权限:

# Only root can read/write
sudo chmod 600 /swapfile

# Create the swap signature
sudo mkswap /swapfile

# Enable swap immediately
sudo swapon /swapfile

确认交换空间已激活:

sudo swapon --show
free -h

您应该在 free -h 的输出中看到一行 Swap,显示您创建的大小。

第四步 — 使交换空间在重启后持久化

通过 swapon 启用的交换空间在重启后会消失。将条目添加到 /etc/fstab 以自动挂载:

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

验证条目已添加:

cat /etc/fstab | grep swap

预期输出:/swapfile none swap sw 0 0

第五步 — 调整 Swappiness 值

Swappiness 控制 Linux 在内存仍有空余时将数据移入交换空间的积极程度(0–100 范围):

对于 Web 服务器,将其设置为 10 以尽可能长时间地将进程保留在内存中:

# Check current value
cat /proc/sys/vm/swappiness

# Change temporarily (resets on reboot)
sudo sysctl vm.swappiness=10

# Make permanent
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

第六步 — 调整缓存压力(可选)

vfs_cache_pressure 决定 Linux 回收目录/inode 缓存内存的速度。默认值为 100;将其设置为 50 可帮助服务器更长时间地缓存文件系统元数据:

echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

监控交换空间使用情况

实时监控交换空间的使用情况:

# Quick overview
free -h

# Find which processes use the most swap
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3 "\n"}' $file
done 2>/dev/null | sort -k2 -n -r | head -10

# Check swap statistics
vmstat -s | grep -i swap

在 Linux VPS 内存不足时设置交换空间 — 完整流程

如果您希望将整个过程集中在一处——从检查现有交换空间到永久启用——以下流程是适用于 Ubuntu 20.04 至 24.04 的标准步骤序列。它对于当 WordPress、MySQL 和 Node.js 同时运行时内存耗尽的小型 VPS 实例特别有用。这些步骤无需重启,可以安全地在运行中的服务器上执行:

# 1) Inspect current swap and RAM
sudo swapon --show
free -h
df -h

# 2) Create a 2 GB swap file (allocates space immediately)
sudo fallocate -l 2G /swapfile

# 3) Lock permissions so only root can read/write (avoids a security risk)
sudo chmod 600 /swapfile

# 4) Create the swap signature and enable it now
sudo mkswap /swapfile
sudo swapon /swapfile

# 5) Make it persist across reboots
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 6) Confirm — you should see a Swap line in free -h
free -h

如果您的文件系统不支持 fallocate(例如 ZFS 或某些容器环境),请改用 dd 逐块构建文件,然后从第三步继续。速度稍慢,但适用于所有文件系统:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

提示:如果您的 VPS 因持续内存不足而频繁依赖交换空间,这说明您应该升级套餐。交换空间能吸收临时峰值,但不会让机器更快。AsiaGB VPS 最低每月 500 泰铢,提供 SSD 存储,可按实际需求扩展内存和 CPU。

根据内存应设置多少交换空间?

常见问题是"交换空间应该多大?"答案取决于您的物理内存和工作负载类型。经验法则:内存较少的 VPS 应设置相对较多的交换空间(以避免 OOM Killer),而内存充裕的 VPS 几乎不需要大型交换空间。下表是运行网站和数据库的 VPS 实例的实用参考:

物理内存推荐交换空间Swappiness典型工作负载
512 MB1–2 GB(内存的 2–4 倍)10低流量站点 + 小型 PHP
1 GB2 GB(内存的 2 倍)10单个 WordPress 站点
2 GB2–4 GB(内存的 1–2 倍)10WordPress + MySQL,多站点
4 GB2–4 GB(内存的 0.5–1 倍)10Node.js / Python / 电商
8 GB2 GB(缓冲)10较重应用 / 容器
16 GB+0–2 GB(几乎不需要)1–10数据库服务器 / 内存密集型工作

这些数字并非严格规则——请根据实际工作负载进行调整。例如,如果您运行的 MySQL 配置了较大的 innodb_buffer_pool_size,请保留足够的空闲内存并避免频繁交换。反之,一台运行 WordPress、PHP-FPM 和 MySQL 的 512 MB VPS 通常需要至少 2 GB 交换空间,以防多个访客同时访问时进程被终止。

避免过大的交换空间:在 1 GB 内存的 VPS 上设置 8 GB 交换空间并不会带来任何改善——这会让系统"看似正常运行",实际上却极度缓慢,因为大部分数据存储在 SSD 而非内存中。响应时间会不断下降,直到用户认为网站已冻结。

为服务器调整 Swappiness 和 vfs_cache_pressure

交换空间创建完成后,有两个值值得调整,以使您的 VPS 智能地使用交换空间:vm.swappiness 和 vm.vfs_cache_pressure。两者均通过 sysctl 设置,并在 /etc/sysctl.conf 中永久生效。

vm.swappiness — Linux 使用交换空间的积极程度

此值范围为 0 到 100;值越高,Linux 越早将页面移入交换空间,即使内存仍有空余。对于提供 Web 服务的 VPS,将其设置为 10,以尽可能长时间地将进程保留在内存中,仅在内存真正接近耗尽时才使用交换空间:

# Check current value (Ubuntu default = 60)
cat /proc/sys/vm/swappiness

# Make it 10 permanently
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

vm.vfs_cache_pressure — 延长元数据缓存保留时间

默认值为 100。将其降低至 50 可让 Linux 更长时间地保留目录/inode 缓存(dentry 和 inode 缓存),减少重复磁盘读取,从而间接降低交换频率。对于文件众多的 VPS 实例(如安装了大量插件的 WordPress 站点)尤为理想:

echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

验证两个值均已生效:

sysctl vm.swappiness vm.vfs_cache_pressure

您应该看到 vm.swappiness = 10 和 vm.vfs_cache_pressure = 50。如果数值仍为默认值,请检查 /etc/sysctl.conf 中是否有重复行,并确保 /etc/sysctl.d/ 下没有文件覆盖这些设置。

在 VPS 上使用交换空间的重要注意事项

交换空间有用,但并非万能。在将其作为主要解决方案依赖之前,请了解以下限制:

安全禁用交换空间(临时或永久):临时禁用使用 sudo swapoff /swapfile(使用 sudo swapon /swapfile 重新启用)。永久禁用还需从 /etc/fstab 中删除对应行;否则下次重启后交换空间会自动挂载。

删除交换空间(如有需要)

如需调整大小或完全删除交换空间:

# Turn off swap first
sudo swapoff /swapfile

# Remove from fstab
sudo sed -i '/swapfile/d' /etc/fstab

# Delete the file
sudo rm /swapfile

警告:如果交换文件大量使用,swapoff 可能需要很长时间或卡住,因为内核需要先将所有数据移回内存。只有在内存有足够空闲空间容纳已交换数据时才删除交换空间。

完整快速设置脚本

一次性配置 2 GB 交换空间,运行以下脚本:

#!/bin/bash
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
echo "✅ 2G swap created successfully"
free -h

常见问题解答(FAQ)

交换空间能让 VPS 更快吗?

不能。交换空间不会让机器更快,因为它位于 SSD 上,比内存慢 10 到 100 倍。交换空间的作用是在内存满载时"防止崩溃",通过临时存储不常用的数据,使进程不被 OOM Killer 终止。如果需要真正的速度提升,应增加内存而非增加交换空间。

1 GB 内存的 VPS 需要多少交换空间?

大约 2 GB(约为内存的 2 倍),配合 vm.swappiness=10 使用。这个大小足以在中等流量站点上运行 WordPress + MySQL + PHP-FPM,并在多个访客同时到达时吸收流量峰值,而不会让进程被终止。

交换空间真的会快速磨损 SSD 吗?

在 swappiness 较低(10)且机器不会一直大量交换的情况下,磨损很小,几乎不需要担心。但如果机器全天频繁进行交换,会比正常情况更快消耗 SSD 的写入寿命——这是内存不足的信号,应升级内存,而不是交换空间本身的问题。

在 VPS 上设置交换空间后需要重启吗?

不需要。使用 swapon 可立即启用交换空间而无需重启,而将条目添加到 /etc/fstab 只是让交换空间在下次重启后自动挂载。设置过程中不会有任何停机时间。

在 AsiaGB VPS 上自信运行任何工作负载

AsiaGB VPS 最低每月 500 泰铢,提供 SSD 存储,支持 Ubuntu 20.04–24.04,提供完整的 root 访问权限。立即添加交换空间并优化您的服务器。

立即获取 VPS

查看泰国VPS主机全部套餐 →