服务器频繁OOM报错swap分区扩容根治脚本

问题描述:服务器频繁OOM,服务无故挂掉

当服务器内存耗尽时,Linux 内核会触发 OOM Killer 杀掉高内存占用的进程,导致网站或服务突然中断。
很多新手用户扩容swap分区时手动操作容易出错,今天分享一个经过生产验证的 swap扩容根治脚本,让你一键解决频繁OOM报错。

准备条件

在动手之前,请先确认以下几点:

  • 操作系统:适用于 CentOS 7/8、Ubuntu 18.04+、Debian 10+ 等主流发行版。
  • 有 root 权限:所有操作需要 root 或 sudo 执行。
  • 磁盘剩余空间:执行 df -h 检查根分区或目标分区剩余空间,建议至少保留 10GB 以上空闲,避免因swap文件占满系统盘导致其他问题。
  • 确认当前swap状态:执行 swapon --showfree -h 查看当前swap大小和位置。如果已有swap文件但很小,本脚本会先关闭旧交换再创建新文件。

一键扩容脚本(三步完成)

我将整个操作封装为脚本,你只需复制下面命令在终端执行即可。
脚本逻辑:自动计算当前内存大小,创建内存大小 1.5倍 的swap文件(可自定义倍数),并永久启用。

# 以 root 身份执行以下命令
curl -sSL https://your-server.com/swap-expand.sh -o /tmp/swap-expand.sh && chmod +x /tmp/swap-expand.sh && bash /tmp/swap-expand.sh
如果无法联网,可以手动创建脚本文件 /tmp/swap-expand.sh,内容如下(注意替换实际服务器IP):
#!/bin/bash
# swap分区扩容脚本 - 自动将swap设为内存的1.5倍
# 适合频繁OOM报错的服务器

# 获取物理内存大小(以MB为单位)
mem_mb=$(free -m | awk '/^Mem:/{print $2}')
# 计算目标swap大小(1.5倍,取整)
swap_mb=$((mem_mb * 150 / 100))

# 关闭已有swap(如果有)
swapoff -a 2>/dev/null

# 创建swap文件(/swapfile)
dd if=/dev/zero of=/swapfile bs=1M count=$swap_mb status=progress
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# 写入/etc/fstab实现开机自动挂载
if ! grep -q '/swapfile' /etc/fstab; then
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
fi

echo "swap已扩容至 ${swap_mb}MB,立即生效,重启后仍然有效。"

执行脚本后,看到“swap已扩容至 xxx MB”即成功。

避坑指南:新手最容易犯的3个错误

  1. swap文件过大导致磁盘爆满:内存有16GB,swap设置到32GB,根分区只有40GB,很容易占满影响系统。建议swap不要超过内存的 2倍,云服务器通常1倍或1.5倍足够。本脚本默认1.5倍,你可以自行修改 150100200
  2. 脚本执行失败时忘记备份:如果 /swapfile 已存在,脚本会覆盖;建议先执行 cp /swapfile /swapfile.bak 备份原有交换文件。
  3. 重启后swap未自动挂载:脚本已写入 /etc/fstab,但如果系统使用 systemd 且之前有冲突,可能不生效。可以手动执行 systemctl daemon-reload,然后 swapon -a 测试。

验证效果:如何确认swap扩容生效

执行以下命令即可快速验证:

free -h

输出中 Swap 行的 total 列会显示扩容后的大小(例如从2G变为8G)。

再检查oom日志是否还有报错:

dmesg | grep -i oom
journalctl -xe | grep -i 'out of memory'

如果扩容后仍有大量OOM记录,说明内存不足问题仍需优化应用,swap只是缓解。

高频问题解答

Q1:脚本安全吗?会不会影响现有数据?
脚本只操作swap相关配置,不修改分区表,不删除用户数据。唯一风险是 /swapfile 被覆盖,建议提前备份。

Q2:swap设置多大合适?
生产环境建议 内存1~2倍。如果服务器内存8GB,swap设为12GB左右;如果内存64GB,建议16GB(此时OOM概率低,swap过大浪费磁盘IO)。

Q3:扩容后还需要做什么?
建议同时检查应用内存泄露(如Java、MySQL的配置),swap只是兜底方案。长期优化应减少内存占用而非依赖swap。

写在最后

频繁OOM掉线确实让人头疼,但通过本脚本扩容swap后,多数中小型站点都能明显降低宕机频率。
如果你在操作中遇到“权限不足”“磁盘空间不足”等报错,优先检查磁盘剩余空间和root权限。
如果仍有异常,欢迎在评论区留言交流。

提示:脚本中的 curl 地址为示例,实际部署时请将脚本托管到可靠位置或本地执行。
分享到:
上一篇
AI批量生成外贸文章WordPress发布插件
下一篇
容器资源限制防止进程抢占内存宕机故障
1
系统公告

机房迁移升级通知

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