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 关闭。
相关推荐
神王宝宝 王者小学5 小时前
HBase: 看上去很美
大数据·数据库·hbase
io无心5 小时前
Shardingsphere5分库分表
数据库·mysql
wWYy.6 小时前
Mysql:主键索引 唯一索引 普通索引 前缀索引
数据库·mysql
宝杰X76 小时前
Android Room3 多平台数据库
android·数据库
sky_81061310 小时前
Oracle ERP 各模块业务管理功能及底层表说明
数据库·oracle
YMatrix 官方技术社区11 小时前
CittaBase vs. Neo4j :原生图性能实测与混合检索实践
数据库·功能测试·ymatrix
闲猫12 小时前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
xqqxqxxq12 小时前
SQL 连接查询技术笔记
数据库·笔记·sql
消失的旧时光-194312 小时前
第六篇:Redis Hash——一个用户对象应该保存成 JSON,还是保存成 Hash?
redis·json·哈希算法
Databend12 小时前
从万亿级大模型到全线应用:Databend Cloud 助力头部 AI 企业构建全链路 Trace 数据管道
大数据·数据库·sql