634 字
3 分钟
Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
应用一次 Redis 调用的耗时,包含连接池等待、请求排队、网络传输、服务端执行与响应处理。SLOWLOG 主要记录命令执行耗时,不包含所有客户端端到端时间。 应用 P99 升高但慢日志为空,不能因此判定 Redis 链路正常。
按证据缩小范围
先确认是所有命令还是某类操作变慢,记录时间窗口、实例、命令和响应大小,比较应用端和服务端指标。连接池等待高时检查池容量与调用堆积;网络 RTT 高或响应很大时检查网络与 BigKey;服务端执行时间高时检查复杂命令、Lua 长循环和全量扫描。
可以读取以下信息,具体权限和配置以环境为准:
SLOWLOG GET 20INFO commandstatsINFO statsINFO memoryINFO persistenceINFO replicationLATENCY DOCTORSLOWLOG 阈值使用微秒,日志容量有限。LATENCY 监测依赖相关配置,不是默认无条件记录所有事件;生产环境修改阈值需要评估采集成本。还要注意慢日志参数可能含业务敏感信息,展示与导出时应脱敏。
常见原因如何关联?
CPU 饱和要区分热点命令与其他进程竞争;fork 延迟、AOF 同步、COW 增长可结合持久化指标;内存不足和 swap 会显著放大延迟。大规模过期、淘汰和复制重同步也会增加工作量。诊断时用故障时间窗口关联指标,避免只看某一时刻的平均 CPU。
常见追问
为什么 GET 执行很快,应用却要等几十毫秒?
可能在连接池、主线程前的队列、网络或客户端解析上等待。服务端 GET 的执行时间只覆盖调用链中的一段。
开启 I/O 多线程能解决所有慢命令吗?
不能。Redis 6/7 常见设计仍以主线程执行核心命令,多线程网络处理无法消除长 Lua 或巨大集合遍历造成的串行占用。
MONITOR 适合长期作为生产追踪工具吗?
不宜默认长期全量使用,它会产生输出与处理成本,并可能暴露命令参数。优先使用已有指标、采样与针对性诊断。
平均延迟正常就代表服务正常吗?
不代表。少量长暂停可显著影响 P99 和业务超时,应同时看尾延迟、超时比例与突发事件。
Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
https://blog.xqcherry.top/posts/interview/redis/redis-slowlog-latency-diagnosis/ 目录