Linux Swap 虚拟内存配置完全指南 | VPS 内存优化教程
在便宜的云厂商(如著名的各种“灵车”厂商)处购买的 VPS,内存经常只有 512MB 甚至更小。当咱们运行一点稍微复杂的应用环境(如安装了 Docker、1Panel 或是跑个稍微耗点资源的后端服务)时,经常会遇到整个系统突然死掉、或者程序莫名其妙被系统强制杀死 (OOM-Kill) 的情况。
为了解决这个问题,添加并开启 Swap 是一项必备技能操作。
什么是 Swap?有什么用?
Swap(交换空间) 其实就相当于 Windows 系统里的“虚拟内存”。 当你的物理内存(RAM)即将被耗尽不够用时,Linux 内核就会借用硬盘上的部分空间当作内存来凑合用,把那些很久没被访问的内存数据暂且移动到硬盘里,以此腾出真实的物理内存来运行眼前的急需任务。
虽然硬盘的速度远不如内存快,但这好歹“不至于让程序直接崩溃退出”。
Swap vs 物理内存对比
| 特性 | 物理内存 (RAM) | Swap(虚拟内存) |
|---|---|---|
| 速度 | 极快(纳秒级) | 较慢(毫秒级) |
| 容量 | 有限(取决于硬件) | 几乎无限(取决于硬盘) |
| 成本 | 昂贵 | 便宜 |
| 用途 | 活跃数据处理 | 不常用数据暂存 |
| 断电后 | 数据丢失 | 数据保留 |
什么时候需要 Swap?
✅ 推荐场景:
- VPS 内存 ≤ 1GB
- 运行 Docker 容器
- 部署数据库(MySQL/PostgreSQL)
- 编译大型项目
- 运行 Java 应用
❌ 不需要场景:
- 内存 ≥ 8GB 且负载低
- 使用 SSD 硬盘且 IO 敏感
- 实时性要求极高的应用
一键脚本(懒人最爱)
如果你不想敲过多代码,著名的开源脚本其实能完美处理。这里提供甬哥的一键添加/删除 Swap 脚本:
wget -O swap.sh https://raw.githubusercontent.com/yqs12/swap/main/swap.sh && bash swap.sh运行后会根据菜单提示,输入你想添加的大小数字(比如添加 1024 代表添加 1GB 或者添加 2048 代表 2GB)即可。
如果你有安全洁癖喜欢纯手动掌控的过程,请往下看咱们极简的手动教程。
纯手工添加 Swap 文件教程(5个步骤)
下面以添加一个大小为 2GB 的 Swap 交换文件为例。全过程需要 root 权限去执行。
1. 检查当前是否已有 Swap
free -h看输出的 Swap: 这一行。如果后面显示的都是 0B 或者 0,说明咱们现在还没有 Swap。继续往下走。
完整内存信息查看:
# 查看详细内存使用情况
free -h
# 示例输出:
# total used free shared buff/cache available
# Mem: 985Mi 412Mi 89Mi 2.0Mi 483Mi 425Mi
# Swap: 0B 0B 0B2. 创建一个物理文件用作 Swap
使用 fallocate 命令会在根目录 / 下快速创建一个 2G 大小的名为 swapfile 的空白文件。
fallocate -l 2G /swapfile注:如果你需要 1GB,把 2G 改成 1G 即可。
替代方法(如果 fallocate 不可用):
# 使用 dd 命令创建(较慢但兼容性更好)
dd if=/dev/zero of=/swapfile bs=1M count=2048验证文件创建:
ls -lh /swapfile
# 应该显示:-rw-r--r-- 1 root root 2.0G ...3. 设置严格的安全权限并格式化该文件
不设置好权限,系统会报错不让你挂载(因为这事关系统内存的安全)。
chmod 600 /swapfile
mkswap /swapfile终端会提示类似 Setting up swapspace version 1。
权限说明:
600= 仅 root 用户可读写- 其他用户无任何权限(安全考虑)
4. 激活当前这个 Swap 文件
swapon /swapfile此时再运行一次 free -h,你看 Swap: 这一行是不是已经显示大概 2.0G 了?说明这部分虚拟内存拿下了!
验证激活状态:
# 方法 1:查看 Swap 使用情况
free -h
# 方法 2:查看所有启用的 Swap
swapon --show
# 示例输出:
# NAME TYPE SIZE USED PRIO
# /swapfile file 2G 0B -25. 设为开机自启(永久生效)
上面的动作只要一重启 VPS 就会失效。接下来我们需要把它写入系统的设备挂载表 /etc/fstab 里,让它下次开机时自动被挂载上。
执行这行追加命令:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab验证 fstab 配置:
# 查看 fstab 文件末尾
tail -n 5 /etc/fstab
# 应该看到类似:
# /swapfile none swap sw 0 0测试 fstab 配置是否正确:
# 模拟重启挂载(不会真的重启)
mount -a
# 如果没有报错,说明配置正确如何优化 Swap 的使用率 (Swappiness)?
默认情况下,一旦内存稍微吃紧,Linux 会比较积极地去使用 Swap。不过既然有物理内存,咱们肯定更喜欢优先用内存(毕竟速度快)。我们可以通过修改一个叫 swappiness 的内核参数来让内核不到迫不得已不要去碰 Swap。
swappiness 的值从 0 到 100:
- 值接近 0:告诉系统尽可能用物理内存,不到万不得已别碰 Swap。
- 值接近 100:告诉系统早点把数据往硬盘(Swap)里丢。
对大多数服务器来说,咱们把这个值设为 10 是极其推荐的。
修改步骤:
- 打开系统控制配置表bash
nano /etc/sysctl.conf - 在该文件的在最末尾换行并添加:text
vm.swappiness=10 Ctrl + X,再按Y,然后回车保存退出。- 应用生效:bash
sysctl -p
Swappiness 值推荐
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 桌面系统 | 60 | 默认值,平衡性能和响应 |
| Web 服务器 | 10 | 优先使用物理内存 |
| 数据库服务器 | 1 | 几乎不使用 Swap |
| 小内存 VPS | 10-20 | 防止 OOM,但尽量减少使用 |
| 大内存服务器 | 0-10 | 充分利用物理内存 |
临时修改(重启后失效):
sysctl -w vm.swappiness=10查看当前值:
cat /proc/sys/vm/swappiness
# 或
sysctl vm.swappinessSwap 管理进阶
调整 Swap 优先级
如果有多个 Swap 文件或分区,可以设置优先级:
# 查看当前优先级
swapon --show
# 停用现有 Swap
swapoff /swapfile
# 重新启用并设置优先级(数值越大优先级越高)
swapon -p 100 /swapfile
# 永久设置(编辑 /etc/fstab)
# /swapfile none swap sw,pri=100 0 0创建 Swap 分区(而非文件)
如果硬盘有未分配空间,可以创建专用分区:
# 1. 使用 fdisk 创建分区
fdisk /dev/sda
# 按 n 创建新分区,类型设为 82 (Linux swap)
# 2. 格式化为 Swap
mkswap /dev/sda2
# 3. 启用
swapon /dev/sda2
# 4. 添加到 fstab
echo '/dev/sda2 none swap sw 0 0' >> /etc/fstab动态调整 Swap 大小
扩展 Swap(从 2GB 到 4GB):
# 1. 停用当前 Swap
swapoff /swapfile
# 2. 调整文件大小
fallocate -l 4G /swapfile
# 3. 重新设置权限和格式化
chmod 600 /swapfile
mkswap /swapfile
# 4. 重新启用
swapon /swapfile
# 5. 验证
free -h缩小 Swap(从 4GB 到 2GB):
# 确保 Swap 使用量小于目标大小
swapoff /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile监控 Swap 使用情况
实时监控工具
1. 使用 htop
# 安装 htop
apt install htop
# 运行
htop在界面底部可以看到 Swap 使用条。
2. 使用 vmstat
# 每秒刷新一次
vmstat 1
# 关注 si/so 列(swap in/out)
# 如果持续非零,说明 Swap 使用频繁3. 使用 sar(系统活动报告)
# 安装 sysstat
apt install sysstat
# 查看历史 Swap 使用
sar -W
# 实时监控
sar -W 1设置 Swap 使用告警
创建监控脚本:
#!/bin/bash
# /usr/local/bin/check_swap.sh
SWAP_THRESHOLD=80 # 告警阈值(百分比)
# 获取 Swap 使用百分比
SWAP_USAGE=$(free | grep Swap | awk '{if($2>0) print int($3/$2*100); else print 0}')
if [ $SWAP_USAGE -gt $SWAP_THRESHOLD ]; then
echo "警告:Swap 使用率已达 ${SWAP_USAGE}%" | mail -s "Swap 告警" admin@example.com
fi添加到 crontab:
# 每 5 分钟检查一次
crontab -e
*/5 * * * * /usr/local/bin/check_swap.sh常见问题排查
Q1: Swap 创建失败,提示 "No space left on device"?
原因: 硬盘空间不足
解决方案:
# 检查磁盘空间
df -h
# 清理不必要的文件
apt clean
journalctl --vacuum-size=100M
rm -rf /tmp/*
# 或者创建更小的 Swap
fallocate -l 512M /swapfileQ2: 系统频繁使用 Swap,导致性能下降?
可能原因:
- 物理内存确实不足
- Swappiness 值设置过高
- 存在内存泄漏的程序
解决方案:
# 1. 降低 swappiness
sysctl -w vm.swappiness=5
# 2. 查找占用内存最多的进程
ps aux --sort=-%mem | head -10
# 3. 检查是否有内存泄漏
watch -n 1 'free -h'
# 4. 考虑升级 VPS 内存Q3: 如何完全禁用 Swap?
# 1. 停用所有 Swap
swapoff -a
# 2. 从 fstab 中删除 Swap 条目
nano /etc/fstab
# 删除或注释掉包含 swap 的行
# 3. 删除 Swap 文件(可选)
rm /swapfile
# 4. 验证
free -h
# Swap 行应全为 0Q4: Swap 文件损坏怎么办?
症状: 系统启动时报错,或 swapon 失败
解决方案:
# 1. 停用损坏的 Swap
swapoff /swapfile
# 2. 删除旧文件
rm /swapfile
# 3. 重新创建
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 4. 验证
swapon --showQ5: SSD 硬盘使用 Swap 会缩短寿命吗?
答案: 影响很小,可以忽略。
原因:
- 现代 SSD 寿命很长(通常 >100TBW)
- Swap 写入量相对较小
- 相比系统崩溃的风险,SSD 磨损可接受
优化建议:
- 设置较低的 swappiness(10)
- 使用 TRIM 定期优化 SSD
# 启用定期 TRIM
systemctl enable fstrim.timerSwap 最佳实践总结
推荐配置方案
512MB 内存 VPS:
# 创建 1GB Swap(2倍内存)
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 设置 swappiness
echo 'vm.swappiness=20' >> /etc/sysctl.conf
sysctl -p1GB 内存 VPS:
# 创建 2GB Swap(2倍内存)
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 设置 swappiness
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p2GB+ 内存 VPS:
# 创建等于内存大小的 Swap
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 设置 swappiness
echo 'vm.swappiness=5' >> /etc/sysctl.conf
sysctl -p关键要点
- ✅ Swap 大小:通常为物理内存的 1-2 倍
- ✅ 权限设置:必须是 600(仅 root 可读写)
- ✅ 开机自启:务必添加到
/etc/fstab - ✅ Swappiness:服务器建议设为 10
- ✅ 定期监控:关注 Swap 使用率
从此你的小鸡再也不会轻易死机崩溃了!🚀✨
- 🔥🔥🔥2026年便宜好用的翻墙VPN机场推荐评测(长期更新 欢迎推荐)
- 稳定好用的流媒体合租平台推荐(长期更新 欢迎推荐)
- AI 使用教程汇总|ChatGPT、Gemini 新手入门与国内使用指南
- 国外接码平台 Hero SMS 评测(稳定 · 低价 · 高成功率)
免责声明
本文仅供技术交流和学习参考,请遵守当地法律法规,合理合法使用网络服务。