HI! 我是小小,今天是本周的第六篇,本篇将会着重讲解关于Redis负载的问题。

网页监控

通过阿里的Grafana监控,发现服务器的CPU负载,内存,网络输入输出相当正常,所以Redis出现问题。
使用单节点的32M 16GB的阿里云Redis,登录网页,查看性能监控,发现CPU使用飙升到100%;
线上排查 | 线上Redis负载暴涨100%,业务中断,这样排查很赞!插图
QPS从1000升高到6000,但是远远低于极限值,连接数量从0升高到3000,也就是远远低于极限值。
临时方案:先短期租用一台Redis,临时更换Redis配置,重启应用。尽快排查

服务器命令监控

登录Redis-cli,通过info命令查看服务器状态和命令统计,总结异常点:
1. 查询Reduis慢指令slowlog,以及keys_并且耗费时间严重,在当前业务下执行keys_会导致阻塞业务,导致查询国漫,cpu过稿。
2. 查看redis指令执行情况,排除exec,flushall指令,业务使用指令过程中耗时严重的有setnx有7.5千万次调用平均耗时6s,setex有8.4万次调用平均耗时7.33s,del有2.6亿吃调研耗时69s,hegtall有14亿次调用耗时20s,keys有2千万次调用平均耗时 3740s。
通常而言,这些指令耗时与 value 大小呈正比,所以可以排查这些指令相关的数据近期有没有较大增长。或者近期有没有业务改造,会频繁使用上述指令,也会造成 cpu 高。
线上排查 | 线上Redis负载暴涨100%,业务中断,这样排查很赞!插图1
通过 info commandstats 可以查看 Redis 命令统计信息,其中命令格式是

cmdstat_XXX: calls=XXX,usec=XXX,usec_per_call=XXX

调用次数、耗费CPU时间、每个命令平均耗费CPU(单位为微秒)

通过 slowlog 命令查看慢命令(默认超过 10ms 就会被记录到日志,只会记录其命令执行的时间,不包含 IO 往返操作,也不记录单由网络延迟引起的响应慢)
slowlog命令格式如下

xxxxx> slowlog get 10
 3) 1) (integer) 411           
    2) (integer) 1545386469     
    3) (integer) 232663          
    4) 1) "keys"              
       2) "mecury:*"

图中各字段表示的是:

1=日志的唯一标识符

2=命令的执行时间点,以UNIX时间戳表示

3=查询命令执行时间,以微妙为单位,🌰中的是230ms

4=执行的命令,以数组的形式排列。完整的命令是 keys mucury:*
所以通过这些参数,基本可以确定,是突然有大量的keys *命令导致CPU负载升高,导致响应延迟,问题我们应用中没有开放keys *命令
问题解决

关于作者

我是小小,双鱼座的程序猿,我么下期再见~bye