swap分区扩容脚本缓解服务器OOM报错

当 Linux 服务器频繁提示 Out of Memory,或者 MySQL、Nginx 等进程突然被杀死,最常见的原因是物理内存不足,而 swap 空间又太小。
本文提供一个 swap 分区扩容脚本,帮你自动完成旧 swap 清理、新 swap 文件创建、开机挂载和参数调优,零基础用户也能直接照做,用最短时间缓解 OOM 报错。

扩容前先确认是不是 swap 不够

执行 free -h 查看内存和 swap 使用情况。
如果 Swap 一行的 total 很小,或者 used 接近 total,同时系统日志里出现 OOM 关键字,基本可以判断是 swap 空间不足导致的。

再用 swapon --show 查看当前 swap 设备或文件路径:

swapon --show

如果输出为空,说明当前没有启用任何 swap。
下面可以放心用脚本扩容。

swap 扩容脚本:一键创建并启用

下面这段脚本会自动检测根分区可用空间、
创建 2G 的 swap 文件、
设置权限并写入 /etc/fstab
同时把 swappiness 调整到 10,
避免系统过于频繁使用磁盘交换。

#!/bin/bash
# swap 扩容脚本 - 自动创建并启用 swapfile

SWAPFILE="/swapfile"
SWAP_SIZE_MB=2048  # 需要扩容的大小,可改成 4096

# 1. 检查根分区可用空间
df -h / | tail -1

# 2. 创建 swap 文件
dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAP_SIZE_MB status=progress
chmod 600 $SWAPFILE
mkswap $SWAPFILE

# 3. 关闭旧 swap 再启用新文件
swapoff -a 2>/dev/null || true
swapon $SWAPFILE

# 4. 写入开机自启
grep -q "$SWAPFILE" /etc/fstab || echo "$SWAPFILE none swap sw 0 0" >> /etc/fstab

# 5. 调整 swappiness
echo 10 > /proc/sys/vm/swappiness
echo "vm.swappiness=10" >> /etc/sysctl.conf

echo "swap 扩容完成,当前信息:"
swapon --show
free -h

把脚本保存为 swap_expand.sh,然后执行:

chmod +x swap_expand.sh
sudo ./swap_expand.sh

执行过程中如果看到 Setting up swapspace version 1 之类的提示,说明 swap 文件创建成功。

执行后如何验证扩容生效

脚本运行完,用以下命令检查结果:

free -h
swapon --show
cat /proc/sys/vm/swappiness

重点看 free -hSwaptotal 是否变成你设置的大小,swapon --show 是否列出了 /swapfileswappiness 是否显示为 10。

如果之前有 OOM 报错,可以再观察一段时间,或者用 dmesg | grep -i 'out of memory' 查看是否还有新的 OOM 记录。

扩容时最容易踩的几个坑

根分区空间不足。 dd 创建 swap 文件会占用真实磁盘空间。
执行前确认 / 分区剩余空间大于要创建的 swap 大小,否则会导致磁盘写满。
可以先用 df -h / 查看。

旧 swap 没关闭干净。 如果之前已经有 swap 分区或文件,直接添加新 swap 会导致系统同时使用多个 swap,优先级混乱。
脚本里已经包含 swapoff -a,但如果你手动操作,一定要先 swapoff 旧的再 swapon 新的。

不要盲目调大 swappiness。 swappiness 范围是 0-100,值越大越积极使用 swap。
设置为 10 适合大多数 Web 服务器,如果设置成 100 会导致磁盘 IO 飙升,反而拖慢性能。

云服务器特殊环境。 部分云平台默认禁用了 swap 支持,或者内核参数受限。
如果 swapon 报错 Operation not permitted,需要先检查云服务器是否支持自定义 swap,建议以服务商文档或工单回复为准。

关于 swap 的常见疑问

如何确认 OOM 就是内存不足引起的? 执行 dmesg | grep -i 'out of memory'
如果有进程被 killed 的记录,
并且日志里显示 Out of memory:
Kill process

基本可以确认。

swap 扩容后还是 OOM 怎么办? swap 只是缓解手段,如果业务进程本身内存占用持续上涨,最终还是需要加物理内存、限制单进程内存或优化应用配置。

这个脚本需要放在 crontab 里定时执行吗? 不需要。
swap 文件已经写入 /etc/fstab,重启后会自动挂载,vm.swappiness 也写进了 sysctl.conf,一次配置长期生效。

如果你正在处理 swap 扩容缓解服务器 OOM 报错,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑部分。
如果仍然频繁 OOM,就需要从应用层和内存分配层面继续排查了。

分享到:
上一篇
Nginx自定义日志格式分析海外访客来源,从配置到出报告
下一篇
多网卡绑定链路聚合提升服务器出口带宽实操教程
1
系统公告

机房迁移升级通知

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