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
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意