Redis 延迟排查全攻略

1、一张表:10 秒自检清单

排查项 快速行动
慢命令 打开 SLOWLOG get,禁止在生产跑 KEYS/FLUSH* 等 O(N) 指令
实例类型 EC2 请换 HVM (如 m5.*),KVM/LXC 一般 OK
THP echo never > /sys/kernel/mm/transparent_hugepage/enabled
内核基线 redis-cli --intrinsic-latency 100 (在服务器本机跑)
Latency Monitor CONFIG SET latency-monitor-threshold 100
持久化策略 按可靠性→性能排序 ① AOF+fsync always ② AOF+everysec ③ AOF+everysec+no-appendfsync-on-rewrite ④ AOF+fsync never ⑤ 纯 RDB (看 save 点)

2、延迟到底怎么量?

bash 复制代码
# 实时查看命令往返延迟
redis-cli -h <host> -p <port> --latency
  • 默认周期性打印 P50/P95/max。
  • 另有混合视图:--latency-dist

内置延迟监控

bash 复制代码
# 1ms 以上事件记录
CONFIG SET latency-monitor-threshold 1000
LATENCY DOCTOR       # 人类可读分析
LATENCY GRAPH event  # ASCII 折线图

3、Intrinsic Latency:先测宿主机底线

bash 复制代码
redis-cli --intrinsic-latency 100   # 100 秒
  • 物理机:常见 < 0.2 ms
  • Xen/KVM 低配虚机:可见 5~40 ms
  • 这是 系统能给的最好延迟,Redis 不可能突破它。

4、网络往返 & Pipeline 优化

建议 说明
长连接 避免频繁 connect/close
Unix Domain Socket Client 与 Server 同机
Pipeline / MGET 多命令合并,减少 RTT
Server & Client 绑核 NUMA/CPU cache locality

5、单线程 + 慢命令

Redis 主线程一次只能执行 一个命令,遇到 O(N) 指令就会阻塞其它请求。

高危指令 Top List

类型 指令
全 Key 空间 KEYS, SCAN 大范围、FLUSHALL
集合运算 SUNION, SMEMBERS, ZRANGE ... WITHSCORES
列表裁剪 LREM, SORTLIMIT

排查SLOWLOG get 20 看执行时间;或开启 CONFIG SET slowlog-log-slower-than

方案

  1. 改写业务逻辑避免大集合。
  2. 读副本跑慢查询。

6、fork、THP 与虚机

6.1 BGSAVE/BGREWRITEAOF 的 fork 开销

场景 复制 Page Table (ms/GB)
物理机 (Xeon) ~10 ms
EC2 HVM m5.large ~10 ms
旧型 EC2 Xen 200+ ms
Linode Xen 400+ ms

应对

  • 选新一代 HVM 实例或物理机
  • 不要在同机运行 IO 密集服务

6.2 Transparent Huge Pages

复制代码
echo never > /sys/kernel/mm/transparent_hugepage/enabled

避免写时复制放大、CPU stall。

7、Swap & 内存压力

bash 复制代码
# 查看进程 swap 用量
grep -i swap /proc/`pidof redis-server`/smaps | awk '{s+=$2} END {print s/256 " MB"}'

# 监控 Swap 活动
vmstat 1      # 看 si/so 列
  • 大量 swap ⇒ 必有 延迟尖刺。
  • 解决:加内存 / 降低 maxmemory / 关闭 Linux swappiness。

8、 AOF fsync 策略三兄弟

配置 可靠性 延迟风险
appendfsync always 最安全 高,fsync 每次
everysec (默认) 丢 ≤1 s 数据 中,fsync 后台线程
no 依赖 OS flush 最低,但可能丢分钟级

观察
INFO persistenceaof_current_fsync_offsetaof_last_write_latency_ms
strace -fp $(pidof redis-server) -e trace=fdatasync -T 看卡在哪。

9、大批量过期键也会卡住主线程

  • Redis 每 100 ms 随机抽 20 个带过期键。
  • 如抽样 >25% 已过期 ⇒ 循环 清理直到 <25%。
  • 若你的应用把 上百万键设在同一秒过期,就会卡。

优化

  • 过期时间做随机抖动。
  • 使用 UNLINK 异步删除 (4.0+)。

10、软件看门狗:最后的「核武器」

bash 复制代码
CONFIG SET watchdog-period 500   # 500ms 卡顿即打栈
  • 遇到超过阈值的阻塞会在日志打印 C 栈 + 寄存器。
  • 仅用于线上难以复现的莫名卡顿,完事记得 watchdog-period 0 关闭。
相关推荐
熙客3 分钟前
Redis底层数据结构与内部实现
数据库·redis·mybatis
坤小满学Java42 分钟前
【郑州轻工业大学|数据库】数据库课设-酒店管理系统
数据库·mysql·课程设计
DQI-king1 小时前
ZYNQ学习记录FPGA(五)高频信号中的亚稳态问题
数据库
Yrrr12 小时前
Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)
数据库·redis·面试·职场和发展
知月玄2 小时前
网页后端开发(基础5--JDBC VS Mybatis)
数据库·mysql
怪只怪满眼尽是人间烟火3 小时前
SQL分片工具类
网络·数据库·sql
国际云3 小时前
腾讯云搭建web服务器的方法
服务器·数据库·云计算·区块链
袋鼠云数栈3 小时前
AI Infra 运维实践:DeepSeek 部署运维中的软硬结合
大数据·运维·数据库·数据中台·数栈
苏格拉没有底_coder3 小时前
【Redis】Sentinel哨兵
redis·sentinel
云和恩墨5 小时前
国网某省电力借zDBM重构数据库容灾防线,400TB核心资产迈入分布式实时保护时代
数据库·分布式·重构