在MySql提供慢查询日志来定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预定的最大值,就将这条命令的相关信息记录。
慢查询的参数配置
- 时间最大值设置(slowlog-log-slower-than)
- 慢查询记录存放(slowlog-max-len)
slowlog-log-slower-than
- 是以微秒为单位,默认值是10000(10毫秒)
- 如果slowlog-log-slower-than=0会记录所有的命令
- slowlog-log-slowerthan<0对于任何命令都不会进行记录
slowlog-max-len
redis使用一个列表来存储慢查询日志,当日志列表处于最大长度时,最早插入的命令将从列表中移除
如何修改参数配置
- 修改配置文件
- 使用config set 命令动态修改
修改配置文件
vim /etc/redisConf/redis.conf
slowlog-log-slower-than 10000
slowlog-max-len 128
用config set命令修改
//使用config set命令设置
config set slowlog-log-slower-than 10000
config set slowlog-max-len 128
config rewrite //将redis配置持久化到本地配置文件
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
对慢查询记录数据的操作
//获取慢查询日志列表当前的长度
127.0.0.1:6379> slowlog len
(integer) 47
//获取慢查询日志 slowlog get [n] 参数n可以指定条数
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 46 //慢查询日志的标识id
2) (integer) 1545510092 // 什么时候的时间戳
3) (integer) 10977 //命令耗时
4) 1) "RPOP" //执行命令
2) "sy:notify:send_list_sys" //key
注意:
我们需要解释一下命令耗时是表示哪个时间段的时间。redis的一条命令执行一共有四个阶段 1.发送命令 2.排队 3. 执行命令 4.返回结果。命令耗时只记录第3阶段的时间,所以如果没有慢查询并不代表客
户端没有超时问题
//慢查询日志清空
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 46
2) (integer) 1545510092
3) (integer) 10977
4) 1) "RPOP"
2) "sy:notify:send_list_sys"
127.0.0.1:6379> slowlog resett
(error) ERR Unknown SLOWLOG subcommand or wrong # of args. Try GET, RESET, LEN.
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog get 1
(empty list or set)
127.0.0.1:6379>
总结
slowlog-max-len配置建议设置为1000以上,slowlog-log-slower-than配置,默认值超过10毫秒判定为慢查询,但是如果高OPS场景的Redis建议设置为1毫秒。
由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多
的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期
执行slow get命令将慢查询日志持久化到其他存储中,然后可以制作可视化界面进行查询。
慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因
此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机
制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检
查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联
阻塞。