首页/数据/Redis 进阶速查/swap 与 Redis:延迟的头号隐患
内存与管理99 条

swap 与 Redis:延迟的头号隐患

Redis 内存被换出到 swap 后访问延迟从微秒级恶化到毫秒级;生产环境通常建议关闭 swap 或把 vm.swappiness 调到很低。

Redis 进阶速查数据更新于 2026-10-13

swap 为什么是延迟隐患

当 Redis 使用的内存页被换出到 swap,再次访问这些页会触发磁盘读取,延迟从微秒级跳到毫秒级甚至更高,表现为少数命令的偶发尖刺,而 CPU 与 QPS 曲线看上去一切正常。生产上的常见做法是关闭 swap,或把 vm.swappiness 调到很低(如 1),让内核尽量不换出匿名内存页。

基本信息

系统参数vm.swappiness,调低到 1,或整体关闭 swap
判断信号used_memory_rss 明显低于 used_memory
监控项系统 swap 使用量、si 与 so 换入换出速率
常见诱因内存超卖、容器没有内存上限、实例内存大于物理内存
取舍宁可暴露容量不足,也不要不可预测的毫秒级延迟

信号与判读

信号查看位置判读结论
swap 已用量持续增长系统监控或 free -m内存压力真实存在,随时可能被换出
si 与 so 持续非零vmstat换入换出正在发生,延迟风险高
rss 远低于 used_memoryINFO memory可能被换出,或内存被内核回收
出现 OOM 记录系统日志与 dmesg换出没能避免内存不足,需要补容量

检查与调整

检查与调整
free -m                                 # 看 swap 总量与已用量
vmstat 1 5                              # si 与 so 持续非零说明正在换入换出
cat /proc/sys/vm/swappiness
sysctl -w vm.swappiness=1               # 临时调低,持久化需写入 sysctl 配置
redis-cli INFO memory | grep -E 'used_memory_human|used_memory_rss_human'
swapoff -a                              # 谨慎:先确认物理内存充足,否则会触发 OOM

典型使用场景

  • 延迟尖刺排查:CPU 与 QPS 正常但零星命令变慢时优先怀疑换页
  • 云主机与容器环境:内存可能被超卖,必须检查节点级 swap
  • 大实例部署:内存接近物理上限时,swap 风险显著上升
  • 内核参数基线:新机器上线时统一设置 swappiness
  • 巡检项设计:把 swap 使用量与换出速率纳入监控
容器环境下 swap 由节点内核与容器运行时共同决定,只看容器内 free 可能看不全,需要同时检查节点级 swap 使用与内存回收压力。
关闭 swap 并不解决容量缺口,只是把风险从不可预测的毫秒延迟换成可能被内核直接杀掉;执行 swapoff 前必须确认物理内存余量足够。

易错点

  • 内存超卖环境里 Redis 被换出,延迟尖刺被误判成 Redis 自身故障
  • 只关 swap 不补容量,压力转为被 OOM 杀掉,故障表现更直接
  • 执行 swapoff 前没确认物理内存余量,直接触发 OOM
  • 只看 used_memory 不看 used_memory_rss,判断不出被换出的情况
  • 容器环境只检查容器内 swap,忽略节点级内存回收压力

数据来源与参考

  • Redis 官方文档:虚拟内存与延迟说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌