Redis使用Swap会导致性能断崖式下跌,因其将微秒级内存访问降为毫秒/秒级磁盘IO;需通过检查VmSwap、free与redis-cli info定位问题,立即swapoff并调低swappiness止血,再通过禁用Swap、设swappiness=1、内存配额及监控used_memory_ratio根治。

Redis一旦开始使用系统Swap,性能会断崖式下跌——原本微秒级的内存访问被迫变成毫秒甚至秒级的磁盘IO,此时它已基本丧失缓存价值。处理核心就两点:立刻停止Swap使用,并防止它再次触发。
确认Redis是否真的在用Swap
不能只看整体内存使用率,要精准定位Redis进程本身是否被换出:
- 运行 cat /proc/$(pidof redis-server)/status | grep VmSwap,若输出值大于0KB,说明该Redis进程确实在用Swap
- 同时执行 free -h 和 swapon --show,确认Swap分区处于启用状态且有实际使用量
- 补充检查:redis-cli info memory | grep mem_used_human 对比 maxmemory,若已逼近或超限,是触发Swap的高危信号
紧急止血:释放Redis进程的Swap空间
Linux不会自动把已换出的页换回,必须主动干预:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 执行 echo 1 > /proc/sys/vm/swapiness(临时设为最低,抑制新换出)
- 运行 swapoff -a && swapon -a 可强制清空Swap并重载,但会短暂影响其他进程,生产环境慎用
- 更稳妥方式:使用 sudo sysctl vm.drop_caches=3 清理页缓存,再配合内存释放操作,促使系统优先将Redis页换入
- 最终往往需重启Redis实例才能彻底清除Swap残留,务必配合主从切换完成平滑过渡
根治预防:从配置与部署层面堵死Swap路径
靠事后抢救不如提前设防:
- 在Redis服务器上永久关闭Swap:sudo swapoff -a 并注释 /etc/fstab 中Swap行,避免重启生效
- 设置 vm.swappiness=1(而非0),既保留系统极端情况下的保底能力,又极大降低Redis被换出概率
- 为Redis分配专用内存配额,通过 cgroups v2 或 systemd MemoryMax 限制其最大可用内存,防止它吃光系统内存连累Swap启动
- 监控必须覆盖两项硬指标:主机 SwapUsed 和 Redis used_memory_ratio(used_memory / maxmemory),任一接近阈值立即告警
Swap不是Redis的备用内存,而是性能死刑执行令。发现即停、查因即改、常态监控,三步闭环缺一不可。

















