标签:
以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