swap分区一键扩容根治服务器频繁OOM

当服务器频繁出现Out-Of-Memory(OOM)错误,通常意味着物理内存不足,系统被迫杀掉进程。
Swap分区(硬盘上划出的一块交换空间)能在内存用满时充当紧急缓冲区,但很多服务器默认Swap大小偏小甚至为0。
本文提供一条靠谱的一键扩容脚本,只需几分钟即可将Swap扩至理想大小,从根源上避免OOM,适合所有使用Linux系统的云服务器或VPS用户。

什么时候该扩容Swap?

如果你遇到以下情况,Swap扩容会非常有效:

  • 服务器运行了一段时间,出现"Killed process"或"Out of memory"日志。
  • 部署了内存密集型应用(如Java/Python服务、数据库)后频繁卡死。
  • 使用free -h看到Swap总量很小(如0或1Gi),且已使用比例很高。
  • 云服务器配置了2GB内存但业务峰值常超1.5GB。
注意:Swap不能完全替代物理内存,但能显著降低OOM概率,尤其适合轻负载、突发访问的场景。

准备工作:查看当前Swap状态

在操作前,先确认当前Swap情况。
SSH登录服务器后执行:

free -h | grep -i swap
swapon --show

如果显示Swap: 0B/swapfile大小不足,说明需要扩容。
另外,请确保磁盘剩余空间足够(建议至少剩余10GB),可以用df -h /查看。

一键扩容Swap分区脚本

以下脚本专门为贪快、怕错的用户设计,两步完成扩容。
它会在根目录创建/swapfile文件,并根据你的服务器内存自动计算推荐大小(通常为物理内存的1~2倍,但不超过8GB)。

第一步:创建并执行扩容脚本
将以下内容保存为swap_expand.sh,然后用bash swap_expand.sh运行:

#!/bin/bash
# Swap分区一键扩容脚本

# 获取当前Swap大小
current_swap=$(swapon --show=SIZE --noheadings --bytes 2>/dev/null | awk '{sum+=$1} END{print sum}')
if [ -z "$current_swap" ]; then current_swap=0; fi

# 获取物理内存大小(MB)
mem_total=$(awk '/MemTotal/{print $2}' /proc/meminfo)
swap_recommend=$((mem_total * 2))  # 推荐设为内存2倍

# 如果当前Swap已足够大则跳过
if [ "$current_swap" -ge "$swap_recommend" ]; then
    echo "当前Swap已足够,无需扩容。"
    exit 0
fi

# 删除旧swapfile(如有)
swapoff /swapfile 2>/dev/null
# 创建新swapfile,大小等于推荐值(KB转GB)
size_mb=$((swap_recommend / 1024))
fallocate -l ${size_mb}M /swapfile
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已扩容至 ${size_mb}MB"

第二步:验证结果
再次运行free -hswapon --show,你会看到Swap变大了。例如:

Swap:           4.0Gi       0B       4.0Gi
脚本中的容量为内存的2倍,如果内存很大(如16GB),建议手动调整为8GB以内,避免磁盘占用过高。

避坑指南:这几点必须注意

  • 磁盘空间不足:创建swapfile需要连续空间,如果根分区已满会导致创建失败。建议在操作前清理日志或临时文件。
  • OpenVZ/LXC虚拟化:部分云厂商的虚拟化架构不支持自定义swap文件,此时无法通过此方法扩容。可以用cat /proc/user_beancounters检查,如果有内容则表示受限。
  • 重启后失效:脚本已写入/etc/fstab,但如果你自己手工操作却忘了写入,重启后swap会丢失。请务必执行grep /swapfile /etc/fstab确认。
  • 频繁OOM不止Swap:如果扩容后仍经常OOM,说明内存本身严重不足,建议升级配置或优化程序内存占用。Swap只是兜底,不是万能药。

效果验证与常见问题

执行完扩容后,可以模拟内存压力测试:用stress工具(apt/yum install stress)快速占用内存,观察系统是否依然出现OOM。
正常情况下,Swap会逐渐被使用,进程保持存活。

FAQ:真实用户最关心的4个问题

Q1:扩容Swap会影响磁盘寿命吗?
A:频繁的Swap读写会加速SSD磨损,但对于普通服务器,日常写入量远低于寿命限值,无需过度担心。建议将Swap使用率控制在30%以下,否则应增加物理内存。

Q2:我用的宝塔面板,操作一样吗?
A:完全一样。宝塔面板基于Linux,SSH命令都通用。你也可以在宝塔后台“文件管理”直接编辑上述脚本,但建议用SSH更稳定。

Q3:不想用脚本,怎么手动扩容?
A:手动步骤:fallocate -l 2G /swapfilechmod 600 /swapfilemkswap /swapfileswapon /swapfile → 写入fstab。但一键脚本更省心。

Q4:如何缩小Swap?
A:先swapoff /swapfile,然后重新创建小一点的文件,再swapon,并更新fstab即可。注意要先停用再删除。

如果你正在被OOM困扰,建议立刻执行文中脚本。
如果遇到特殊环境(如超小内存VPS),可以将脚本中的size_mb$((mem_total/1024))调整为256或512。
更多运维技巧,可参考泽御云的服务器管理系列教程。

分享到:
上一篇
WordPress插件实现AI批量发布外贸文章
下一篇
容器资源限制防止进程抢占内存导致宕机:容器内存限制配置
1
系统公告

机房迁移升级通知

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