文章背景图

Redis 延迟突然升高:慢命令、BigKey、阻塞与系统抖动排查

2026-08-09
1
-
- 分钟

Redis 平时响应在毫秒以内,生产环境突然延迟升高时,可能是慢命令、BigKey、持久化、内存回收、网络或宿主机抖动。重启虽然可能暂时恢复,但会丢失最有价值的现场证据。

一、确认影响和延迟位置

先区分是客户端到 Redis 的网络延迟,还是 Redis 服务端处理变慢:

redis-cli -h <host> -p <port> PING
redis-cli -h <host> -p <port> --latency
redis-cli -h <host> -p <port> --latency-history

在 Redis 主机本地执行同样测试进行对比。远端慢、本地快,多半是网络、代理或连接池;本地也慢,则继续检查 Redis 和操作系统。

二、快速采集 Redis 状态

redis-cli INFO server
redis-cli INFO clients
redis-cli INFO memory
redis-cli INFO stats
redis-cli INFO persistence
redis-cli INFO replication
redis-cli INFO commandstats

重点字段:

  • connected_clientsblocked_clients

  • used_memoryused_memory_rssmem_fragmentation_ratio

  • instantaneous_ops_per_secrejected_connections

  • latest_fork_usec、RDB/AOF 状态;

  • 主从连接和复制积压;

  • 各命令调用次数和累计耗时。

采集时不要高频循环执行 INFO,避免在故障中增加额外压力。

三、检查慢命令

redis-cli SLOWLOG LEN
redis-cli SLOWLOG GET 20
redis-cli CONFIG GET slowlog-log-slower-than
redis-cli CONFIG GET slowlog-max-len

慢日志记录的是命令在 Redis 内部执行的时间,不包含网络传输和客户端排队。重点关注 KEYS、大范围 HGETALLSMEMBERS、集合运算、Lua 脚本和一次删除超大 Key。

不要在生产大库直接执行 KEYS *。需要扫描时使用限制速率的 SCAN,并在低峰期进行。

四、识别 BigKey 与热点 Key

在副本或低峰期使用:

redis-cli --bigkeys
redis-cli --memkeys

也可以使用 MEMORY USAGE <key> 检查已知 Key。--bigkeys 会扫描整个 keyspace,虽然使用 SCAN,仍可能增加网络和 CPU 压力。

热点 Key 可结合客户端埋点、代理指标或在可控窗口使用 redis-cli --hotkeys。该能力依赖 LFU 策略,使用前确认版本与配置。

五、检查阻塞客户端和长时间命令

redis-cli CLIENT LIST
redis-cli INFO clients

blocked_clients 增长不一定是故障,阻塞队列命令本身就会等待;但如果普通请求也变慢,应检查是否有 Lua、模块命令或大 Key 操作占用 Redis 主线程。

短时间使用 MONITOR 会产生大量输出并显著增加开销,生产高峰不要直接开启。优先使用 SLOWLOG、commandstats 和客户端指标。

六、检查持久化与 fork 抖动

redis-cli INFO persistence
redis-cli CONFIG GET save
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync

RDB 保存或 AOF 重写需要 fork。内存很大、脏页多或宿主机内存紧张时,fork 会引发明显延迟。观察 latest_fork_usec、BGSAVE/BGREWRITEAOF 以及磁盘延迟。

vmstat 1 10
iostat -xz 1 10
pidstat -r -u -d -p $(pidof redis-server) 1 10
dmesg -T | grep -Ei 'oom|memory|transparent hugepage'

同时检查 swap、Transparent Huge Pages、CPU steal 和磁盘 await

七、检查连接池和网络

客户端连接池耗尽、连接频繁创建、DNS 抖动或代理转发也会表现为 Redis 慢。检查:

  • 客户端连接池等待时间、活跃/空闲连接数;

  • total_connections_received 增长速度;

  • 是否存在大量短连接和 TLS 握手;

  • 云网络丢包、跨可用区延迟和代理节点负载;

  • 客户端超时是否小于实际业务峰值。

八、应急处理步骤

  1. 停止或限流正在执行的高风险批处理和全量扫描。

  2. 对热点接口降级,避免请求继续堆积。

  3. BigKey 删除优先使用 UNLINK,避免同步释放阻塞主线程。

  4. 连接池耗尽时先限制新流量并修复泄漏,不要无限扩大连接数。

  5. 持久化导致抖动时评估磁盘和内存,不能在不了解数据安全要求时关闭 AOF/RDB。

  6. 主节点持续过载时,在确认一致性和容量后分担读流量、分片或迁移。

九、恢复后的验证

持续观察服务端延迟、P99、blocked clients、slowlog、CPU、RSS、fork 时间和客户端错误率。确认延迟回落后,再逐步恢复限流任务,避免一次性回放流量造成第二次冲击。

十、长期治理

  • 为命令耗时、P99、连接数、内存、持久化和复制建立监控。

  • 限制单 Key 大小,集合类数据拆分并设置合理过期策略。

  • 禁止线上使用危险全量命令,脚本和 Lua 上线前评审复杂度。

  • 容量规划同时考虑数据集、fork 峰值、复制缓冲和碎片。

  • 客户端统一连接池、超时、重试退避和熔断策略。

  • 定期做 BigKey、热点 Key 和慢命令巡检。

Redis 延迟排查要同时看命令、数据结构、持久化、操作系统和客户端,任何单一指标都不足以说明根因。

原创

Redis 延迟突然升高:慢命令、BigKey、阻塞与系统抖动排查

本文链接: Redis 延迟突然升高:慢命令、BigKey、阻塞与系统抖动排查

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录