慢查询分析
谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。
执行一条命令分为如下4个部分:
- 发送命令
- 命令排队
- 命令执行
- 返回结果
需要注意,慢查询只统计步骤4的时间,所以没有慢查询并不代表客户端没有超时问题。
慢查询的两个配置参数
对于慢查询功能,需要明确两件事:
- 预设阀值怎么设置?
- 慢查询记录存放在哪?
Redis提供了slowlog-log-slower-than和slowlog-max-len配置来解决这两个问题。从字面意思就可以看出,slowlog-log-slower-than就是那个预设阀值,它的单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000。
log-log-slower-than=0会记录所有的命令
slowlog-log-slowerthan<0对于任何命令都不会进行记录
slowlog-max-len只是说明了慢查询日志最多存储多少条
在Redis中有两种修改配置的方法,
- 修改配置文件
- 使用config set命令动态修改。例如下面使用config set命令将slowlog-log-slower-than设置为20000微秒,slowlog-max-len设置为1000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
如果要Redis将配置持久化到本地配置文件,需要执行config rewrite命令。
获取慢查询日志
(1)慢日志获取
slowlog get [n]
结果:
127.0.0.1:6379> slowlog get
1) 1) (integer) 666
176
2) (integer) 1456786500
3) (integer) 11615
4) 1) "BGREWRITEAOF"
2) 1) (integer) 665
2) (integer) 1456718400
3) (integer) 12006
4) 1) "SETEX"
2) "video_info_200"
3) "300"
4) "2"
...
可以看到每个慢查询日志有4个属性组成,分别是慢查询日志的标识id、发生时间戳、命令耗时、执行命令和参数。
(2)获取慢查询日志列表当前的长度
slowlog len
例如,当前Redis中有45条慢查询:
127.0.0.1:6379> slowlog len
(integer) 45
(3)慢查询日志重置
slowlog reset
实际是对列表做清理操作,例如:
127.0.0.1:6379> slowlog len
(integer) 45
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 0
最佳实践
- slowlog-max-len配置建议:线上建议调大慢查询列表,记录慢查询时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上。
- slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值。由于Redis采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么Redis最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒。