文档章节

redis操作耗时较高问题排查记录

燃犀
 燃犀
发布于 2017/07/26 09:23
字数 861
阅读 83
收藏 0

1、问题描述


某系统在2017/07/21监控高耗时交易时发现在两个时间点缓存操作耗时较高,详情如下:
时间点一:2017/07/21  15:24:51

LogTime=2017-07-21 15:24:51.242 costTime=372.078ms class=com.dap.cache.api.CacheClien


时间点二: 2017/07/21  15:31:16

LogTime=2017-07-21 15:31:16.412 costTime=455.279ms class=com.dap.cache.api.CacheClient

2、排查过程


2.1慢日志配置


生产环境redis配置了慢日志参数
查看redis慢日志配置,登陆redis服务器,使用redis-cli客户端连接redis  server
 

127.0.0.1:6301> config get slow*
1) "slowlog-log-slower-than"
2) "10000"
3) "slowlog-max-len"
4) "1000"
127.0.0.1:6301> 

慢日志说明:
config  get  slow* 查询有关慢日志的配置信息

查询结果第一条:  1) "slowlog-log-slower-than" 慢日志阈值配置项
查询结果第二条:  2) "10000" 阈值 ,单位微秒,此处为10毫秒,即超过10毫秒的操作都会记录下来
查询结果第三条:  3) "slowlog-max-len"  慢日志记录保存数量,如果保存数量已满,会删除最早的记录,最新的记录追加进来
查询结果第四条:  4) "1000" 慢日志记录保存数量的阈值,此处保存1000条记录

查看慢日志记录


查看redis慢日志记录,登陆redis服务器,使用redis-cli客户端连接redis  server
生产环境有三个节点,慢日志记录分别如下:
节点一:
 

127.0.0.1:6301> SLOWLOG GET
 1) 1) (integer) 68
    2) (integer) 1500873303
    3) (integer) 25972
    4) 1) "BGREWRITEAOF"
 2) 1) (integer) 67
    2) (integer) 1500778503
    3) (integer) 25279
    4) 1) "BGREWRITEAOF"
 3) 1) (integer) 66
    2) (integer) 1500680103
    3) (integer) 24432
    4) 1) "BGREWRITEAOF"
 4) 1) (integer) 65
    2) (integer) 1500621891
    3) (integer) 1186934
    4) 1) "keys"
       2) "*CAP:*"
 5) 1) (integer) 64
    2) (integer) 1500621779
    3) (integer) 1190078
    4) 1) "keys"
       2) "*"
 6) 1) (integer) 63
    2) (integer) 1500602102
    3) (integer) 22998
    4) 1) "BGREWRITEAOF"
 7) 1) (integer) 62
    2) (integer) 1500530702
    3) (integer) 22807
    4) 1) "BGREWRITEAOF"
 8) 1) (integer) 61
    2) (integer) 1500458102
    3) (integer) 21908
    4) 1) "BGREWRITEAOF"
 9) 1) (integer) 60
    2) (integer) 1500424802
    3) (integer) 21208
    4) 1) "BGREWRITEAOF"
10) 1) (integer) 59
    2) (integer) 1500352202
    3) (integer) 20436
    4) 1) "BGREWRITEAOF"
127.0.0.1:6301>


慢日志说明:

SLOWLOG  GET 查询当前所有的慢日志记录

显示结果列表,最左侧 1) 到 10) 有10条记录
已第四条慢日志为例说明如下:

4) 1) (integer) 65
    2) (integer) 1500621891
    3) (integer) 1186934
    4) 1) "keys"
       2) "*CAP:*"

 

4)  1) (integer) 65 值65数据类型为integer,表示该条日志的id
2) (integer) 1500621891  值1500621891数据类型为integer,表示操作redis的unix时间戳,单位秒。
3) (integer) 1186934 操作耗时,单位微秒
4)  1) "keys" 操作redis的命令 keys
2) "*CAP:*" 操作redis的命令keys 的参数,即查询所有包含CAP字符串的key

 

把操作redis的unix时间戳换算成北京时间为 2017/7/21 15:24:51 ,与某系统交易耗时的日志时间点一吻合。某系统交易耗时时间点二的问题也是如此。

结论:
Redis命令keys * 、 keys *xxx* 会遍历所有key,以查找符合条件的key,当数据量较大时该命令比较耗时,因为redis是单线程,当该命令执行的过程当中会阻塞其他命令请求,如果此时应用系统请求redis,所有的请求都会等待。在生环境中,严禁使用keys * 、 keys *xxx*,最好的办法是禁用相关命令。

补充说明:慢日志中的"BGREWRITEAOF"是redis fork的另外的线程在执行aof文件重新,该操作不会影响应用对redis的读写请求。


 

© 著作权归作者所有

共有 人打赏支持
燃犀

燃犀

粉丝 0
博文 22
码字总数 16169
作品 0
杭州
程序员
Redis 性能问题排查:slowlog 和排队延时

一、Redis Slowlog介绍 [Redis Slowlog]是排查性能问题关键监控指标。它是记录Redis queries运行时间超时特定阀值的系统。 这类慢查询命令被保存到Redis服务器的一个定长队列,最多保存slowl...

IT--小哥
10/08
0
0
redis超时原因排查

1.低效操作产生的延迟。单命令操作一半很快不会造成这样,SORT,LREM, SUNION,keys ,* 等操作都会影响响应时间。 使用进程监控程序(top, htop, prstat, 等...)来快速查看Redis进程的CPU...

Andy-xu
2016/04/02
3.1K
0
Nginx错误日志与优化专题

一、Nginx配置和内核优化 实现突破十万并发 二、一次Nignx的502页面的错误记录 (1)错误页面显示 错误日志: 2017/07/17 17:32:57 [error] 29071#0: *96 recv() failed (104: Connection re...

tinywan1227
2017/04/27
0
0
性能优化技巧知识梳理(3) - 如何排查列表卡顿问题

一、前言 如果现在用户反馈某个列表很卡,你会怎么排查问题? 这样一个简短的问题,其实考察了我们多方面的知识。要答出其中的一两个小点其实并不难,难的是如何能够由外之内,由浅入深娓娓道...

泽毛
06/20
0
0
Redis时延问题分析及应对

Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞; 当redis的数据量达到一定级别后...

古城寨主
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
47分钟前
1
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
48分钟前
2
0
记一次hbase master停止服务的原因以及恢复

在Hdfs空间不足的情况下,拒绝写入,hbase会down掉。如果hdfs空间没有清理的情况下,重新启动hbase,会报splitlog失败,原因是wal日志重写过程中会写hdfs,写不进去导致的。重启不成功。 解决...

PageYi
51分钟前
1
0
如何从平面设计转行到UI设计?

时代的变迁,科技的进步,工具的发展,薪资的差距,促使许多人转行的原因,但平面与界面两者之间有着哪些的差异呢?如果,想要转行又该具备哪些条件呢? 平面、界面设计之间的差异性 平面设计...

mo311
54分钟前
4
0
线程池整理

一般在生产环境中,我们都不会直接new一个Thread,然后再去start(),因为这么做会不断频繁的创建线程,销毁线程,过大的线程会耗尽CPU和内存资源,大量的垃圾回收,也会给GC带来压力,延长GC停顿时间...

算法之名
56分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部