一分钟快速搞懂Redis的慢查询分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一分钟快速搞懂Redis的慢查询分析相关的知识,希望对你有一定的参考价值。

参考技术A

慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程:

在慢查询的定义中,统计比较慢的时间段指的是 命令执行 这个步骤。没有慢查询,并不表示客户端没有超时问题,有可能网络传输有延迟,也有可能排队的命令比较多。

因为Redis中命令执行的排队机制,慢查询会导致其他命令的级联阻塞,所以当客户端出现请求超时的时候,需要检查该时间点是否有慢查询,从而分析出由于慢查询导致的命令级联阻塞。

慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长,当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间,还有执行时长、具体什么命令等信息,它可以用来帮助开发和运维人员定位系统中存在的慢查询。

可以使用 slowlog get 命令获取慢查询日志,在 slowlog get 后面还可以加一个数字,用于指定获取慢查询日志的条数,比如,获取3条慢查询日志:

从上面的例子中,可以看出每一条慢查询日志都有4个属性组成:

可以使用 slowlog len 命令获取慢查询日志的长度,比如:

在上例中,当前Redis中有121条慢查询日志。

可以使用 slowlog reset 命令清理慢查询日志,比如:

正如上面提到的,慢查询需要如下两个配置:

Redis对应提供了两个参数:slowlog-log-slower-than和slowlog-max-len,接下来我们详细介绍一下这两个参数。

slowlog-log-slower-than的作用是指定命令执行时长的阈值,执行命令的时长超过这个阈值时就会被记录下来。它的单位是微秒(1秒 = 1000毫秒 = 1000000微秒),默认是10000微秒。如果把slowlog-log-slower-than设置为0,将会记录所有命令到日志中。如果把slowlog-log-slower-than设置小于0,将会不记录任何命令到日志中。

在实际的生产环境中,需要根据Redis并发量来调整该配置。因为Redis采用单线程响应命令,如果命令执行时间在1000微秒以上,那么Redis最多可支撑OPS不到1000,所以对于高并发场景的Redis建议设置为 1000微秒

slowlog-max-len的作用是指定慢查询日志最多存储的条数。实际上,Redis使用了一个列表存放慢查询日志,slowlog-max-len就是这个列表的最大长度。当一个新的命令满足满足慢查询条件时,被插入这个列表中。当慢查询日志列表已经达到最大长度时,最早插入的那条命令将被从列表中移出。比如,slowlog-max-len被设置为10,当有第11条命令插入时,在列表中的第1条命令先被移出,然后再把第11条命令放入列表。

记录慢查询是Redis会对长命令进行截断,不会大量占用大量内存。在实际的生产环境中,为了减缓慢查询被移出的可能和更方便地定位慢查询,建议将慢查询日志的长度调整的大一些。比如可以设置为 1000以上

在Redis中有两个修改配置的方法:

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

慢查询指的是 命令执行 时长比较长的查询。通过 slowlog get 命令获取慢查询日志;通过 slowlog len 命令获取慢查询日志的长度;通过 slowlog reset 命令清理慢查询日志。通过 slowlog-log-slower-than 配置命令执行时长的阈值;通过 slowlog-max-len 配置慢查询日志最多存储的条数。

死磕 Redis----- 如何排查 Redis 中的慢查询

原文:https://www.topjava.cn/category/1391389927996002304chenssy


我们知道 MySQL 提供了慢查询日志帮助我们定位系统存在的慢操作,同样在 Redis 里面也提供了类似的功能。所谓慢查询日志就是系统记录那些执行时间超过预设阀值的命令,包括发生时间、耗时、命令的详细信息等相关信息都记录下来。

慢查询的作用:通过慢查询分析,找到有问题的命令进行优化

Redis 执行命令分为四个步骤:发送命令、命令排队、执行命令、返回结果。需要注意的是,慢查询只统计步骤 3 的时间,所以没有慢查询并不代表客户端没有超时问题。

Redis 慢查询有两个参数需要配置:

  • slowlog-log-slower-than:设置慢查询预设的超时阈值,单位是微秒
  • slowlog-max-len:表示慢查询日志存储的条数

slowlog-log-slower-than

slowlog-log-slower-than 表示的是慢查询预设的超时阈值。它所阐述的意思是如果某条命令(如 key *) 执行”很慢“,执行时间超过了设置的阈值,那么这条命令将会被记录到慢查询日志中。

  • 若设置 slowlog-log-slower-than = 0,则会记录所有命令
  • 若设置 slowlog-log-slower-than < 0,则不会记录任何命令

slowlog-max-len

Redis 会记录慢查询日志,但是会存储在哪里呢?实际上 Redis 会使用一个列表来存储慢查询日志,slowlog-max-len 就是该列表的最大长度。一个命令如果满足慢查询阈值条件则会加入到该列表来,但是如果该列表已经处于最大长度时,那么会删除最开始的一条记录,然后将最新的命令插入到末尾,所以慢查询日志列表是一个有限的先进先出列表。

在 Redis 中有两种修改配置的方法,一种是修改配置文件,另一种是使用 config set 命令动态修改。下面我们将利用 config set 命令对这两个命令配置下。

config set slowlog-log-slower-than 0
config set slowlog-max-len 1024
config rewrite

slowlog-log-slower-than 设置为 0 , slowlog-max-len 设置为 1024,config rewrite 表示将配置持久化到配置文件中。

  • 获取慢查询日志
slowlog get [n]

参数 n 表示展示的条数,如下:

127.0.0.1:6379> slowlog get 1
1) 1) (integer) 3
   2) (integer) 1582721437
   3) (integer) 888
   4) 1) "set"
      2) "key1"
      3) "value1"
   5) "127.0.0.1:55842"
   6) ""

可以看出返回的慢查询日志由 4 个属性组成:

1)日志的标识 id
2)发生的时间戳
3)命令耗时
4)执行的命令和参数

  • 获取慢查询列表长度
slowlog len
  • 清空日志列表
# 如果慢查询设置的阀值是0,那么再查询len的时候为1。
slowlog reset

最佳实践

慢查询功能可以有效地帮助我们找到 Redis 可能存在的瓶颈,但在实际使用过程中要注意以下几点:

  • slowlog-log-slower-than:默认是 10 毫秒,我们需要根据 Redis 的并发量调整该值。若我们采用默认,那么命令的执行时间要超过 10 毫米才会记录,如果命令的执行时间超过 10 毫秒,那么 Redis 的 QPS 连 100 都不到,因此对于高并发场景,建议将该值设置较小。
  • slowlog-max-len:线上建议调大慢查询列表,记录慢查询时Redis会对长命令做阶段操作,并不会占用大量内存.增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上。
  • 慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令的实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞。

参考

  • 《Redis 开发与运维》

以上是关于一分钟快速搞懂Redis的慢查询分析的主要内容,如果未能解决你的问题,请参考以下文章

一篇文章快速搞懂Redis的慢查询分析

Redis-慢查询分析

Redis的慢查询日志

死磕 Redis----- 如何排查 Redis 中的慢查询

死磕 Redis----- 如何排查 Redis 中的慢查询

redis的慢查询日志配置与查询