钉钉收到同事反馈:突然大量用户反馈进入网页很慢,登录服务器一看,Redis调用时间严重超时。太可悲,高速的缓存反而变成了短板,由于数据一直没有返回,导致了请求响应变慢。
1 现象
- 前端页面响应慢
- 接口返回慢
- redis调用严重超时
2 排查
2.1 环境检查
- 服务器的 CPU 负载
- 内存
- 网络输入输出
- QPS
- 连接数
上面指标查看方式很多,linux命令行、外部软件(Grafana,zabbix)或者redis的info命令都可以查看,不具体演示
2.2 redis检查
- 通过 info commandstats 可以查看 Redis 命令统计信息
生产环境不方便截图,所以截图本地环境演示命令
命令结果含义如下:
cmdstat_XXX: calls=XXX,usec=XXX,usec_per_call=XXX
//cmdstat_XXX: xxx 命令
//calls: 调用次数
//usec: 耗费CPU时间
//usec_per_call:每个命令平均耗费CPU(单位为微秒)
- 通过 slowlog 命令查看慢命令
默认超过 10ms 就会被记录到日志,只会记录其命令执行的时间,不包含 IO 往返操作,也不记录单由网络延迟引起的响应慢
SLOWLOG GET
或者 SLOWLOG GET number
命令,前者打印所有 slow log ,最大长度取决于 slowlog-max-len 选项的值,而 SLOWLOG GET number 则只打印指定数量的日志。
xxxxx> slowlog get 10
3) 1) (integer) 411
2) (integer) 1545386469
3) (integer) 232663
4) 1) "keys"
2) "test:*"
命令的结果含义
1=日志的唯一标识符
2=命令的执行时间点,以UNIX时间戳表示
3=查询命令执行时间,以微妙为单位
4=执行的命令,以数组的形式排列。完整的命令是 keys test:*
所以通过这些参数,基本可以确定,是突然有大量的keys *命令导致CPU负载升高,导致响应延迟
3 处理
- 禁用
禁用的具体做法是,修改服务器的配置文件redis.conf,在SECURITY这一项中,我们新增以下命令:
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
- 重命名
修改服务器的配置文件redis.conf,在SECURITY这一项中,我们新增以下命令,重启服务器后,则需要用新命令来执行操作,否则服务器会报错 unknown command。
rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC81TbdkSmLAzRPmcarcR
rename-command FLUSHDB qf69aZbLAX3cf3ednHM3SOlbpH71yEXLAX3cf3e
rename-command CONFIG FRaqbC8wSA1XvpFVjCRGryWtIIZS2TRvpFVjCRG
rename-command KEYS eIiGXix4A2DreBBsQwY6YHkidcDjoYA2DreBBsQ
修改配置文件
重启redis-server后