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 关闭。
相关推荐
pipip.几秒前
Go原生高性能内存网关IMS,比Redis更快
开发语言·redis·golang
元亓亓亓1 小时前
考研408--操作系统--day4--进程同步&互斥&信息量机制
java·数据库·考研·操作系统·408
武子康1 小时前
Java-169 Neo4j CQL 实战速查:字符串/聚合/关系与多跳查询
java·开发语言·数据库·python·sql·nosql·neo4j
现在,此刻2 小时前
高可用与高性能数据库配置实践分析(pgSql && clickhouse)
数据库·clickhouse
谅望者2 小时前
数据分析笔记02:数值方法
大数据·数据库·笔记·数据挖掘·数据分析
dreams_dream2 小时前
django模型数据查询
数据库·django·sqlite
郏国上2 小时前
由于图片视频替换和删除导致阿里云上存在大量系统不再使用的文件如何处理
数据库·mongodb·阿里云
百***27113 小时前
UNION 和 UNION ALL 的区别:深入解析 SQL 中的合并操作
数据库·sql·oracle
修行者Java3 小时前
Redis 核心功能全解析:功能描述、应用场景与 Java 实战
redis
xie_pin_an3 小时前
Redis 核心命令速查表
数据库·redis·缓存