7. 排查Redis中的慢查询
慢查询的作用:通过慢查询分析,找到有问题的命令进行优化。
Redis 执行命令分为四个步骤:发送命令、命令排队、执行命令、返回结果。需要注意的是,慢查询只统计步骤 3 的时间,所以没有慢查询并不代表客户端没有超时问题。
Redis 慢查询有两个参数需要配置:
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 命令对这两个命令配置下。
1
2
3config set slowlog-log-slower-than 0
config set slowlog-max-len 1024
config rewrite
获取慢日志
1 | slowlog get [n] // n 表示展示的条数 |
慢查询列表长度
1 | slowlog len |
清空日志列表
1 | slowlog reset // 如果慢查询设置的阈值是0,那么下次再查询len的时候为1 |
最佳实践
慢查询功能可以有效地帮助我们找到 Redis 可能存在的瓶颈,但在实际使用过程中要注意以下几点
- slowlog-log-slower-than:默认是 10 毫秒,我们需要根据 Redis 的并发量调整该值。若我们采用默认,那么命令的执行时间要超过 10 毫米才会记录,如果命令的执行时间超过 10 毫秒,那么 Redis 的 QPS 连 100 都不到,因此对于高并发场景,建议将该值设置较小。
- slowlog-max-len:线上建议调大慢查询列表,记录慢查询时Redis会对长命令做阶段操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上
- 慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间,因此客户端执行命令的时间会大于命令的实际执行时间。
- 命令执行排队机制,慢查询会导致其他命令级联阻塞。
- 客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的生活小站!