服务器频繁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 --show或free -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个错误
- swap文件过大导致磁盘爆满:内存有16GB,swap设置到32GB,根分区只有40GB,很容易占满影响系统。建议swap不要超过内存的 2倍,云服务器通常1倍或1.5倍足够。本脚本默认1.5倍,你可以自行修改
150为100或200。 - 脚本执行失败时忘记备份:如果
/swapfile已存在,脚本会覆盖;建议先执行cp /swapfile /swapfile.bak备份原有交换文件。 - 重启后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 地址为示例,实际部署时请将脚本托管到可靠位置或本地执行。