之前中秋项目搞活动, 用户比较活跃 SE.Redis 频繁报 Timeout 异常, 狂翻了一波 issues 发现提这个问题还蛮多的, 作者非常频繁的提到使用 slowlog 这个命令进行排查, 那么问题就来了, 它是干嘛滴?
Redis slowlog 是个什么
使用这个命令可以读取或重置 Redis 慢速查询日志. 通俗讲就是 Redis 可以把执行时间超过我们设定值的命令记录下来, slowlog 是记录到内存中的哦, 所以非常快.
这里的执行时间不包括 I/O 操作, 比如与客户端, 发送应答等等, 就是实际执行命令所需的时间 (命令唯一执行的阶段, 线程被阻塞且不能同时处理其他请求).
设置 Redis slowlog
两种方式:
可以通过配置 Redis.conf 来完成.
运行时, 使用 CONFIG GET 和 CONFIG SET 命令配置.
这里我们主要说的是第二种方式, 您可以使用两个参数来配置慢日志: slowlog-log-slow-than * , 告诉 Redis, 记录超过 * 微秒 内的命令执行情况.
需要注意的是, 设置负数表示禁用 slowlog , 而设置 0 则强制记录每个命令的执行情况.
以下是 slowlog 的设置使用说明:
- Redis 127.0.0.1:6379>config set slowlog-log-slower-than 10000
- "OK"
- Redis 127.0.0.1:6379>config get slowlog-log-slower-than
- 1) "slowlog-log-slower-than"
- 2) "10000"
那么问题又来了, slowlog 是记录再内存中的, 如果记录所有的命令 log 会不会把内容撑爆呢?
答案是当然不会. slowlog 记录的 log 数是有最大长度限制的, 我们可以通过 slowlog-max-len 来查询 slowlog 的最大长度. 最小值为零. 当一个新的命令被记录下来, 并且如果已经达到它的最大长度时, 最老的一个 log 将从队列中删除, FIFO .
另外, 使用 slowlog len 命令可以查看当前已记录的数量.
使用 slowlog reset 重置已记录的 slowlog 信息.
如何阅读 slowlog
我们已经了解 slowlog 是记录在内存中的, 所以您可以启用所有命令的日志记录即 slowlog-log-slow-than 配置参数设置为 0 便于监测性能.
要读取 slowlog, 使用 SLOWLOG GET 获取命令, 它返回慢日志中的每一个条目. 可以只返回 N 个最近的条目, 将一个附加参数传递给命令 (例如 SLOWLOG GET 2).
- Redis 127.0.0.1:6379> slowlog get 2
- 1) 1) (integer) 14 //slowlog 唯一标识
- 2) (integer) 1309448221 //unix 时间戳
- 3) (integer) 15 // 命令执行的时间, 单位: 微秒
- 4) 1) "ping" // 具体执行的命令, 最多记录 128
- 2) 1) (integer) 13
- 2) (integer) 1309448128
- 3) (integer) 30
- 4) 1) "slowlog"
- 2) "get"
- 3) "100"
- // 其中 Redis 4.0 及以上版本还包含以下两部分:
- 5) "127.0.0.1:58217" // 客户端 IP:Port
- 6) "worker-123" // 客户端名称
最后, 需要注意此命令需要 2.2.12 及以上版本的 Redis 才能支持.
来源: https://www.cnblogs.com/Nuss/p/9784732.html