服务器swap分区扩容缓解OOM
什么情况下需要给服务器扩容Swap?
当系统物理内存(RAM)不足时,Linux内核会触发OOM killer(Out-Of-Memory Killer),随机杀掉进程来释放内存。
这种情况在运行数据库、Java应用或高并发网站时尤其常见。Swap(交换分区或交换文件) 就是硬盘上的一块空间,被当作“虚拟内存”使用。
扩容Swap能让系统在内存吃紧时把不活跃的数据挪到硬盘,降低OOM发生的概率。
操作前先确认这几件事
- 检查当前Swap大小:
free -h
swapon --show
如果Swap显示为0或者远小于内存(推荐Swap至少等于内存的50%到100%),就需要扩容。
- 确认磁盘空闲空间:
df -h
找一个剩余空间较大的分区(比如 / 或 /home),我们将在这个分区下创建Swap文件。
- 备份重要数据:虽然创建Swap文件风险很低,但建议提前备份
/etc/fstab文件:
cp /etc/fstab /etc/fstab.bak
扩容Swap的完整步骤(文件方式)
以下操作在CentOS 7/8、Ubuntu 20.04+/Debian 11上均测试通过。
第一步:创建指定大小的Swap文件
例如要增加4GB Swap,执行:
dd if=/dev/zero of=/swapfile bs=1M count=4096
if=/dev/zero表示从空设备读取。of=/swapfile表示目标文件路径(可以换成其他位置,如/data/swapfile)。bs=1M count=4096表示总大小4GB(4096个1MB块)。
第二步:设置文件权限
Swap文件必须只有root可读写,否则系统会拒绝使用:
chmod 600 /swapfile
第三步:将文件格式化为交换空间
mkswap /swapfile
第四步:激活Swap文件
swapon /swapfile
此时用 free -h 或 swapon --show 应该能看到新的Swap大小。
第五步:永久启用(开机自动挂载)
编辑 /etc/fstab 文件,在末尾添加一行:
echo '/swapfile none swap sw 0 0' >> /etc/fstab
注意:如果Swap文件路径不是 /swapfile,请替换为实际路径。
必须注意的几个坑
- 不要使用Btrfs、ZFS、NFS等文件系统:这些文件系统对Swap支持不好,建议使用ext4或xfs。可以用
df -T /swapfile查看所在分区文件系统类型。 - Swap文件不能放在LVM条带化卷或RAID0上:否则可能造成性能问题。普通单盘或RAID1都可以。
- Swap大小不宜过大:一般建议不超过物理内存的2倍,过大的Swap反而会让系统频繁换页,拖慢响应。
- 如果系统内存严重不足,直接调
vm.swappiness:
sysctl vm.swappiness=10
echo 'vm.swappiness=10' >> /etc/sysctl.conf
值越小越不倾向使用Swap(默认60),但对于OOM发起的场景,调低反而能减少Swap占用。
验证扩容是否生效
- 查看当前Swap总量和使用量:
free -h
- 检查所有已激活的Swap源:
swapon --show
- 模拟内存压力(谨慎使用,仅用于测试):
stress --vm 2 --vm-bytes 2G --timeout 30s
观察 free -h 中Swap使用量的变化,并注意没有进程被OOM杀掉。
高频问题解答
Q:扩容Swap后系统变卡了怎么办?
A:可能是swappiness值过高,按上面方法调低到10-20,重启后生效。
Q:我想删除旧的Swap分区,怎么操作?
A:先 swapoff /dev/旧分区,然后从 /etc/fstab 中删除对应行,最后用 fdisk 或 parted 删除分区。
Q:可以用Swap分区而不是文件吗?
A:可以,但分区扩容不如文件灵活。文件方式适合大多数场景,且无需额外分区操作。
如果你正在处理服务器Swap分区扩容缓解OOM的问题,建议先按本文步骤完整执行,再根据自己的环境微调swappiness或Swap大小;
遇到异常时优先回看避坑和高频问题部分。