redis性能分析

2018-04-10 18:11:17
前言

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

  • redis slowlog分析
  • SCAN,SSCAN,HSCAN和ZSCAN命令的使用方法
  • redis是否受到系统使用swap
  • redis watchdog定位延时
  • 关于redis的延时监控框架,可参考官网资料
    下面我们分别从这几个方面来介绍
redis slowlog分析
  1. 慢查询设置
    在Redis中有两种修改配置的方法,一种是修改配置文件

    1
    2
    slowlog-log-slower-than 10000  #查询时间超过10ms的会被记录  
    slowlog-max-len 128 # 最多记录128个慢查询

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

    1
    2
    3
    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对于任何命令都不会进行记录

  2. 获取慢查询日志
    slowlog get [n]

    1
    2
    3
    4
    5
    6
    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_*"
  3. 获取慢查询日志列表当前长度

    1
    2
    127.0.0.1:6379> slowlog len
    (integer) 128
  4. 慢查询日志重置

    1
    slowlog reset
  5. 建议:
    slowlog-max-len 建议线上设置为1000以上
    slowlog-log-slower-than对高流量场景应该设置在1毫秒以上
    慢查询只记录命令的执行时间,并不包括命令排队和网络传输时间.因此客户端执行命令的时间会大于命令的实际执行时间.因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检查该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞.

SCAN,SSCAN,HSCAN和ZSCAN命令的使用方法
  1. SCAN是基于游标的迭代器。每次调用命令时,服务器返回一个更新的游标,用户需要在下一次调用中用作游标参数。当游标设置为0时,迭代开始,并且当服务器返回的游标为0时终止迭代
    开始游标值为0的迭代,并调用SCAN,直到返回的游标再次为0,称为完全迭代

    1
    2
    3
    4
    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命令按模式匹配
  2. sscan查询sets集合的方法:

    1
    2
    3
    4
    5
    6
    7
    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"
  3. hscan查询hash集合的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    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"
  4. Linux内核启用了透明巨页功能时,Redis在使用fork调用之后会产生大的延迟代价,以便在磁盘进行数据持久化

    1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled

    需重启redis才能生效

redis是否受到系统使用swap
1
2
3
4
5
6
7
8
9
查找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服务性能产生影响

1
2
3
4
5
6
7
Redis software watchdog  
该功能只能动态启用,使用以下命令:
CONFIG SET watchdog-period 500
注:redis会开始频繁监控自身的延时问题,并把问题输出到日志文件中去。

关闭watchdog:
CONFIG SET watchdog-period 0

Redis latency monitoring framework
1
CONFIG SET latency-monitor-threshold 100

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

LATENCY命令的使用方法

  1. 查看最新的延时事件

    1
    2
    3
    4
    5
    127.0.0.1:6379> latency latest  
    1) 1) "command" #event name
    2) (integer) 1480865648 #发生时间
    3) (integer) 207 #耗时,毫秒
    4) (integer) 239 #从redis启动或上次latency reset以来,这种事件的最大延时记录
  2. 查看延时事件的历史信息

    1
    2
    3
    4
    5
    127.0.0.1:6379> latency history command  
    1) 1) (integer) 1480865710
    2) (integer) 207
    2) 1) (integer) 1480865711
    2) (integer) 217
  3. LATENCY DOCTOR
    延时事件统计信息的智能分析与建议

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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.

您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。