慢查询日志
2023-4-13
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

 
Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求, 用户可以通过这个功能产生的日志来监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项:
  • slowlog-log-slower-than 选项指定执行时间超过多少微秒(1 秒等于 1,000,000 微秒)的命令请求会被记录到日志上
    • 举个例子, 如果这个选项的值为 100 , 那么执行时间超过 100 微秒的命令就会被记录到慢查询日志;
  • slowlog-max-len 选项指定服务器最多保存多少条慢查询日志
    • 服务器使用先进先出的方式保存多条慢查询日志: 当服务器储存的慢查询日志数量等于slowlog-max-len选项的值时, 服务器在添加一条新的慢查询日志之前, 会先将最旧的一条慢查询日志删除。 如果服务器 slowlog-max-len 的值为 100 , 并且假设服务器已经储存了100条慢查询日志, 那么如果服务器打算添加一条新日志的话, 它就必须先删除目前保存的最旧的那条日志, 然后再添加新日志。
 
CONFIG_SET命令将 slowlog-log-slower-than 选项的值设为0微秒, 这样Redis服务器执行的任何命令都会被记录到慢查询日志中, 接着将slowlog-max-len选项的值设为5 , 让服务器最多只保存5条慢查询日志
接着, 用客户端发送几条命令请求:
然后使用SLOWLOG GET命令查看服务器所保存的慢查询日志:
如果这时再执行一条 SLOWLOG GET 命令, 那么将看到, 上一次执行的SLOWLOG GET命令已经被记录到了慢查询日志中, 而最旧的、编号为0的慢查询日志已经被删除, 服务器的慢查询日志数量仍然为5条:
 

慢查询记录的保存

服务器状态中包含了几个和慢查询日志功能有关的属性:
slowlog_entry_id属性的初始值为 0 , 每当创建一条新的慢查询日志时, 这个属性的值就会用作新日志的 id 值, 之后程序会对这个属性的值增一。
slowlog链表保存了服务器中的所有慢查询日志, 链表中的每个节点都保存了一个slowlogEntry结构, 每个slowlogEntry结构代表一条慢查询日志:
对于以下慢查询日志来说:
notion image
notion image
  • slowlog_entry_id 的值为 6 , 表示服务器下条慢查询日志的 id 值将为 6 
  • slowlog 链表包含了 id 为 5 至 1 的慢查询日志, 最新的 5 号日志排在链表的表头, 而最旧的 1 号日志排在链表的表尾, 这表明slowlog 链表是使用插入到表头的方式来添加新日志的
  • slowlog_log_slower_than 记录了服务器配置 slowlog-log-slower-than 选项的值 0 , 表示任何执行时间超过 0 微秒的命令都会被慢查询日志记录
  • slowlog-max-len 属性记录了服务器配置 slowlog-max-len选项的值 5 , 表示服务器最多储存五条慢查询日志
 
 

慢查询日志的阅览和删除

弄清楚了服务器状态的slowlog链表的作用之后, 可以用以下伪代码来定义查看日志的SLOWLOG GET命令:
查看日志数量的SLOWLOG LEN命令可以用以下伪代码来定义:
用于清除所有慢查询日志的 SLOWLOG RESET 命令可以用以下伪代码来定义:
 
 

添加新日志

在每次执行命令的之前和之后, 程序都会记录微秒格式的当前UNIX时间戳, 这两个时间戳之间的差就是服务器执行命令所耗费的时长, 服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded函数, 而slowlogPushEntryIfNeeded函数则负责检查是否需要为这次执行的命令创建慢查询日志, 以下伪代码展示了这一过程:
slowlogPushEntryIfNeeded 函数的作用有两个:
  1. 检查命令的执行时长是否超过 slowlog-log-slower-than 选项所设置的时间, 如果是的话, 就为命令创建一个新的日志, 并将新日志添加到 slowlog 链表的表头。
  1. 检查慢查询日志的长度是否超过 slowlog-max-len 选项所设置的长度, 如果是的话, 那么将多出来的日志从 slowlog 链表中删除掉。
以下是 slowlogPushEntryIfNeeded 函数的实现代码:
slowlogCreateEntry函数: 该函数根据传入的参数, 创建一个新的慢查询日志, 并将 redisServer.slowlog_entry_id 的值增一。
 
假设服务器当前保存的慢查询日志如图所示:
notion image
如果执行命令EXPIRE msg 10086,服务器在执行完这个 EXPIRE 命令之后, 就会调用slowlogPushEntryIfNeeded函数, 函数将为EXPIRE命令创建一条id6的慢查询日志, 并将这条新日志添加到slowlog链表的表头:
notion image
除了slowlog链表发生了变化之外, slowlog_entry_id的值也从6变为7了。
之后, slowlogPushEntryIfNeeded函数发现, 服务器设定的最大慢查询日志数目为5条, 而目前保存的慢查询日志数目为6条, 于是服务器将id1的日志删除, 让服务器的慢查询日志数量回到设定好的5条。
notion image
 
  • Redis
  • 排序监视器
    目录