搬瓦工VPS的低价方案通常只有512MB或1GB内存,运行Web服务器、数据库和PHP-FPM后内存很容易不够用。当物理内存耗尽时,Linux会触发OOM Killer强制杀死进程,导致服务中断。添加Swap虚拟内存可以将磁盘空间作为内存的扩展,有效避免OOM问题。
Tip: Swap不能替代物理内存,磁盘读写速度远低于内存。Swap主要用于应急缓冲,如果VPS长期依赖Swap运行,说明需要升级更高内存的方案。
# 查看当前内存和Swap使用情况
free -h
# 查看是否已有Swap
swapon --show
# 查看磁盘空间(确保有足够空间创建Swap文件)
df -h
Swap大小的推荐值:
# 方法1:使用fallocate创建(推荐,速度快)
fallocate -l 1G /swapfile
# 方法2:如果fallocate不可用,使用dd创建
dd if=/dev/zero of=/swapfile bs=1M count=1024
# 设置正确的权限(只有root可以读写)
chmod 600 /swapfile
# 格式化为Swap
mkswap /swapfile
# 启用Swap
swapon /swapfile
# 验证Swap已启用
free -h
swapon --show
上面的操作在重启后会失效,需要写入/etc/fstab实现永久挂载:
# 备份fstab(重要!错误的fstab可能导致系统无法启动)
cp /etc/fstab /etc/fstab.bak
# 添加Swap到fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 验证fstab内容
cat /etc/fstab
swappiness参数控制系统使用Swap的积极程度,取值范围0-100:
VPS建议设置为10-30,减少不必要的磁盘I/O:
# 查看当前swappiness值
cat /proc/sys/vm/swappiness
# 临时修改(立即生效,重启失效)
sysctl vm.swappiness=10
# 永久修改
echo 'vm.swappiness=10' >> /etc/sysctl.conf
# 或使用更规范的方式
cat >> /etc/sysctl.d/99-swap.conf << 'EOF'
vm.swappiness = 10
vm.vfs_cache_pressure = 50
EOF
# 使配置生效
sysctl -p /etc/sysctl.d/99-swap.conf
vfs_cache_pressure参数控制内核回收目录和inode缓存的倾向。默认值100,设为50可以让系统更倾向于保留缓存。
# 实时查看内存和Swap
free -h
# 查看Swap使用详情
swapon --show
# 查看哪些进程在使用Swap
# 方法1:通过/proc查看
for file in /proc/*/status; do
awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k 2 -n -r | head -20
# 方法2:使用top命令查看(按Shift+M按内存排序)
top
# 方法3:使用smem工具(需要安装)
apt install smem -y
smem -s swap -r | head -20
如果需要修改Swap大小:
# 关闭当前Swap
swapoff /swapfile
# 删除旧文件
rm /swapfile
# 创建新的Swap文件(例如2GB)
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 验证新大小
free -h
如果不再需要Swap:
# 关闭Swap
swapoff /swapfile
# 从fstab中删除Swap行
nano /etc/fstab
# 删除包含 /swapfile 的行
# 删除Swap文件
rm /swapfile
# 验证
free -h
将以上步骤整合为一键脚本,方便快速部署:
#!/bin/bash
# VPS一键添加Swap脚本
SWAP_SIZE="1G"
SWAP_FILE="/swapfile"
# 检查是否已有Swap
if swapon --show | grep -q "$SWAP_FILE"; then
echo "Swap已存在,退出"
exit 1
fi
# 创建Swap
echo "正在创建${SWAP_SIZE} Swap..."
fallocate -l $SWAP_SIZE $SWAP_FILE
chmod 600 $SWAP_FILE
mkswap $SWAP_FILE
swapon $SWAP_FILE
# 写入fstab
if ! grep -q "$SWAP_FILE" /etc/fstab; then
echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab
fi
# 设置swappiness
sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.conf
echo "Swap配置完成!"
free -h
更多系统优化设置请参考Linux内核参数优化详解。
Tip: 更多教程请查看新手教程。