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_memory | INFO 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 前必须确认物理内存余量足够。