swap分区扩容缓解服务器频繁OOM内存溢出
当你发现服务器频繁报出“Out of memory”错误,甚至关键进程被系统强制杀死(OOM Killer),很可能是物理内存不足,而swap分区太小或未配置。swap分区(交换分区)本质是磁盘空间模拟出的内存,虽然速度远不及物理内存,但能有效防止因内存耗尽导致的进程崩溃。
这篇文章会带你从零开始扩容swap分区,让服务器喘口气。
动手前先看这两点
扩容前需要确认两件事:当前swap用量和可用磁盘空间。
执行以下命令检查当前swap状态:
swapon --show
free -h
如果swapon --show没有输出,说明没有启用任何swap。
接着用df -h查看根目录或你想存放swap文件的目录是否有足够空闲磁盘。
一般建议swap大小为物理内存的1-2倍,但如果磁盘紧张,至少能划出1-2GB来应急。
创建并启用新的swap文件(最快方法)
如果你没有独立swap分区,创建swap文件是最灵活的方式。
以下步骤使用fallocate快速分配一个2GB的交换文件,你也可以根据需要调整大小。
- 创建交换文件(以2GB为例):
sudo fallocate -l 2G /swapfile
如果系统不支持fallocate,可以用dd命令替代:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
- 设置正确的权限(只有root可读写):
sudo chmod 600 /swapfile
- 将文件格式化为swap格式:
sudo mkswap /swapfile
- 激活这个swap文件:
sudo swapon /swapfile
- 检查是否生效:
swapon --show
free -h
如果看到刚才的/swapfile出现在列表中,说明扩容成功。
开机自动挂载(避免重启后失效)
修改/etc/fstab文件,让系统每次启动自动加载swap文件。
用文本编辑器打开该文件:
sudo nano /etc/fstab
在文件末尾添加一行:
/swapfile none swap sw 0 0
保存退出。
这样重启后swap依然生效。
常见避坑点
- 不要使用磁盘空间不足的目录:如果根目录容量紧张,可以考虑在数据盘目录下创建swap文件,但注意性能差异。
- swap文件大小不宜过大:一般不超过物理内存的2倍,超过8GB会造成磁盘IO过度。如果物理内存已很大(比如32GB),扩展swap意义不大,建议排查应用内存泄漏。
- 优先级设置:如果有多个swap来源(比如既有分区又有文件),可以通过
swapon -p设置优先级,值越高优先使用。 - OOM问题可能不是swap能完全解决:swap只是临时缓解,如果应用程序持续消耗大量内存,仍需优化代码或增加物理内存。
验证扩容效果
执行free -h查看swap total是否为你设置的大小。
你还可以手动触发一次内存压力测试(仅测试环境):
sudo stress --vm 2 --vm-bytes 2G --vm-hang 5
观察htop或free,看swap使用量是否上升,系统是否有OOM报错。
如果没有报错,说明扩容生效。
线上环境不建议运行压力测试,请直接观察业务运行情况。
如果遇到“swapon failed: Operation not permitted”,请检查是否以root用户执行,或确认SELinux是否拦截。临时关SELinux测试:sudo setenforce 0,如果恢复正常,需要为swap文件添加安全上下文。
至此,你已经成功为服务器扩容了swap分区,OOM Killer应该不会再频繁叫醒你了。
如果问题依然存在,建议结合dmesg | tail -20查看具体是哪个进程引起的内存溢出,从应用层面做进一步优化。