小型 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 GB | 2 GB | 小型网站 + PHP 应用 |
| 2 GB | 2–4 GB | WordPress + MySQL |
| 4 GB | 2–4 GB | Node.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 范围):
0— 仅在绝对必要时使用交换空间10— 推荐用于服务器和 VPS60— Ubuntu 默认值(为桌面系统优化)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 MB | 1–2 GB(内存的 2–4 倍) | 10 | 低流量站点 + 小型 PHP |
| 1 GB | 2 GB(内存的 2 倍) | 10 | 单个 WordPress 站点 |
| 2 GB | 2–4 GB(内存的 1–2 倍) | 10 | WordPress + MySQL,多站点 |
| 4 GB | 2–4 GB(内存的 0.5–1 倍) | 10 | Node.js / Python / 电商 |
| 8 GB | 2 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 上使用交换空间的重要注意事项
交换空间有用,但并非万能。在将其作为主要解决方案依赖之前,请了解以下限制:
- SSD 磨损:交换空间意味着反复写入 SSD,消耗其有限的写入寿命。持续频繁的交换会加速 SSD 磨损。将 swappiness 保持较低(10)可减少写入频率。
- 交换空间无法替代内存:交换空间比内存慢 10 到 100 倍。如果机器一直在使用交换,说明内存确实不足——正确的解决方法是升级内存,而不是不断扩大交换空间。
- 警惕交换颠簸:如果系统频繁进行交换(颠簸),CPU 将把时间花在移动数据上而非实际工作,网站会明显变慢。使用
vmstat 1监控si/so列——持续偏高是危险信号。 - 禁用交换需谨慎:如果交换空间大量使用,运行
swapoff可能很慢或卡住,因为内核必须先将所有数据移回内存。只有在内存有足够空闲空间时才禁用交换。 - 部分提供商有限制:某些 OpenVZ/LXC VPS 提供商不允许创建交换文件或在宿主机层面限制交换空间。请事先与您的提供商确认——AsiaGB VPS 基于 KVM,所有套餐均支持创建交换空间。
安全禁用交换空间(临时或永久):临时禁用使用 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