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 关闭。
相关推荐
岳麓丹枫0017 小时前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
陌上丨13 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_567813 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw13 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307313 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道14 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据15 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务15 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
时艰.16 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
Goat恶霸詹姆斯16 小时前
mysql常用语句
数据库·mysql·oracle