swap分区一键扩容脚本缓解服务器频繁OOM报错
服务器跑着跑着突然出现 OOM(Out Of Memory)报错,服务直接挂掉,对新手来说非常棘手。
除了升级物理内存,扩容 swap 分区 是最快的替代方案。
本文提供一个一键扩容脚本,只需复制粘贴执行,就能自动完成 swap 文件创建、挂载和生效,全程无需手动计算参数,特别适合零基础运维。
检查当前 swap 状态
在跑脚本之前,先确认服务器当前 swap 情况。
登录服务器执行:
free -h | grep -i swap
如果显示 total 为 0 或很小(比如 1G 以下),就说明 swap 容量不足。
同时用 df -h / 查看根分区剩余磁盘空间,最好有 5G 以上空闲 用于新建 swap 文件。
一键扩容脚本(直接复制即可)
创建一个脚本文件 expand_swap.sh,输入以下内容:
#!/bin/bash
# swap 一键扩容脚本,默认扩容 2G,可按需修改 SIZE
SIZE=2G
SWAPFILE=/swapfile2
# 检查是否已有 swap 文件(避免重复创建)
if [ -f $SWAPFILE ]; then
echo "⚠️ $SWAPFILE 已存在,请先移除或改用其他文件名"
exit 1
fi
# 创建指定大小的 swap 文件
fallocate -l $SIZE $SWAPFILE
chmod 600 $SWAPFILE
mkswap $SWAPFILE
swapon $SWAPFILE
# 永久生效:写入 /etc/fstab
grep -q "$SWAPFILE swap swap defaults 0 0" /etc/fstab || echo "$SWAPFILE swap swap defaults 0 0" >> /etc/fstab
echo "✅ swap 已扩容,当前大小:"
free -h | grep Swap
说明:SIZE变量可以按需改为4G、8G等;SWAPFILE路径可更换,但建议放在根目录。
赋予执行权限并运行:
chmod +x expand_swap.sh
sudo bash expand_swap.sh
如果看到 ✅ swap 已扩容,当前大小:Swap: 2.0G … 就表示成功了。
避坑指南(新手必看)
- 不要用 dd 命令创建文件:老旧教程用
dd if=/dev/zero …,性能差且可能卡住 IO。推荐使用fallocate(如果系统支持)。 - swap 文件不要放在 SSD 上作为主要补丁:频繁写入 swap 会加速 SSD 磨损,仅作临时救急。长期 OOM 还是建议加物理内存或优化应用。
- 大小不能超过磁盘空闲:比如磁盘只剩 3G,你却设
SIZE=4G会报错 fallocate 失败,此时删减到可接受范围。 - 多版本 swap 文件冲突:如果之前已有一个 swapfile(如
/swapfile),脚本新建/swapfile2会新增一个 swap 分区,不会覆盖旧的。可以通过swapon --show查看全部启用中的 swap。 - 需要 root 权限:所有命令都要
sudo或以 root 身份执行。
效果验证与后续建议
执行完脚本后,用 free -h 看 Swap 行,使用量如果从 0 变为部分占用,说明系统已经开始利用 swap。
可以重启占用内存的服务(如 MySQL、Nginx)观察 OOM 日志是否消失。
验证 OOM 是否彻底缓解,建议临时开启 oom_score_adj 调整优先级,或者将关键进程设为不可被 OOM Killer 杀死(需谨慎)。
但更根本的做法是:利用监控工具(如 htop、nmon)找出内存占用异常的进程,针对性优化代码或配置。
常见问题(FAQ)
Q:扩容后需要重启服务器吗?
A:不需要,swapon 命令即时生效,无需重启。重启后 /etc/fstab 也会自动挂载。
Q:我想扩容 8G,但磁盘只剩 6G 怎么办?
A:可以分两步:先删除不用的日志或临时文件腾出空间,再减小 SIZE 到 4G 或 6G,确保不爆盘。
Q:swap 扩容会影响性能吗?
A:swap 本质是硬盘模拟内存,速度远慢于 RAM。大量使用 swap 会导致系统变慢,但只要不频繁读写,作为应急手段是完全可接受的。
如果你已经跑完脚本,建议继续排查 dmesg | grep -i oom 确认是否还有内存溢出的残留错误。
把 swap 扩容当作短期缓解方案,长期仍需升级物理内存或优化业务。