swap分区一键扩容脚本缓解服务器频繁OOM报错问题
为什么swap扩容能缓解OOM报错
OOM(Out Of Memory)是Linux系统在可用内存耗尽时,主动杀掉进程的一种保护机制。
如果你的网站或应用频繁出现“Out of memory: Kill process”的日志,很可能就是物理内存不足。扩大swap分区(交换空间)相当于为系统增加一块“虚拟内存”,当物理内存吃紧时,系统可把不常用的数据挪到swap里,从而避免进程被直接杀死,为你争取排查或升级内存的时间。
准备工作:确认当前swap和磁盘空间
在运行扩容脚本之前,建议先用两条命令摸清服务器现状:
# 查看当前swap大小和使用情况
swapon --show
# 检查磁盘剩余空间,确保有足够余量
如果服务器是云主机,请确认你使用的系统盘或数据盘有至少2倍于当前swap的剩余空间。
例如当前swap只有1GB,计划扩容到4GB,那磁盘至少还要有4GB空闲。
一键swap扩容脚本(安全版)
下面这个脚本会自动判断当前swap是否开启、是否已有swap文件,然后执行扩容操作。
你只需要把下面内容保存为expand_swap.sh,并赋予执行权限即可。
#!/bin/bash
# swap分区一键扩容脚本 - 缓解服务器频繁OOM报错
# 使用前请确认磁盘空间充足,建议以root运行
SWAPFILE="/swapfile"
CURRENT_SIZE=$(swapon --show=SIZE --noheadings --bytes 2>/dev/null | tail -1)
if [ -z "$CURRENT_SIZE" ]; then
echo "当前无swap空间,创建1GB swap..."
SIZE_MB=1024
else
# 当前swap大小转换为MB,扩容到2倍(最小512MB增量)
CURRENT_MB=$(( $(echo $CURRENT_SIZE | awk '{print $1}') / 1024 / 1024 ))
NEW_MB=$(( CURRENT_MB * 2 ))
[ $NEW_MB -lt 512 ] && NEW_MB=512
echo "当前swap约为 ${CURRENT_MB}MB,计划扩容至 ${NEW_MB}MB"
SIZE_MB=$NEW_MB
fi
# 如果已有swapfile,先关闭并删除
grep -q "$SWAPFILE" /etc/fstab && swapoff "$SWAPFILE" 2>/dev/null && rm -f "$SWAPFILE"
# 创建新swap文件(使用dd,速度较慢但可靠,也可用fallocate,但部分文件系统不支持)
echo "正在创建 ${SIZE_MB}MB 的swap文件..."
dd if=/dev/zero of=$SWAPFILE bs=1M count=$SIZE_MB status=progress
chmod 600 $SWAPFILE
mkswap $SWAPFILE
swapon $SWAPFILE
# 写入fstab实现开机自动挂载
if ! grep -q "$SWAPFILE" /etc/fstab; then
echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab
fi
echo "操作完成!当前swap状态:"
swapon --show
运行方法:
chmod +x expand_swap.sh
sudo ./expand_swap.sh
脚本会自动检测已有swap并等比扩容(至少翻倍),不会影响现有的swap分区或文件,而是直接重建。
如果你只想手动指定大小,可以修改脚本中的SIZE_MB变量。
避坑指南:这些细节要注意
- 磁盘格式限制:如果
/根目录使用ZFS、Btrfs等CoW文件系统,创建swap文件时建议用dd(脚本已用),fallocate可能产生空洞导致swap无法使用。 - SWAP大小建议:对于内存小于4GB的服务器,swap设置为物理内存2倍;内存大于4GB,不少生产环境设定为4GB即可,避免过度占用磁盘。
- 不要占用系统盘全部空间:务必保留至少10%的磁盘余量,否则系统写日志都可能失败。
- 脚本执行中断处理:
dd创建大文件时如果杀掉进程,残留文件可能占用空间,执行前先确保无同名/swapfile。
如何验证swap扩容效果
运行脚本后,用下面命令检查swap是否生效:
swapon --show
free -h
重点关注Swap一行的total和used。
如果total变为你设定的新大小,说明扩容成功。
接着可以观察系统日志,确认OOM报错是否消失:
# 查看最近是否还有OOM触发
dmesg | grep -i "Out of memory" | tail -5
# 或者直接查看syslog
如果扩容后仍频繁OOM,说明物理内存严重不足,建议升级服务器内存,swap只是临时缓冲方案,不能替代物理内存。
如果你在扩容后遇到其他异常(如swap占用100%导致卡顿),可以回看本文的高频问题解答部分。
常见问题与解答
Q: 脚本执行后系统提示“swapon: /swapfile: swapon failed: 无效的参数”?
A: 通常是文件系统不支持swap文件。检查df -T /确认根分区类型,若是XFS、ext4等主流格式一般没问题。若是btrfs,需换用chattr +C创建非CoW文件。
Q: 扩容后swap使用率一直很高,需要处理吗?
A: 正常现象。系统遵循“不常用内存数据优先换出”策略,只要不是100%占满且导致频繁换进换出(kswapd占用CPU高),就不必担心。
Q: 我想让swap恢复原样怎么办?
A: 再次运行脚本,将SIZE_MB改回你需要的原始大小,或者直接手动swapoff /swapfile并删除文件、清理fstab条目即可。
如果你正在处理服务器频繁OOM报错的问题,建议先按本文步骤完整执行swap扩容,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。