jedis参数不当引发的问题总结
jedis参数不当引发dubbo服务线程池耗尽异常
现象:一个dubbo服务偶发性的出现个别机器甚至整个集群大量报线程池耗尽的问题。一开始对问题的处理比较粗暴,直接增加了10倍的线程数。但是问题依然偶尔出现,重启服务就可以暂时解决。后来,发现问题出现频率有点高,不得不花点时间认真分析了。
实际原因:jedis参数设置不当。实际仔细分析问题后发现每次出现异常最开始都是出现了大量的jedis连接池获取连接异常:
redis.clients.jedis.exceptions.JedisConnection: Could not get a resource from the pool
...省略其他堆栈信息
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect time out
...省略其他堆栈信息
而这些time out实际是redis节点故障或者网络抖动引起的。然后看看jedis配置,timeout设置为1000,maxRedirect为2,所以一旦出现redis连接问题,将会导致请求阻塞3s左右。而此服务的qps分摊到单机约为200,阻塞导致了dubbo请求的堆积,进而导致雪崩。处理方法:缩短timeout;去除redirect;根据业务请求考虑增加熔断组件。
另外通过jstack分析,发现一旦出dubbo线程池耗尽的问题,大量的dubbo处理线程都是处于WAITING(parking)状态,卡顿在获取redis连接。分析jedis连接管理相关代码,jedis连接池使用ReentrantReadWriteLock管理,获取连接涉及锁资源的争夺,而redis server节点无法连接将导致连接池需要尝试创建新的连接,这个过程会拿走写锁,导致其他需要通过读锁获取连接的线程进入等待。所以
也需要根据qps设置maxTotal(这个出现问题的jedis居然设置的连接数为10!)。
spark服务使用jedis访问redis导致redis服务毛刺
我们所使用的redis cluster集群是个比较大集群,具有数十个节点,集群的读写压力都相当大。其中一部分读写操作来自其他同事维护的spark服务,使用jedis访问。
现象:发现redis的响应时间出现有规律的毛刺。
DBA排查发现redis集群的一个节点的负载相对于其他节点比较高,而且出现大量的cluster slots命令。
分析:分析jedis源码,jedis每次初始化创建连接都是从第一个节点开始尝试并执行cluster slots命令来获取整个redis cluster集群的拓扑信息;如果jedis连接池获取的连接失效,也会执行renewSlotCache,renewClotCache也是会执行cluster slots命令的。
经过推断及分析,问题出在spark使用jedis的模式上,spark每个批次任务都会创建新的jedis连接,批次处理完成即销毁掉,所以spark任务执行过程中会反复执行jedis连接池的初始化进而执行cluster slots命令,而从DBA了解到cluster slots命令是比较耗资源的,所以导致了第一个节点负载比较高(jedis连接串固定的,所以第一个节点总是被执行cluster slots命令)。
处理:通过打散jedis连接串上节点的顺序来避免总是固定的第一个节点被用来执行cluster slots。此方法实施后,毛刺确实消失了。
疑问:上述方法可以说只是缓解了redis节点负载不均衡的问题,但是由于对spark使用不太了解,所以暂时不知道是否有办法在多个批次任务间共享jedis连接。
jedis参数不当引发的问题总结的更多相关文章
- mysql参数max_binlog_cache_size设置不当引发的血案
日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑.最近又遇到经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训是资料里的模板,真的是误人子弟呀),其中把max_binl ...
- 一个参数大小写引发的uploadify报错 "Syntax error, unrecognized expression: #"
上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2 报错原因:参数ID[hi ...
- Proguard中optimize设置不当引发SimException
今天来说一下Proguard中关于optimize的问题.先上一张异常图片 最近项目重构,重新调整了各个组件之间的依赖关系.过程中,在项目Proguard这块卡住了,最开始还好,Proguard只是提 ...
- 随机数使用不当引发的生产bug
前几天负责的理财产品线上出现问题:一客户赎回失败,查询交易记录时显示某条交易记录为其他人的卡号. 交易的链路如下: 出现该问题后,我们对日志进行了分析,发现主站收到的两笔流水号完全相同,然而主站却没有 ...
- NSTimer使用不当引发的内存泄漏问题
NSTimer可以用来执行一些定时任务,比较常用的方法就是: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTar ...
- Web安全开发之验证码设计不当引发的撞库问题
感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复.以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题,甚至在一些银行或者电商的登录与查存页面同样存在这个问题,一旦造成撞库无论对 ...
- Select 使用不当引发的core,你应该知道的
排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...
- php 扩展 suhosin 配置不当引发的报错及其解决方法
1. /var/log/messages 频繁报错: Jul :: localhost suhosin[]: ALERT - script tried to increase memory_limit ...
- RestTemplate使用不当引发的问题分析
背景 系统: SpringBoot开发的Web应用: ORM: JPA(Hibernate) 接口功能简述: 根据实体类ID到数据库中查询实体信息,然后使用RestTemplate调用外部系统接口获取 ...
随机推荐
- 缺失值处理(Missing Values)
什么是缺失值?缺失值指数据集中某些变量的值有缺少的情况,缺失值也被称为NA(not available)值.在pandas里使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值 ...
- 洛谷P1270 访问美术馆
题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...
- GoCN每日新闻(2019-10-22)
GoCN每日新闻(2019-10-22) GoCN每日新闻(2019-10-22) 1. Go 集成测试:https://www.ardanlabs.com/blog/2019/10/integrat ...
- MSSQL手工注入 报错注入方法
例子:www.kfgtfcj.gov.cn/lzygg/Zixun_show.aspx?id=1[1]首先爆版本:http://www.kfgtfcj.gov.cn/lzygg/Zixun_show. ...
- QML学习(三)——<QML命名规范>
QML对象声明 QML对象特性一般使用下面的顺序进行构造: id 属性声明 信号声明 JavaScript函数 对象属性 子对象 状态 状态切换 为了获取更好的可读性,建议在不同部分之间添加一个空行. ...
- 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System
目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...
- Unity创作赛车游戏的四款插件
本文,我们将介绍其中4款:Racing Game Starter Kit.GeNa 2 .NWH Vehicle Physics.Curvy Splines. Racing Game Starter ...
- Java基础 三目运算符 在嵌套时,使用括号
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Oracle系列六 分组函数
分组函数作用于一组数据,并对一组数据返回一个值. 组函数类型 AVG COUNT MAX MIN STDDEV SUM 组函数语法 SELECT [column,] group_function(co ...
- xmlns:amq="http://activemq.apache.org/schema/core"报错
如题,项目集成ActiveMQ是配置文件报错 原因是:Spring命名空间配置错误,缺少相应的spring-bean.很显然,引用不到就是没有jar包啊. 我的解决办法,早pom.xml引用依赖 &l ...