swap分区扩容缓解服务器OOM内存溢出
什么时候需要扩容swap?
当服务器持续出现OOM(Out of Memory)异常,或者关键进程被系统杀死时,很多人第一反应是加物理内存。
但预算有限或无法立即停机时,扩容swap分区可以临时争取缓冲时间。
swap是磁盘上划出的专门区域,当物理内存不足时,系统会把不活跃的内存数据换到swap里,从而释放物理内存给正在运行的程序。
注意:swap只是“救急”,不能替代物理内存,如果swap使用率持续很高,说明内存真的不够了,还是需要加内存或优化程序。
操作前的准备
- 确认当前swap状态:运行
swapon --show或free -h,查看已有swap大小和已用空间。如果swap为0,说明没启用;如果已有但很小,比如只有1GB,考虑扩容。 - 检查磁盘剩余空间:运行
df -h,找一个磁盘空间充足的挂载点(例如/或/home)。如果你是用swap分区而非文件,操作更复杂,本文推荐新手直接创建swap文件,灵活且安全。 - 确保有root权限:以下命令都需要root或sudo。
核心操作:创建并启用swap文件
第一步:创建指定大小的swap文件
/swapfile 是一个常见的路径,大小可以根据物理内存来定,建议物理内存的1~2倍,但不要超过4GB(除非你磁盘和业务完全撑得住)。
例如物理内存2GB,可以设2~4GB。
运行:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
这里 count=2048 表示2GB。bs=1M 是每次写入1MB。
等待几秒到几十秒,文件就创建好了。
第二步:设置安全权限
swap文件包含内存数据,不能让普通用户读取:
sudo chmod 600 /swapfile
第三步:将文件格式化为swap格式
sudo mkswap /swapfile
输出会看到swap的UUID等信息。
第四步:启用swap文件
sudo swapon /swapfile
此时再用 swapon --show 就能看到新swap已生效。
第五步:设置开机自动挂载
编辑 /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
建议追加检查,用 cat /etc/fstab 确认末尾有这行。
避坑与注意事项
- swap文件不要放在太满的分区上:如果磁盘空间使用率超过90%,swap文件可能导致磁盘I/O飙升,反而拖慢系统。建议留至少10%空闲。
- swap大小不是越大越好:过大的swap会让系统频繁换入换出,性能急剧下降,出现“假死”。通常物理内存≤2GB时swap设为倍,内存≥8GB时swap可以设为8GB甚至更小,具体看应用。
- 云服务器特别注意:如果云服务器的系统盘是SSD还好,如果是传统机械盘或共享存储,swap读写可能造成高延迟,需要监控平均负载。
- 旧swap分区卸载:如果你之前有swap分区且不大,可以先用
swapoff /dev/sdX停用再挂载新文件,但注意顺序:先停用旧分区,再启用新文件。 - 永久调整swappiness(可选):控制系统优先使用swap的倾向,数值0~100,默认60。如果想让系统尽量少用swap,可临时设为10:
sudo sysctl vm.swappiness=10
永久修改在 /etc/sysctl.conf 添加 vm.swappiness=10。
验证与常见问题
怎么确认swap已经生效?
运行 free -h,看“Swap”行的total是不是你设置的大小。
也可以用 top 或 htop 查看swap用量。
重启后swap失效?
检查 /etc/fstab 是否写对,行末尾不能有空格,且路径正确。
如果用的是旧分区,开机脚本也可能冲突,建议只保留一种方式。
扩容后还是OOM怎么办?
说明物理内存缺口很大,swap也只能延缓。
你需要考虑升级实例配置、优化程序内存泄漏、或增加Redis等缓存中间件。
如何缩小swap?
先 swapoff /swapfile,然后删掉文件,重新按需要的大小创建即可。
总结
通过扩容swap分区或创建swap文件,你可以低成本、零停机地缓解服务器OOM内存溢出问题。
本文的方法适合所有Linux发行版(CentOS、Ubuntu、Debian等),操作简单,关键是一步一验证。
建议优先采用swap文件方案,灵活且风险低。
如果你在做完扩容后依然频繁遇到OOM,请抓紧排查业务内存使用,这才是根本解决之道。