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一行的totalused
如果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扩容,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
CVE高危漏洞定期自动扫描服务器巡检自动化脚本
下一篇
宝塔面板一键迁移多站点完整数据零丢失搬家教程
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意