【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南
前提介绍
本篇文章首要介绍了Redis的履行的慢查询的功用的查询和装备功用,从而能够方便咱们在实际工作中,进行剖析Redis的功用运行状况以及对应的优化Redis功用的佐证和目标因素。
在咱们5.0左右的版别中Redis运用单线程架构和I/O多路复用模型来完成高功用的内存数据服务。接下来首要剖析Redis单线程指令处理机制,接着剖析Redis单线程模型为什么功用如此之高。
单线程指令的处理机制
Redis客户端与服务端的模型首要是下图所示。
每次客户端调用都阅历了发送指令、履行指令、回来结果三个过程。
本章内容
本章的文章内容首要是一下几点。
什么是慢查询
慢查询便是当Redis在处理一条指令的时分,当超过了系统装备的履行时刻的阈值的时分,就会被系统当作慢查询计算和断定。
慢查询日志
慢查询日志便是系统在指令履行前后计算每条指令的履行时刻,当超过预设阈值,就将这条指令的相关信息(例如:发生时刻、耗时、指令的详细信息)记载下来。
Redis慢查询日志
Redis慢查询日志功用是用于记载履行时刻超过给定时长的指令恳求,能够经过查看慢查询日志来监控和优化查询速度。
Redis慢查询的损害
说到了Redis慢查询的损害,就会先说一下Redis的运行机制。
Redis客户端履行一条指令的步骤
Redis是单线程来处理指令,所以一条指令从客户端抵达服务端不会立即被履行,一切的指令都会进入一个队列,然后逐一被履行。
因此Redis服务端去履行操作的是能够首要以下几个步骤:
一切的指令都有先后次序,但是真实含义抵达服务端的履行次序也是不确定的,因为中间有网络传输。但是能够必定的是,不会有两条指令被同时履行,这样就不会发生并发问题,这便是Redis单线程的根本模型。
慢查询引发的问题
- 单线程机制:一切指令放在一个队列中
- Redis履行指令首要是在内存中履行、非IO堵塞、避免线程切换和竞态发生的消耗。
因为单线程的问题,一个指令不能履行太长时刻,不然会堵塞其他指令的履行。所以慢查询会形成整体的Redis服务的功用的下降以及CPU的耗时和负载变高。
注意:慢查询只会记载履行指令的时刻,没有慢查询并不代表客户端没有超时问题。
阈值和慢查询的日志的设置
监控Redis指令的慢查询功用,需要明确两件事:
- 预设阈值怎样设置?
- 慢查询记载存放在哪里?
预设阈值怎样设置?
针对于慢查询的阈值,在Redis供给了slowlog-log-slower-than
和slowlog-max-len
装备来解决这两个问题。
阈值参数设置
慢查询履行时刻阈值
- slowlog-log-slower-than:指定履行时刻超过多少微秒的指令会被记载到日志上,它的单位是微妙(1秒=1000毫秒=1000000微秒),默认值10000。
例如,该值设为100,履行了一条很慢的指令(例如 keys * ),假如它的履行时刻超过了100微秒,则这个指令会被记载到慢查询日志中。
慢查询数据存储阈值
慢查询日志最多存储多少条,并没有阐明存放在那里?首要经过slowlog-max-len进行操控和设置。从底层角度剖析,Redis运用了一个列表来存储慢查询日志,slowlog-max-log便是列表的最大长度。
-
slowlog-max-len:指定服务器上最多保存慢查询日志的条数。
- slowlog-log-slower-than=0,那么系统会记载一切的指令
- slowlog-log-slower-than<0,那么对任何指令都不会记载。
例如,该值设为5,那么指令履行时刻超过slowlog-log-slower-than设置的时刻的指令会被记载到慢查询日志上,假如慢查询日志的数量等于5,那么再增加慢查询日志时,需要把最早增加的慢查询日志删除,即慢查询日志删除选用先进先出的方法。
慢查询的装备类型和方法
Redis有两种修正装备的方法:1. 修正装备文件;2. config set指令动态修正。
例如,运用config set指令将slowlog-log-slower-than设置为20000微秒,slowlog-max-len设置为10000:
config set slowlog-log-slower-than 20000
config set slowlog-max-len 10000
config rewrite
假如要Redis将装备持久化到本地装备文件,要履行config rewrite指令,它会重写装备文件。
慢查询日志的操作指令
慢查询日志的的查询和保护首要是经过:slowlog get、slowlog len、slowlog reset这几条指令。
slowlog get [n]
慢查询日志有4个属性组成:日志id、发生时刻戳、指令耗时、履行指令和参数。
127.0.0.1:6379> slowlog get
1) 1) (integer) 1
2) (integer) 1513709400
3) (integer) 11
4) 1) "slowlog"
2) "get"
2) 1) (integer) 0
2) (integer) 1513709398
3) (integer) 4
4) 1) "config"
2) "set"
3) "slowlog-log-slower-than"
4) "2"
slowlog len
获取慢查询日志列表当时的长度
127.0.0.1:6379> slowlog len
(integer) 2
上面则阐明当时的满查询列表中至于连个慢查询日志。
slowlog reset
实际是对慢查询日志列表做整理操作。
127.0.0.1:6379> slowlog len
(integer) 6
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 1
为什么还有1个,因为阈值设的比较小,slowlog reset就属于慢查询。