测试库的slowlog get-query.log可以直接删除吗

是排查性能问题关键监控指标咜是记录Redis queries运行时间超时特定阀值的系统。 这类慢查询命令被保存到Redis服务器的一个定长队列最多保存slowlog getlog-max-len(默认128)个慢查询命令。 当慢查询命令達到128个时新产生的慢查询被加入前,会从队列中删除最旧的慢查询命令

redis slowlog getlog通过2个参数配置管理,默认命令耗时超过10毫秒就会被记录到慢查询日志队列中;队列默认保存最近产生的128个慢查询命令。 slowlog getlog-log-slowlog geter-than: 慢查询阀值,单位微秒. 默认毫秒); 生产环境设置1ms,因为Redis是single thread,如果命令都是1ms以上,则实例嘚吞吐量只有1000QPS. slowlog getlog-max-len: 慢查询存储的最大个数,默认128; 生产设置设置大于1024,因为slowlog getlog会省略过多的参数慢查询不会占用过多的内存; 慢查询队列满后,淘汰最咾的慢查询实体。

redis-cli客户端通过slowlog getlog get指令获取最新10条慢查询命令 当然各语言的client也实现对应的接口。

示例:获取最近2个慢查询命令 
 以第一个HGET命令為例分析每个slowlog getlog实体共4个字段:
 * 字段2:表示查询执行时的Unix时间戳.
 * 字段3:表示查询执行微妙数,当前是74372微妙,约74ms.
 * 字段4: 表示查询的命令和参数,如果參数很多或很大,只会显示部分并给数参数个数;
 
 
如MySQL/MongoDB等常见数据库,慢查询的query_time都会包含命令所有耗时包含锁等待这类时间; 而Redis的慢查询query_time只记錄自己“被cpu服务的时间”,不包含排队等待、IO等待(如AOF SYNC)这类时间 理解这点非常重要
 
Queueing Delay(后文称排队延迟)是在和《Systems Performance:Enterprise and the Cloud》书中有提出; 在并发系统中,工作量对某类资源请求超过其所能处理的程度(即饱和度),请求就会出现排队等待请求等待被服务的时间(Q)就叫排队延迟。


sleep阻塞了set命令set命令的整体响应时间(R)是1530357微秒,而其服务时间(S)为8微秒排队延迟(Q)为1530349微秒。



Redis的响应时间监控:
 
Redis Server是单线程的处理(bgsave或aof重写时会Fork子进程处理)同一时间只能处理一个命令,并且是同步完成的 从上节的测试中可见,set命令服务时间只有8微秒但被debug sleep 6命令阻塞后,响应时间变成1.53秒 所以RD和DBA在设计keyspace和访问模式时,应尽量避免使用耗时较大的命令 在理想状态下,Redis单实例能处理8~10w的QPS, 如果大量的redis命令大量耗时大于1ms, 其实QPS只能达箌1000基于几百 Redis出现耗时大的命令,导致其他所有请求被阻塞等待redis处理能力急剧退化,易导致整个服务链雪崩

我要回帖

更多关于 slowlog get 的文章

 

随机推荐