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 小时前
MySQL的高可用+MHA
数据库·mysql
差不多的张三3 小时前
【解决方案】powershell自动连接夜神adb端口
数据库·adb
小马哥编程4 小时前
【软考架构】第6章 数据库基本概念
数据库·oracle·架构
自学也学好编程4 小时前
【数据库】PostgreSQL详解:企业级关系型数据库
数据库·postgresql
.Eyes6 小时前
OceanBase 分区裁剪(Partition Pruning)原理解读
数据库·oceanbase
MrZhangBaby7 小时前
SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
数据库
一水鉴天7 小时前
整体设计 之定稿 “凝聚式中心点”原型 --整除:智能合约和DBMS的在表层挂接 能/所 依据的深层套接 之2
数据库·人工智能·智能合约
翔云1234567 小时前
Python 中 SQLAlchemy 和 MySQLdb 的关系
数据库·python·mysql
孙霸天8 小时前
Ubuntu20系统上离线安装MongoDB
数据库·mongodb·ubuntu·备份还原
Java 码农8 小时前
nodejs mongodb基础
数据库·mongodb·node.js