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 -h和swapon --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 /swapfile → chmod 600 /swapfile → mkswap /swapfile → swapon /swapfile → 写入fstab。但一键脚本更省心。
Q4:如何缩小Swap?
A:先swapoff /swapfile,然后重新创建小一点的文件,再swapon,并更新fstab即可。注意要先停用再删除。
如果你正在被OOM困扰,建议立刻执行文中脚本。
如果遇到特殊环境(如超小内存VPS),可以将脚本中的size_mb$((mem_total/1024))调整为256或512。
更多运维技巧,可参考泽御云的服务器管理系列教程。