第23章 慢查询日志

理解slowlog_entry保存内容、阈值与最大长度配置、查询删除命令和执行后记录时点 覆盖4个正式节点,并以Redis 3.0源码、故障和恢复对账验收。

学习目标

  • 能配置慢查询阈值与长度
  • 能解读慢日志的定位价值
  • 能把慢日志纳入日常巡检

为什么从“慢查询阈值与环形记录台”开始

第23章 慢查询日志的核心任务是理解slowlog_entry保存内容、阈值与最大长度配置、查询删除命令和执行后记录时点。命令返回值只暴露外层合同;实现解释还必须连接内存结构、写入与读取路径、事件顺序以及失败后的旧状态回收。慢查询阈值与环形记录台把这些关系放进同一条可复位轨迹。

先写预测:当执行耗时由“等于阈值”进入“高于阈值”时,哪个可观察状态最先变化?再规定什么结果会推翻当前解释。交互中的分数只表达透明因果方向,不冒充真实Redis测量。

来源、版次与独立重写边界

黄健宏作者读者服务页确认正式出版新版以Redis 3.0为源码基线,列出4部分、24章及完整小节,并链接Redis 3.0中文注释源码。本课程据此映射24个正式单元、145个目录节点,另设学习地图和总复习;未取得出版正文授权,目录只界定范围,不宣称复现原书正文。

本章字段与控制流由Redis官方3.0源码:slowlog.c和作者注释源码交叉核对;Redis当前持久化文档只用于辨认版本差异。中文解释、图示、交互、实验与答案均为独立教学重写,不把目录页或代码仓库许可证误报为原书许可证。

本章术语与源码合同

第23章 慢查询日志必须守住“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”。观察同时记录慢查询阈值与环形记录台一致率与日志容量分叉风险;只有结构快照、函数入口、运行结果和故障反例互相一致,才接受实现结论。

⚡ 慢查询日志记录与分析
慢查询日志(阈值:5000μs,记录 0 条)0μs — 5000μs — 15000μsID命令耗时说明(暂无慢查询,执行命令后超阈值的命令会出现在这里)
慢日志只计命令执行耗时,不含排队与网络传输。SLOWLOG GET 查看,SLOWLOG RESET 清理。生产环境阈值通常设为 10ms(10000μs),按业务延迟要求收紧。定期巡检可发现被忽略的性能问题。
操作日志
  1. 1.慢查询日志:记录执行时间超过 slowlog-log-slower-than 微秒的命令。仅计执行时间,不含排队与网络。

作者目录逐项深读

慢查询记录的保存

四级证据 1/4。 slowlogEntry保存唯一ID、执行时间、时间戳与截断后的参数;记录发生在命令执行完成后。本节点用“慢查询记录的保存”作观察点,执行rg 'slowlogPushEntryIfNeeded|slowlogCommand' src/slowlog.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证慢查询记录的保存时,先预测执行耗时从“等于阈值”切到“高于阈值”会改变哪个字段、偏移、文件或消息;再固定日志容量做一次对照。若故障注入没有破坏“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”,就撤回当前解释而不是补写故事。

慢查询日志的阅览和删除

四级证据 2/4。 SLOWLOG GET按新到旧返回有界日志,LEN读长度,RESET清空并释放记录。本节点用“慢查询日志的阅览和删除”作观察点,执行rg 'slowlogPushEntryIfNeeded|slowlogCommand' src/slowlog.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证慢查询日志的阅览和删除时,先预测执行耗时从“等于阈值”切到“高于阈值”会改变哪个字段、偏移、文件或消息;再固定日志容量做一次对照。若故障注入没有破坏“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”,就撤回当前解释而不是补写故事。

添加新日志

四级证据 3/4。 只有命令执行微秒数达到slowlog-log-slower-than才入队,超过slowlog-max-len时删除最旧项。本节点用“添加新日志”作观察点,执行rg 'slowlogPushEntryIfNeeded|slowlogCommand' src/slowlog.c或等价源码探针,保存版本、输入、前后状态和能推翻解释的反例。

验证添加新日志时,先预测执行耗时从“等于阈值”切到“高于阈值”会改变哪个字段、偏移、文件或消息;再固定日志容量做一次对照。若故障注入没有破坏“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”,就撤回当前解释而不是补写故事。

重点回顾

四级证据 4/4。 第23章 慢查询日志的回顾要重新证明“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”,并用同一输入比较结构前态、变更轨迹、故障首错与恢复后态

验证重点回顾时,先预测执行耗时从“等于阈值”切到“高于阈值”会改变哪个字段、偏移、文件或消息;再固定日志容量做一次对照。若故障注入没有破坏“耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯”,就撤回当前解释而不是补写故事。

最小源码与运行切片

+git clone --branch 3.0 --depth 1 https://github.com/redis/redis.git redis-3.0
+cd redis-3.0
+rg 'slowlogPushEntryIfNeeded|slowlogCommand' src/slowlog.c

该切片固定Redis 3.0分支、编译器、配置、数据集和命令序列;先保存结构或函数位置,再运行隔离实例。任何持久化损坏、断线、故障转移、大键或高流量实验都必须使用临时数据并规定CPU、内存、磁盘、延迟和停止上限。

unit: rdi-23-slow-log
source_file: slowlog.c
axis_a: "执行耗时"
axis_b: "日志容量"
fault: "把网络等待计入命令执行耗时,或无限保留参数导致内存与敏感信息风险"
invariant: "耗时口径排除网络I/O并按配置阈值记录,日志长度有界,ID与参数可追溯"
replay: same_version_same_input

三个必须主动触发的误区

误区 1

现象 → 阈值设得过大 原因 → 慢命令悄悄漏掉 修法 → 按业务延迟目标收紧阈值

误区 2

现象 → 只看不清理 原因 → 旧记录干扰判断 修法 → 定期 RESET 并归档

误区 3

现象 → 把慢日志当监控告警 原因 → 被动查看易遗漏 修法 → 纳入主动巡检与告警

小结

  • 慢查询日志记录超时命令
  • 阈值与长度都可配置
  • 只计执行时间不含排队
  • 用日志定位优化目标
  • 定期清理避免内存增长

练习、答案与节点验证

练习

问题 1: 慢日志为什么不记录排队时间?

问题 2: 慢日志长度为什么受限?

问题 3: 制定一份慢日志巡检 SOP。(独立实现)

术语复核与本章回顾

完成第23章 慢查询日志意味着能从slowlog.c解释理解slowlog_entry保存内容、阈值与最大长度配置、查询删除命令和执行后记录时点,能运行章专属状态实验,能制造反例并在复位后证明旧状态没有残留。

资料与写作方式声明

本章以黄健宏《Redis设计与实现》(机械工业出版社)权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…