swap 频繁交换说明什么
发布时间:2025-10-22 19:19       
更新时间:2025-10-23 01:39
一句话结论:swap 被频繁读写,基本可以断定物理内存不够用了,剩下的工作是找出谁在吃内存,再决定加内存还是修泄漏。
为什么 swap 频繁交换是坏事?
swap(交换分区)是把不活跃的内存页挪到磁盘的机制,被使用不代表一定有问题,关键看频率和量级。偶发的换入换出不算大事,频繁交换意味着活跃内存被挤到磁盘上,每次读写都比内存慢几个数量级,表现为整机卡顿、接口延迟出现毛刺,越忙越慢。有人建议把 swappiness 调到很低,那只是推迟交换,内存不足的本质没变。
怎么观察?
vmstat 1 看 si(每秒换入)和 so(每秒换出)两列,每秒持续几百 KB 到几 MB 的量级,就是在真交换;free -h 看 swap 已用量的涨势;sar -W 可以回看历史换页统计,确认问题从什么时候开始。观察要拉长到分钟级再下结论,一两秒的样本没有代表性,至少跨过一次业务高峰。观察时顺手记下触发的时间段,和备份、报表等计划任务对照。
先查泄漏还是先加内存?
先查。ps aux --sort=-rss | head 看谁的常驻内存最大;某进程 RSS 只涨不跌、明显超出历史水位,先怀疑泄漏,用 pmap -x PID 看内存构成,定位到模块再谈重启。查泄漏时把内存涨势和业务量曲线放一起看,业务没涨内存涨,嫌疑就大了。临时缓解可以先收紧应用的缓存上限,不少框架的缓存默认不限大小。反过来,各进程内存都在合理范围、业务量确实在涨,那就是容量问题,直接扩内存。
怎么预防?
给数据库这类大户单独设内存上限,缓存容量写进配置而不是放任自流;监控里给"swap 已用比例"加一条告警,触发即排查。云主机内存升配几分钟就能完成,比反复杀进程的代价小得多。
内存问题的答案几乎总在监控曲线里,swap 告警值得和 CPU 告警一样被认真对待。