https://weibo.com/ttarticle/p/show?id=2309404650615585505652
前几篇日志总结了下对Redis部署时的一些配置,Redis启动后,面对各种请求,数据持久化到硬盘,很可能会出现内存不足等故障问题,导致Redis速度变慢甚至崩溃。在Redis运行前我们可以做很多配置防止这些问题的出现,在Redis运行后,面对未知的突发情况,出现问题了,其实我们也可以用一些命令查看,发现它,例如使用SLOWLOG命令查看Redis中的慢查询操作。
Redis运行后,怎么查看它的运行状态来判断当前服务器发生了什么,有没有可能正在出现着某些问题,我们可以用INFO STATS、INFO peresistence等命令显示运行中Redis的一些状态信息:
INFO STATS命令显示的状态数据,重点看黄色高亮的这些:
total_connection_received:表示服务器接收的总连接数,如果某一时间有大量的连接请求,可能会占满CPU。
instantaneous_ops_per_sec:表示Redis每秒处理的命令数。
rejected_connection:表示当Redis达到最大连接数后,再次收到连接请求时拒绝的连接数。
sync_full:表示当前主实例和从实例进行完全同步的次数。
sync_partial_ok:表示进行部分同步的次数。
sync_partial_error:表示部分同步未能完成的次数。
evicted_keys:表示当内存达到maxmemory,也就是内存不足时,淘汰的键的数量。
keyspace_misses:表示查找未命中的键的数量,如果发现Redis运行过程中这个值很高,那么表示程序出了一些问题。
latest_fork_usec:表示上一次fork操作消耗的时间。
除了INFO STATS命令外,还可以用INFO persistence命令,查看Redis持久化信息,包括RDB和AOF两种,这些信息很重要,如果磁盘满了,Redis持久化就会失败,一些重要的数据可能会丢失:
例如一些信息如下:
loading:标识服务器是否正在加载持久化文件
rdb_changes_since_last_save:表示最近一次成功生成rdb文件时写入的命令个数。
rdb_bgsave_in_progress:表示服务器是否正在创建rdb文件。
rdb_last_save_time:表示最近一次成功生成rdb文件的时间戳。
rdb_last_bgsave_status:标识最近一次rdb持久化是否成功。
rdb_last_bgsave_time_sec:表示最近一次成功生成rdb文件消耗的时间。
rdb_current_bgsave_time_sec:表示当前服务器正在创建rdb文件的操作已经消耗的时间
rdb_last_cow_size:表示RDB过程中父进程与子进程比较执行了多少修改操作。
如果在Redis执行过程中,出现某些查询操作很慢才能完成,我们可以使用SLOWLOG命令来识别,看看是查询操作问题,还是CPU等其他问题。识别慢查询的实现就是记录某条命令的执行时间是否超过了设定的阈值,一条客户端命令经历从发送到等待执行,到执行命令最后返回结果四个阶段,要注意的是Redis慢查询识别记录的只是命令执行消耗的时间,所以当SLOWLOG命令识别没有慢查询时,不代表客户端没有超时问题,因为还有发送命令阶段,如果遇到网络阻塞,那么超时问题还是会出现。下面来看下SLOWLOG命令的具体使用。
测试前首先用CONFIG SET slowlog-slower-than命令来设置这个慢查询的阈值,单位为微秒,所以我们可以先设成5,一个非常小的值,然后执行一些简单的SET、HMSET命令,最后使用SLOWLOG GET命令,输出得到所有执行时间超过5微秒的操作:
这些操作设定阈值的操作都会被记录一个先进先出的队列中,这个队列最多可以容纳多少条操作记录取决于slowlog-max-len参数,这些记录只会存在于内存中,不会持久化到磁盘上,所以操作SLOWLOG识别慢查询时,执行速度很快。除此之外,使用SLOWLOG LEN命令来获取记录慢操作日志中的记录的数量,如上图可以看到,有两条消耗时间超过设定阈值的慢操作被记录在了日志中,想要清除慢操作记录使用的命令是SLOWLOG RESET。