码迷,mamicode.com
首页 > 其他好文 > 详细

Redis CPU占用率过高问题定位处理

时间:2015-11-27 23:19:53      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

     以Redis作为缓存的项目在即将发布时碰到一个奇怪的问题:新布署的软件包在进行压力测试时Redis服务器的CPU利用率竟然达到了100%.于是回退代码,对比即将发布的包与老包的差异,同时分别在对应的Redis服务器上运行info Commandstats命令进行抓包分析,发现如下现象:

技术分享

如上所示上面二个截图为布署老包时1分钟之内Redis服务器执行的所有命令;

在这里我们可以清晰的看到1分钟之内Redis 收到的ping命令次数大概为:6237822-5903451=334371;
布署新包后Redis在1分钟之内接收到的ping命令情况如何呢?如下所示:
技术分享

1分钟内Redis接收到的ping命令次数为:33709828 - 33111344 = 598484 ;

通过对比,我们发现Redis在接收到的其它命令基本相当的情况下,布署新包与布署老包时在Redis服务器上执行的ping 命令相差竟然达到了50%。那么是什么原因导致此问题的产生呢?
在Redis的配置中我们看到如下二个参数:
技术分享
当上述二个参数全部设置为true时意味着Jedis在获取连接和释放连接时,都会先发送ping命令来检测Jedis与Redis服务器之间是否连接正常。
对比不同包中的上述二参数,发现新包中将上述二参数全部设置为true,而老包中却将上述二值设置为false.至此问题得到了解决。
但是如果将上述二者设置为false表明,在获取连接和释放连接时,不再检测Jedis与Redis之间连接是否正常,很显然这种做法比较粗暴,那么有没有办法每隔单位时间发送一条ping命令来检测Jedis与Redis服务器之间的可达性呢? Redis提供给了我们这种选择,具体配置如下:
testOnBorrow.REL=false
testOnReturn.REL=false
timeBetweenEvictionRunsMillis=60000       -------每隔60秒定期检查空闲连接
minEvictableIdleTimeMillis=120000           ---------连接在池中保持空闲而不被空闲连接回收器线程回收的最小时间值,单位毫秒                   
numTestsPerEvictionRun=-1                     ----------空闲连接扫描时,每次最多扫描的连接数,一般设置为-1,全部扫描
设置成这样之后就不用每次都检测Jedis与Redis之间是否可达了,顺便也提高了应用的性能。
另外:redis定位问题的思路可以参见:

Redis CPU占用率过高问题定位处理

标签:

原文地址:http://www.cnblogs.com/moonandstar08/p/5001825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!