swap分区扩容脚本缓解服务器OOM报错
当 Linux 服务器频繁提示 Out of Memory,或者 MySQL、Nginx 等进程突然被杀死,最常见的原因是物理内存不足,而 swap 空间又太小。
本文提供一个 swap 分区扩容脚本,帮你自动完成旧 swap 清理、新 swap 文件创建、开机挂载和参数调优,零基础用户也能直接照做,用最短时间缓解 OOM 报错。
扩容前先确认是不是 swap 不够
执行 free -h 查看内存和 swap 使用情况。
如果 Swap 一行的 total 很小,或者 used 接近 total,同时系统日志里出现 OOM 关键字,基本可以判断是 swap 空间不足导致的。
再用 swapon --show 查看当前 swap 设备或文件路径:
swapon --show
如果输出为空,说明当前没有启用任何 swap。
下面可以放心用脚本扩容。
swap 扩容脚本:一键创建并启用
下面这段脚本会自动检测根分区可用空间、
创建 2G 的 swap 文件、
设置权限并写入 /etc/fstab,
同时把 swappiness 调整到 10,
避免系统过于频繁使用磁盘交换。
#!/bin/bash
# swap 扩容脚本 - 自动创建并启用 swapfile
SWAPFILE="/swapfile"
SWAP_SIZE_MB=2048 # 需要扩容的大小,可改成 4096
# 1. 检查根分区可用空间
df -h / | tail -1
# 2. 创建 swap 文件
dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAP_SIZE_MB status=progress
chmod 600 $SWAPFILE
mkswap $SWAPFILE
# 3. 关闭旧 swap 再启用新文件
swapoff -a 2>/dev/null || true
swapon $SWAPFILE
# 4. 写入开机自启
grep -q "$SWAPFILE" /etc/fstab || echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab
# 5. 调整 swappiness
echo 10 > /proc/sys/vm/swappiness
echo "vm.swappiness=10" >> /etc/sysctl.conf
echo "swap 扩容完成,当前信息:"
swapon --show
free -h
把脚本保存为 swap_expand.sh,然后执行:
chmod +x swap_expand.sh
sudo ./swap_expand.sh
执行过程中如果看到 Setting up swapspace version 1 之类的提示,说明 swap 文件创建成功。
执行后如何验证扩容生效
脚本运行完,用以下命令检查结果:
free -h
swapon --show
cat /proc/sys/vm/swappiness
重点看 free -h 中 Swap 的 total 是否变成你设置的大小,swapon --show 是否列出了 /swapfile,swappiness 是否显示为 10。
如果之前有 OOM 报错,可以再观察一段时间,或者用 dmesg | grep -i 'out of memory' 查看是否还有新的 OOM 记录。
扩容时最容易踩的几个坑
根分区空间不足。 dd 创建 swap 文件会占用真实磁盘空间。
执行前确认 / 分区剩余空间大于要创建的 swap 大小,否则会导致磁盘写满。
可以先用 df -h / 查看。
旧 swap 没关闭干净。 如果之前已经有 swap 分区或文件,直接添加新 swap 会导致系统同时使用多个 swap,优先级混乱。
脚本里已经包含 swapoff -a,但如果你手动操作,一定要先 swapoff 旧的再 swapon 新的。
不要盲目调大 swappiness。 swappiness 范围是 0-100,值越大越积极使用 swap。
设置为 10 适合大多数 Web 服务器,如果设置成 100 会导致磁盘 IO 飙升,反而拖慢性能。
云服务器特殊环境。 部分云平台默认禁用了 swap 支持,或者内核参数受限。
如果 swapon 报错 Operation not permitted,需要先检查云服务器是否支持自定义 swap,建议以服务商文档或工单回复为准。
关于 swap 的常见疑问
如何确认 OOM 就是内存不足引起的? 执行 dmesg | grep -i 'out of memory',
如果有进程被 killed 的记录,
并且日志里显示 Out of memory:,
Kill process
基本可以确认。
swap 扩容后还是 OOM 怎么办? swap 只是缓解手段,如果业务进程本身内存占用持续上涨,最终还是需要加物理内存、限制单进程内存或优化应用配置。
这个脚本需要放在 crontab 里定时执行吗? 不需要。
swap 文件已经写入 /etc/fstab,重启后会自动挂载,vm.swappiness 也写进了 sysctl.conf,一次配置长期生效。
如果你正在处理 swap 扩容缓解服务器 OOM 报错,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑部分。
如果仍然频繁 OOM,就需要从应用层和内存分配层面继续排查了。