跳转到内容

Linux Swap 虚拟内存配置完全指南 | VPS 内存优化教程

Linux Swap Virtual Memory

在便宜的云厂商(如著名的各种“灵车”厂商)处购买的 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 脚本:

bash
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

bash
free -h

看输出的 Swap: 这一行。如果后面显示的都是 0B 或者 0,说明咱们现在还没有 Swap。继续往下走。

完整内存信息查看:

bash
# 查看详细内存使用情况
free -h

# 示例输出:
#               total        used        free      shared  buff/cache   available
# Mem:          985Mi       412Mi        89Mi       2.0Mi       483Mi       425Mi
# Swap:            0B          0B          0B

2. 创建一个物理文件用作 Swap

使用 fallocate 命令会在根目录 / 下快速创建一个 2G 大小的名为 swapfile 的空白文件。

bash
fallocate -l 2G /swapfile

注:如果你需要 1GB,把 2G 改成 1G 即可。

替代方法(如果 fallocate 不可用):

bash
# 使用 dd 命令创建(较慢但兼容性更好)
dd if=/dev/zero of=/swapfile bs=1M count=2048

验证文件创建:

bash
ls -lh /swapfile
# 应该显示:-rw-r--r-- 1 root root 2.0G ...

3. 设置严格的安全权限并格式化该文件

不设置好权限,系统会报错不让你挂载(因为这事关系统内存的安全)。

bash
chmod 600 /swapfile
mkswap /swapfile

终端会提示类似 Setting up swapspace version 1

权限说明:

  • 600 = 仅 root 用户可读写
  • 其他用户无任何权限(安全考虑)

4. 激活当前这个 Swap 文件

bash
swapon /swapfile

此时再运行一次 free -h,你看 Swap: 这一行是不是已经显示大概 2.0G 了?说明这部分虚拟内存拿下了!

验证激活状态:

bash
# 方法 1:查看 Swap 使用情况
free -h

# 方法 2:查看所有启用的 Swap
swapon --show

# 示例输出:
# NAME      TYPE SIZE USED PRIO
# /swapfile file   2G   0B   -2

5. 设为开机自启(永久生效)

上面的动作只要一重启 VPS 就会失效。接下来我们需要把它写入系统的设备挂载表 /etc/fstab 里,让它下次开机时自动被挂载上。

执行这行追加命令:

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

验证 fstab 配置:

bash
# 查看 fstab 文件末尾
tail -n 5 /etc/fstab

# 应该看到类似:
# /swapfile none swap sw 0 0

测试 fstab 配置是否正确:

bash
# 模拟重启挂载(不会真的重启)
mount -a

# 如果没有报错,说明配置正确

如何优化 Swap 的使用率 (Swappiness)?

默认情况下,一旦内存稍微吃紧,Linux 会比较积极地去使用 Swap。不过既然有物理内存,咱们肯定更喜欢优先用内存(毕竟速度快)。我们可以通过修改一个叫 swappiness 的内核参数来让内核不到迫不得已不要去碰 Swap。

swappiness 的值从 0 到 100:

  • 值接近 0:告诉系统尽可能用物理内存,不到万不得已别碰 Swap。
  • 值接近 100:告诉系统早点把数据往硬盘(Swap)里丢。

对大多数服务器来说,咱们把这个值设为 10 是极其推荐的。

修改步骤:

  1. 打开系统控制配置表
    bash
    nano /etc/sysctl.conf
  2. 在该文件的在最末尾换行并添加:
    text
    vm.swappiness=10
  3. Ctrl + X,再按 Y,然后回车保存退出。
  4. 应用生效:
    bash
    sysctl -p

Swappiness 值推荐

场景推荐值说明
桌面系统60默认值,平衡性能和响应
Web 服务器10优先使用物理内存
数据库服务器1几乎不使用 Swap
小内存 VPS10-20防止 OOM,但尽量减少使用
大内存服务器0-10充分利用物理内存

临时修改(重启后失效):

bash
sysctl -w vm.swappiness=10

查看当前值:

bash
cat /proc/sys/vm/swappiness
# 或
sysctl vm.swappiness

Swap 管理进阶

调整 Swap 优先级

如果有多个 Swap 文件或分区,可以设置优先级:

bash
# 查看当前优先级
swapon --show

# 停用现有 Swap
swapoff /swapfile

# 重新启用并设置优先级(数值越大优先级越高)
swapon -p 100 /swapfile

# 永久设置(编辑 /etc/fstab)
# /swapfile none swap sw,pri=100 0 0

创建 Swap 分区(而非文件)

如果硬盘有未分配空间,可以创建专用分区:

bash
# 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):

bash
# 1. 停用当前 Swap
swapoff /swapfile

# 2. 调整文件大小
fallocate -l 4G /swapfile

# 3. 重新设置权限和格式化
chmod 600 /swapfile
mkswap /swapfile

# 4. 重新启用
swapon /swapfile

# 5. 验证
free -h

缩小 Swap(从 4GB 到 2GB):

bash
# 确保 Swap 使用量小于目标大小
swapoff /swapfile
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

监控 Swap 使用情况

实时监控工具

1. 使用 htop

bash
# 安装 htop
apt install htop

# 运行
htop

在界面底部可以看到 Swap 使用条。

2. 使用 vmstat

bash
# 每秒刷新一次
vmstat 1

# 关注 si/so 列(swap in/out)
# 如果持续非零,说明 Swap 使用频繁

3. 使用 sar(系统活动报告)

bash
# 安装 sysstat
apt install sysstat

# 查看历史 Swap 使用
sar -W

# 实时监控
sar -W 1

设置 Swap 使用告警

创建监控脚本:

bash
#!/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:

bash
# 每 5 分钟检查一次
crontab -e
*/5 * * * * /usr/local/bin/check_swap.sh

常见问题排查

Q1: Swap 创建失败,提示 "No space left on device"?

原因: 硬盘空间不足

解决方案:

bash
# 检查磁盘空间
df -h

# 清理不必要的文件
apt clean
journalctl --vacuum-size=100M
rm -rf /tmp/*

# 或者创建更小的 Swap
fallocate -l 512M /swapfile

Q2: 系统频繁使用 Swap,导致性能下降?

可能原因:

  1. 物理内存确实不足
  2. Swappiness 值设置过高
  3. 存在内存泄漏的程序

解决方案:

bash
# 1. 降低 swappiness
sysctl -w vm.swappiness=5

# 2. 查找占用内存最多的进程
ps aux --sort=-%mem | head -10

# 3. 检查是否有内存泄漏
watch -n 1 'free -h'

# 4. 考虑升级 VPS 内存

Q3: 如何完全禁用 Swap?

bash
# 1. 停用所有 Swap
swapoff -a

# 2. 从 fstab 中删除 Swap 条目
nano /etc/fstab
# 删除或注释掉包含 swap 的行

# 3. 删除 Swap 文件(可选)
rm /swapfile

# 4. 验证
free -h
# Swap 行应全为 0

Q4: Swap 文件损坏怎么办?

症状: 系统启动时报错,或 swapon 失败

解决方案:

bash
# 1. 停用损坏的 Swap
swapoff /swapfile

# 2. 删除旧文件
rm /swapfile

# 3. 重新创建
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 4. 验证
swapon --show

Q5: SSD 硬盘使用 Swap 会缩短寿命吗?

答案: 影响很小,可以忽略。

原因:

  • 现代 SSD 寿命很长(通常 >100TBW)
  • Swap 写入量相对较小
  • 相比系统崩溃的风险,SSD 磨损可接受

优化建议:

  • 设置较低的 swappiness(10)
  • 使用 TRIM 定期优化 SSD
bash
# 启用定期 TRIM
systemctl enable fstrim.timer

Swap 最佳实践总结

推荐配置方案

512MB 内存 VPS:

bash
# 创建 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 -p

1GB 内存 VPS:

bash
# 创建 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 -p

2GB+ 内存 VPS:

bash
# 创建等于内存大小的 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

关键要点

  1. Swap 大小:通常为物理内存的 1-2 倍
  2. 权限设置:必须是 600(仅 root 可读写)
  3. 开机自启:务必添加到 /etc/fstab
  4. Swappiness:服务器建议设为 10
  5. 定期监控:关注 Swap 使用率

从此你的小鸡再也不会轻易死机崩溃了!🚀✨


免责声明

本文仅供技术交流和学习参考,请遵守当地法律法规,合理合法使用网络服务。