# 一:前言
许多存储系统(例如MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功能。
- 发送命令
- 命令排队
- 命令执行
- 返回结果
需要注意: 慢查询只统计步骤3)的时间,所以没有慢查询并不代表客户端没有超时问题。
# 二:配置参数
慢查询的两个配置参数
- slowlog-log-slower-than:预设阀值,单位是微秒(1秒=1000毫秒=1000_000毫秒),默认值是10000。如果填入0,会记录所有的命令。填入<0对于任何命令都不会进行记录。
- slowlog-max-len:慢查询日志最多存储多少条。
# 三:存放位置
Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。如果日志列表满,则最早插入的记录将从列表中移出。
# 四:配置方式
修改配置文件
config set
命令动态修改
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
1
2
3
2
3
如果要Redis将配置持久化到本地配置文件,需要执行 config rewrite 命令
# 五:查询慢日志
虽然慢查询日志是存放在 Redis 内存列表中的,但是 Redis 并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理。
# 5.1 获取慢查询日志
## n 可以指定条数
## slowlog get [n]
## 每个慢查询日志有4个属性组成
## 1) 慢查询日志的标识id
## 2) 发生时间戳
## 3) 命令耗时
## 4) 参数
> slowlog get
1) 1) (integer) 666
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"
... ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 5.2 获取慢查询日志列表当前的长度
> slowlog len
(integer) 45
1
2
2
# 5.3 慢查询日志重置
> slowlog len
(integer) 45
> slowlog reset
OK
> slowlog len
(integer) 0
1
2
3
4
5
6
2
3
4
5
6
# 六:建议
- slowlog-max-len配置建议:线上建议调大慢查询列表,记录慢查询时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上。
- slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值。由于Redis采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么Redis最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒。
- 慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slow get命令将慢查询日志持久化到其他存储中(例如MySQL),然后可以制作可视化界面进行查询,例如CacheCloud。
# 七:参考文献
- 《Redis深度历险:核心原理和应用实践 - 钱文品》
- 《Redis 开发与运维 - 付磊、张益军》
- 官方文档 (opens new window)