慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过了设置的阀值,就将这条命令的信息(发生时间、耗时、命令详细信息等)记录下来。
客户端命令执行生命周期
Redis的客户端分为四个部分,如下图所示:
- 发送命令
- 命令排队
- 命令执行
- 返回结果
注意:慢查询只统计命令执行时间,所以没有慢查询并不代表客户端没有超时问题。
慢查询参数配置
slowlog-log-slower-than
slowlog-log-slower-than
是预设阀值,单位微妙(默认10000),如果有一条命令的执行时间超过了 10000 微妙那么这条命令将被记录在慢查询日志中。 提示:如果 slowlog-log-slower-than = 0
会记录所有命令,如果 slowlog-log-slower-than < 0
任何命令都不会记录。
slowlog-max-than
slowlog-max-than
说明慢查询日志最多存储多少条记录,并没有说明存储在哪个位置?在 Redis 中使用了一个列表来存储慢查询日志,slowlog-max-than
就是列表的最大长度。一个命令如果满足慢查询的条件,就会将这条命令插入到列表中。 提示:当慢查询日志列表已处于最大长度时,最早插入的一个命令将从列表中移除。
- 使用
config set
命令动态修改配置
### 修改阀值和设置列表最大长度config set slowlog-log-slower-than 20000config set slowlog-max-len 1000### 将配置持久化到本地文件config rewrite复制代码
- 获取慢查询日志
### n 可以指定条数slowlog get \[n\]复制代码
-
慢查询日志数据结构 每一个慢查询日志由 4 个属性组成,分别是慢查询日志的标识 id、发生时间戳、命令耗时、执行命令和参数。如下图所示:
-
获取慢查询日志列表长度
slowlog len复制代码
- 慢查询日志重置
slowlog reset复制代码
慢查询使用建议
slowlog-max-len
:线上调大慢查询列表,记录慢查询时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能性。slowlog-log-slower-than
:建议超过10毫秒判定为慢查询,需要根据 Redis 并发量调整该值。对于高流量场景,如果命令执行在1毫秒以上,那么 Redis 最多可支撑 OPS 不到1000。所以对于高 OPS 场景建议设置为1毫秒。- 慢查询只记录命令时间,因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其它命令级联阻塞,所以在出现请求超时情况下需要检查该时间点会不会出现慢查询,从而分析是否为慢查询导致的级联阻塞。
- 在慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止丢失部分慢查询命令可以定期执行
slow get
命令将慢查询日志持久化到其它存储中(例如 MySQL),然后制作可视化界面进行查询。