专栏首页运维录Redis性能分析

Redis性能分析

前言

redis性能分析常见的有以下几个方面:

  • redis slowlog分析
  • SCAN,SSCAN,HSCAN和ZSCAN命令的使用方法
  • redis是否受到系统使用swap
  • redis watchdog定位延时
  • 关于redis的延时监控框架,可参考官网资料下面我们分别从这几个方面来介绍
redis slowlog分析
  1. 慢查询设置在Redis中有两种修改配置的方法,一种是修改配置文件
slowlog-log-slower-than 10000  #查询时间超过10ms的会被记录  
slowlog-max-len 128            # 最多记录128个慢查询  

另一种是使用config set命令动态修改.例如下面使用config set命令将slowlog-log-slower-than设置为20000微秒.slowlog-max-len设置为1024

config set slowlog-log-slower-than 20000
config set slowlog-max-len 1024
config rewrite

如果需要将Redis将配置持久化到本地配置文件,要执行config rewrite命令,如果slowlog-log-slower-than=0会记录所有命令,slowlog-log-slower-than<0对于任何命令都不会进行记录

  1. 获取慢查询日志slowlog get [n]
127.0.0.1:6379> slowlog get 15
 1) 1) (integer) 79674  #slowlog的唯一编号
    2) (integer) 1523350838 #此次slowlog事件的发生时间  
    3) (integer) 2987577    #耗时,以微秒为单位
    4) 1) "KEYS"
       2) "mid_cache_app_list_*"
  1. 获取慢查询日志列表当前长度
127.0.0.1:6379> slowlog len
(integer) 128
  1. 慢查询日志重置
slowlog reset
  1. 建议:slowlog-max-len 建议线上设置为1000以上slowlog-log-slower-than对高流量场景应该设置在1毫秒以上慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令的实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞.
SCAN,SSCAN,HSCAN和ZSCAN命令的使用方法
  1. SCAN是基于游标的迭代器。每次调用命令时,服务器返回一个更新的游标,用户需要在下一次调用中用作游标参数。当游标设置为0时,迭代开始,并且当服务器返回的游标为0时终止迭代开始游标值为0的迭代,并调用SCAN,直到返回的游标再次为0,称为完全迭代
127.0.0.1:6379> scan 0  
127.0.0.1:6379> scan 0 count 20 #指定输出的数量
127.0.0.1:6379> scan 0 match *mid_sent*   #类似于keys命令按模式匹配
  1. sscan查询sets集合的方法:
redis 127.0.0.1:6379> sadd setone 1 2 3 foo foobar feelsgood  
(integer) 6  
redis 127.0.0.1:6379> sscan setone 0 match f*  
1) "0"  
2) 1) "foo"  
   2) "feelsgood"  
   3) "foobar"  
  1. hscan查询hash集合的方法:
redis 127.0.0.1:6379> hmset hash name Tom age 35  
OK  
redis 127.0.0.1:6379> hscan hash 0  
1) "0"  
2) 1) "name"  
   2) "Tom"  
   3) "age"  
   4) "35"  
  1. Linux内核启用了透明巨页功能时,Redis在使用fork调用之后会产生大的延迟代价,以便在磁盘进行数据持久化
echo never > /sys/kernel/mm/transparent_hugepage/enabled  

需重启redis才能生效

redis是否受到系统使用swap
#查找redis进程id: 
redis-cli -p 6319 info|grep process_id  
process_id:9213  
#查看redis进程的内存使用信息: 
cd /proc/9213
#查看该进程使用swap分区的统计信息,以不使用或只有少量的4kB为佳: 
cat smaps | grep 'Swap:'  
#同时打印出内存映射和swap使用信息:查看那些较大的内存消耗是否引发了大的swap使用  
cat smaps | egrep '^(Swap:Size)'  
redis watchdog定位延时

注意:实验功能,请确保redis数据已备份,会对redis服务性能产生影响

Redis software watchdog  
#该功能只能动态启用,使用以下命令: 
CONFIG SET watchdog-period 500  
#注:redis会开始频繁监控自身的延时问题,并把问题输出到日志文件中去。 
  
#关闭watchdog: 
CONFIG SET watchdog-period 0  
Redis latency monitoring framework
CONFIG SET latency-monitor-threshold 100 

默认情况下,阈值设置为0,即禁用redis监控。实际上启用该监控功能,对redis所增加的成本很少.

LATENCY命令的使用方法

  1. 查看最新的延时事件
127.0.0.1:6379> latency latest  
1) 1) "command"     #event name  
   2) (integer) 1480865648     #发生时间  
   3) (integer) 207     #耗时,毫秒  
   4) (integer) 239     #从redis启动或上次latency reset以来,这种事件的最大延时记录  
  1. 查看延时事件的历史信息
127.0.0.1:6379> latency history command  
  1) 1) (integer) 1480865710  
     2) (integer) 207  
  2) 1) (integer) 1480865711  
     2) (integer) 217  
  1. LATENCY DOCTOR延时事件统计信息的智能分析与建议
127.0.0.1:6379> latency doctor  
Dave, I have observed latency spikes in this Redis instance.  
You don't mind talking about it, do you Dave?  
1. command: 5 latency spikes (average 300ms, mean deviation 120ms,  
  period 73.40 sec). Worst all time event 500ms.  
I have a few advices for you:  
- Your current Slow Log configuration only logs events that are  
  slower than your configured latency monitor threshold. Please  
  use 'CONFIG SET slowlog-log-slower-than 1000'.  
- Check your Slow Log to understand what are the commands you are  
  running which are too slow to execute. Please check  
  http://redis.io/commands/slowlog for more information. 

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 青出于蓝 | 比Redis快5倍的KeyDB

    KeyDB与Redis协议,模块和脚本完全兼容。这包括对事务的完全支持和脚本的原子执行。

    王知无
  • 面试官问我:Redis 内存满了怎么办?

    我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。

    用户4143945
  • 「微服务架构」我们如何设计配额微服务来防止资源滥用

    随着业务的增长,Grab的基础设施已经从一个单一的服务变成了几十个微服务。这个数字很快就会以数百的形式出现。随着我们的工程团队并行发展,拥有一个微服务框架可以提...

    首席架构师智库
  • Redis入门-贰

    在上次的Redis的文章中,大致的讲了下Redis是什么,为什么使用Redis,Redis为什么适用于做缓存以及对它的5种数据类型做的简单介绍。

    用户5521279
  • Redis乐观锁实现一个秒杀系统

    大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个”version”...

    攻城狮的那点事
  • Redis如何高效可靠地实现主从复制?终于有人讲明白了

    Redis支持主从复制功能,用户可以通过执行slaveof命令或者在配置文件中设置slaveof选项来开启复制功能。例如,现在有两台服务器—127.0.0.1:...

    华章科技
  • 揭开Redis“附近的人”的神秘面纱

    前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。而Redis另辟蹊径,结合其有序队列...

    黄泽杰
  • 详解 Redis 内存管理机制和实现

    Redis是一个基于内存的键值数据库,其内存管理是非常重要的。本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略。

    remcarpediem
  • 微服务架构下的分布式限流方案思考

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。缓存、降级和限流是保护微服务系统运行稳定性的三大利器。

    IT大咖说
  • 面试官: 两个Redis实例怎么快速对比哪些数据不一致

    redis-full-check 是阿里云Redis&MongoDB团队开源的用于校验2个redis数据是否一致的工具,支持单节点、主从、集群版、以及多种pro...

    冷冷

扫码关注云+社区

领取腾讯云代金券