很多Linux服务器的故障是从一句 Cannot allocate memory 开始的。物理内存不足时,Linux会使用磁盘上的Swap交换空间来暂存不活跃的内存页,给系统争取喘息时间。可如果Swap本身容量偏小甚至没有配置,系统就可能直接触发OOM Killer,随机杀掉进程,造成数据库中断、网站504这类严重事故。本文说说Swap现状如何查看、不够用时怎么扩容,以及swappiness参数该怎么调。

先确认当前的Swap使用情况
用下面几条命令可以快速了解内存与Swap的现状:
free -h
swapon --show
cat /proc/swaps
free -h 里的 Swap 一行能看出总容量与已用量。如果 Swap 总量为0,说明系统没有配置交换空间;如果已用比例长期很高,则说明物理内存持续吃紧。
用swap文件扩容:不需要重装系统
在运行中的服务器上给Swap扩容,最稳妥的方式是新增一个swap文件,而不是去动原有分区。以增加4G Swap为例:
# 1. 创建4G的交换文件
fallocate -l 4G /swapfile # 若提示不支持,改用 dd if=/dev/zero of=/swapfile bs=1M count=4096
# 2. 设置权限并格式化为swap
chmod 600 /swapfile
mkswap /swapfile
# 3. 启用
swapon /swapfile
# 4. 写入 /etc/fstab 实现开机自动挂载
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 5. 验证
swapon --show
需要提醒:云服务器使用系统盘时,swap文件会占用系统盘空间,容量过大会挤占数据空间,建议根据业务合理规划;部分云厂商也支持在控制台单独配置swap或直接扩容内存,可以对比成本后选择。
swap使用率长期过高说明什么
Swap本身不是性能指标,它的使用率反映的是内存压力。Swap使用率长期偏高,说明物理内存已经不够业务使用,这时频繁的换入换出(swapping)会让磁盘成为瓶颈,服务器表现为负载不高但响应缓慢。单纯加大Swap只是延缓问题,根本出路仍是增加内存或优化程序的内存占用。
swappiness参数怎么调
swappiness(默认60)控制内核倾向于使用Swap的程度,取值范围0~100。数值越大越积极使用Swap,越小越倾向于保留在物理内存。对延迟敏感的应用(如数据库、缓存服务),可以适当调低,让热数据尽量留在内存:
# 临时调整(重启失效)
sysctl vm.swappiness=10
# 永久调整
cat >> /etc/sysctl.conf <<'EOF'
vm.swappiness = 10
EOF
sysctl -p
不过要客观看待:把swappiness调成0并不等于禁止Swap,只是降低使用倾向,内存仍然不足时系统照样会交换。调参前建议先用 top、free 观察一段时间,确认瓶颈确实在内存,再决定是否需要调整。
相关问答FAQs
- 问:swap文件可以随时删除吗?答:先执行 swapoff /swapfile 停用,再删除文件并清理/etc/fstab里的对应行,直接删正在使用的swap文件可能引发问题。
- 问:swap分区和swap文件哪种好?答:物理机使用独立分区便于管理,云服务器上用swap文件更灵活,两者性能差异对多数业务并不明显。
- 问:服务器老是被OOM杀进程怎么办?答:优先排查是否有内存泄漏或缓存失控,可临时加大Swap应急,并考虑为关键服务配置systemd的OOMScoreAdjust或数据库的内存限额。
总的来说,Swap的正确用法是当应急缓冲而不是当内存用。日常把内存监控做好,在物理内存使用率持续高位时提前扩容或优化,再配合合理的swappiness设置,才能让服务器在流量波动时保持稳定,而不是等到OOM杀进程了才去救火。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!