服务器swap亮红灯,核心原因是内存压力过大导致系统频繁使用交换分区,性能急剧下降,通常由物理内存不足、内存泄漏或配置不当引发。
为什么swap会亮红灯:先搞清楚它在报警什么
服务器上的swap分区相当于内存的“后备仓库”,当物理内存不够用时,系统会把暂时不用的数据挪到磁盘上的swap区域,腾出空间给活跃进程,swap亮红灯,意味着这个后备仓库已经被大量占用,甚至接近满载,行业共识认为,swap使用率持续超过70%就该警惕,超过90%则属于严重状态。
第一种常见场景:你跑着一个Java应用或MySQL数据库,业务高峰期并发量上来,内存瞬间被打满,系统开始疯狂读写swap,这时候CPU的iowait会飙升,应用响应变慢,用户端感觉到卡顿甚至超时,你登录服务器执行free -h,看到swap这行used数值很高,free几乎见底。
第二种常见场景:服务器上跑着几十个容器或虚拟机,每个都申请了固定内存,但实际使用率并不高,由于宿主机没有设置合理的内存限制,某些进程悄悄吃掉大量内存,触发OOM killer前先让swap扛压,这种“隐形内存黑洞”比单纯物理内存不足更难排查。
第三种常见场景:应用存在内存泄漏,比如PHP-FPM进程未释放内存、Python服务有循环引用、Node.js的buffer未清理,随着运行时间增长,内存占用持续上升,直到把swap填满,这类问题通常有周期性,比如每天固定时间swap占用开始爬升,重启进程后恢复。
swap亮红灯的直接后果:不只是慢,还可能崩
很多人以为swap用满只是性能下降,实际上危险程度远超想象。
当swap完全占满,新的内存分配请求无法满足,内核会启动OOM Killer机制,随机杀掉占用内存高的进程,这意味着你的数据库、Web服务、消息队列都可能被强制终止,数据未落盘的部分会丢失,业务直接中断。
具体表现包括:
- 磁盘I/O持续高位,
iostat显示%util接近100%,因为swap读写本质是磁盘操作,劣化严重 - 应用日志频繁出现
OutOfMemoryError或Cannot allocate memory - 远程SSH连接变慢,敲命令响应延迟好几秒,因为系统调度也被拖累
- 监控系统发出内存和swap双重告警,有时伴随磁盘空间告警(swap分区位于磁盘上)
在物理服务器场景下,swap频繁读写会加速磁盘磨损,如果用的是机械硬盘,随机读写性能本来就不如SSD,swap问题会放大十倍以上,如果用的是云服务器,云厂商的监控平台也会因为swap高占用推送告警邮件。

如何定位swap红警源头:从现象到根因
拿到一台swap亮红灯的服务器,不要急着重启或清swap,先按下面的步骤做排查,这属于实操环节,每一步都有明确输出。
第一步,查看当前内存和swap概览
执行free -h,输出中有三行:Mem、Swap、Buffers/cache,重点看Swap行的used和available,以及Mem行的available,如果Mem的available已经很低,说明物理内存确实不够。
第二步,找出占用内存的Top进程
执行top -o %MEM,按内存占用率排序,记下前10个进程的名字、PID、RES和%MEM,RES是实际驻留内存,单位通常是KB或GB,也可以用ps aux --sort=-%mem | head -20看更详细的命令路径。
第三步,判断swap被谁占用
这步很多人容易忽略,swap使用率不等于某个进程的swap使用量,但你可以通过/proc文件系统查看单个进程的swap占用,执行for f in /proc//status; do awk '/VmSwap/{swap=$2} /Name/{name=$2} END{print swap, name}' $f; done | sort -nr | head -10,输出格式是“swap占用KB 进程名”,这个命令能直接揪出哪个进程把swap吃满了。
第四步,检查系统日志
执行dmesg -T | grep -i oom或journalctl -k --since "1 hour ago" | grep -i oom,看内核有没有触发OOM记录,日志中会列出被杀进程的PID和内存使用情况。
第五步,确认是否是内存泄漏
对可疑进程,观察其RSS(Resident Set Size)是否随时间线性增长,执行ps -o pid,rss,vsz,cmd -p [PID],每隔10分钟执行一次,记录数值,如果RSS持续上升且不回落,基本可判定泄漏,对于Java应用,可以用jstat -gcutil [PID] 1000观察GC情况,如果Full GC频繁且老年代不回收,说明堆外内存或对象泄漏。
如果你的服务器环境是KVM或VMware虚机,还要查看宿主机层面的内存超配情况,虚机内看到的内存不足,有时是因为宿主机的内存页被回收或balloon驱动收回。
解决swap亮红灯的四种处置方案
根据定位结果,选择对应的处理策略,不做诊断直接清swap是治标不治本,下次还会复发。

临时缓解手动释放swap
如果确认物理内存还有富余(Mem的available大于swap使用量),可以主动把swap数据导回内存,执行swapoff -a,系统会尝试将swap中的内容迁移到物理内存,期间I/O会短暂升高,迁移完成后执行swapon -a重新启用swap,这一步操作有风险,如果内存确实不够,swapoff会触发OOM,所以执行前用free -h确认内存余量。
扩容物理内存或调整业务内存配置
多数情况下,根本原因是分配给当前业务的内存不够,两条路:一是升级服务器内存规格,云服务器直接在控制台调整配置,物理服务器需要插内存条;二是优化业务内存参数,比如MySQL的innodb_buffer_pool_size,行业惯例设置为物理内存的60%-70%,如果服务器总内存32GB而你设了24GB,再叠加其他进程,swap必定报警,调成20GB或16GB能有效降低swap压力,Java应用调整-Xmx和-Xms,保持一致,避免堆动态扩展引起波动。
排查并修复内存泄漏
针对泄漏进程,优先考虑重启服务临时恢复,再寻找根因,代码层面逐个检查长期存活的集合类、缓存、全局变量,对于PHP-FPM,设置合理的pm.max_requests值,让进程处理一定请求数后自动退出重建,对于Node.js,检查是否有全局监听器未移除,对于Java,用heap dump分析工具定位泄漏对象,这个属于进阶运维范畴,可以在业务低峰期操作。
调整swap策略和内核参数
如果业务允许,可以降低系统对swap的依赖,修改/etc/sysctl.conf,设置vm.swappiness=10,表示仅在内存使用超过90%时才启用swap,执行sysctl -p生效,这个参数在数据库服务器上尤其重要,行业共识建议数据库场景设置0-10,避免数据库缓冲池被换出,日常应用服务器可设置为10-20。
也可以使用vm.min_free_kbytes参数,保留一定比例的物理内存给内核分配,避免突发内存分配导致swap抖动,设置值根据内存大小调整,一般物理内存在32GB以上时设为524288(512MB)。
swap亮红灯的预防措施:从架构层面规避
与其等报警再救火,不如提前做设计,以下是几条经过验证的实践路径。
- 监控预警前置:部署Prometheus + Grafana或使用云厂商监控服务,设置swap使用率的告警阈值,建议60%就通知运维,预留处理时间,不要等到亮红灯才看到。
- 合理划分业务内存:在容器编排平台(Kubernetes)中为每个Pod设置
requests和limits内存,避免单个服务无限制吞噬宿主机内存,K8s的OOMKilled状态比宿主机swap红警更容易处理。 - 定期压测和容量规划:在业务上线前用JMeter或LoadRunner做全链路压测,观察内存增长曲线,预估峰值内存占用,给服务器留出30%-40%的内存冗余。
- 启用内存回收机制:Redis开启
maxmemory-policy allkeys-lru,防止缓存数据无限增长,消息队列如Kafka调优log.segment.bytes和log.retention.bytes,控制磁盘和内存的平衡。

如果你经常遇到swap红警,且业务属于内存密集型,建议考虑使用云厂商的内存型实例,这类实例的CPU和内存配比更适合大缓存场景,出问题的概率更低。
服务器swap亮红灯常见疑问解答
Q:swap亮红灯会直接导致服务器死机吗?
不会直接死机,但会导致系统进入严重性能退化状态,内核通过OOM Killer杀进程后,服务可能大面积中断,表现为“假死”,如果磁盘I/O长时间100%且无法恢复,最终可能触发硬件看门狗重启系统。
Q:为什么清完swap后过几天又红了?
说明源头问题没有解决,可能是物理内存确实不足,某个业务内存占用持续增长,或监控阈值设置不合理,建议重新执行top和ps排序命令,找出那几天内存增长最快的进程,多数情况下是重启过的服务没做内存限制,或者负载均衡把全部流量都导到了这台机器。
Q:调整swappiness到0是不是就永远不会用swap?
不是。vm.swappiness=0只表示内核尽量不使用swap,但在极端内存压力下,内核仍然会交换内存页,这个参数控制的是“倾向性”而非“禁用开关”,真正的场景中,将swappiness调低可以减少swap使用频率,但不能完全避免。
swap红警的处置核心永远是:先定位占用者,再判断是容量问题还是代码问题,最后对应扩容或修复,看完这篇文章,下次监控系统再弹swap红色告警,你至少有了一份清晰的排查清单。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/820130.html


评论列表(4条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于执行的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@萌蜜4438:读了这篇文章,我深有感触。作者对执行的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于执行的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对执行的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!