Redis 慢查询

12/12/2021 Redis

# 一:前言

许多存储系统(例如MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功能。

客户端命令的生命周期

  1. 发送命令
  2. 命令排队
  3. 命令执行
  4. 返回结果

需要注意: 慢查询只统计步骤3)的时间,所以没有慢查询并不代表客户端没有超时问题。

# 二:配置参数

慢查询的两个配置参数

  1. slowlog-log-slower-than:预设阀值,单位是微秒(1秒=1000毫秒=1000_000毫秒),默认值是10000。如果填入0,会记录所有的命令。填入<0对于任何命令都不会进行记录。
  2. slowlog-max-len:慢查询日志最多存储多少条。

# 三:存放位置

Redis使用了一个列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。如果日志列表满,则最早插入的记录将从列表中移出。

# 四:配置方式

  1. 修改配置文件

  2. config set命令动态修改

config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
1
2
3

如果要Redis将配置持久化到本地配置文件,需要执行 config rewrite 命令

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

# 5.2 获取慢查询日志列表当前的长度

> slowlog len
(integer) 45
1
2

# 5.3 慢查询日志重置

> slowlog len
(integer) 45
> slowlog reset
OK
> slowlog len
(integer) 0
1
2
3
4
5
6

# 六:建议

  1. slowlog-max-len配置建议:线上建议调大慢查询列表,记录慢查询时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上。
  2. slowlog-log-slower-than配置建议:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值。由于Redis采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么Redis最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒。
  3. 慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slow get命令将慢查询日志持久化到其他存储中(例如MySQL),然后可以制作可视化界面进行查询,例如CacheCloud。

# 七:参考文献

最后更新: 12/21/2021, 9:10:16 AM