swap分区一键扩容脚本缓解频繁OOM报错
服务器频繁出现 Out of Memory(OOM)报错,最直接的物理办法是加内存条,但如果暂时无法升级硬件,扩容 swap 分区(用磁盘空间模拟内存)能有效缓解进程被系统强制杀死的问题。
本文提供一份可直接复制执行的一键扩容脚本,并带你避开那些常见的坑。
先确认当前环境
在运行脚本之前,登录服务器并执行以下命令,确认现有 swap 和磁盘剩余空间:
free -h # 查看内存和 swap 用量
df -h / # 查看根分区剩余空间
swapon --show # 查看当前 swap 设备或文件
如果根分区剩余空间小于 2G,建议换到其他分区(如 /home)创建 swap 文件。
以下步骤假设根分区有足够空间。
一键扩容脚本(直接复制使用)
将以下内容保存为 swap_expand.sh,然后赋予执行权限并运行:
#!/bin/bash
# swap 一键扩容脚本
# 默认增加 2G swap,可根据需要修改 SIZE 变量
SIZE="2G"
SWAPFILE="/swapfile"
echo "当前 swap 信息:"
swapon --show
echo "正在创建 ${SIZE} 的 swap 文件..."
fallocate -l $SIZE $SWAPFILE
if [ $? -ne 0 ]; then
echo "fallocate 失败,尝试使用 dd 创建..."
dd if=/dev/zero of=$SWAPFILE bs=1M count=2048
fi
chmod 600 $SWAPFILE
mkswap $SWAPFILE
swapon $SWAPFILE
echo "新增后的 swap 信息:"
free -h
运行步骤:
chmod +x swap_expand.sh
sudo ./swap_expand.sh
如果想让重启后自动挂载,把下面的内容追加到 /etc/fstab 文件尾部:
/swapfile none swap sw 0 0
避坑说明:这些错误你一定不想遇到
- 文件系统不支持 fallocate:部分 XFS 或旧版系统
fallocate可能失败,脚本已自动回退到dd创建,但 dd 创建速度较慢,耐心等待即可。 - 权限设置错误:swap 文件权限必须是 600,否则
swapon会拒绝加载,脚本已处理。 - 磁盘空间不足:如果创建时提示“No space left”,请先清理日志或移动到其他分区。
- SWAP 最大值限制:某些云服务器内核参数限制单个 swap 文件大小,如果超过 2G 请分段创建多个 swap 文件。
验证扩容是否生效
运行 free -h 查看 swap 行,检查 total 是否增加了 2G(或你指定的大小)。
同时观察系统日志:
sudo dmesg | tail -20 | grep -i oom
如果未来一段时间不再出现 OOM 相关日志,说明扩容成功缓解了问题。
常见问题 FAQ
Q:swap 能完全替代物理内存吗?
A:不能。swap 速度远慢于内存,只能作为临时内存不足的补充。如果持续 SWAP 占用高而不释放,建议考虑升级内存。
Q:扩容后 swap 文件可以删除吗?
A:可以,但要先运行 swapoff /swapfile 关闭,然后删除文件并从 /etc/fstab 中移除对应行。
Q:如何快速调整 swap 大小?
直接修改脚本中的 SIZE 变量重新运行即可,旧 swap 文件需先关闭再删除。但还是建议一次规划好大小,避免频繁调整。
如果你正在被 OOM 困扰,按本文步骤执行后通常能立即看到改善。
后续如果业务持续增长,建议结合监控工具(如 htop、nmon)定期评估内存使用,及时升级硬件才是根本解决方案。