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参数不当引发的问题总结的更多相关文章

  1. mysql参数max_binlog_cache_size设置不当引发的血案

    日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑.最近又遇到经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训是资料里的模板,真的是误人子弟呀),其中把max_binl ...

  2. 一个参数大小写引发的uploadify报错 "Syntax error, unrecognized expression: #"

     上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2  报错原因:参数ID[hi ...

  3. Proguard中optimize设置不当引发SimException

    今天来说一下Proguard中关于optimize的问题.先上一张异常图片 最近项目重构,重新调整了各个组件之间的依赖关系.过程中,在项目Proguard这块卡住了,最开始还好,Proguard只是提 ...

  4. 随机数使用不当引发的生产bug

    前几天负责的理财产品线上出现问题:一客户赎回失败,查询交易记录时显示某条交易记录为其他人的卡号. 交易的链路如下: 出现该问题后,我们对日志进行了分析,发现主站收到的两笔流水号完全相同,然而主站却没有 ...

  5. NSTimer使用不当引发的内存泄漏问题

    NSTimer可以用来执行一些定时任务,比较常用的方法就是: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTar ...

  6. Web安全开发之验证码设计不当引发的撞库问题

    感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复.以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题,甚至在一些银行或者电商的登录与查存页面同样存在这个问题,一旦造成撞库无论对 ...

  7. Select 使用不当引发的core,你应该知道的

    排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏 ...

  8. php 扩展 suhosin 配置不当引发的报错及其解决方法

    1. /var/log/messages 频繁报错: Jul :: localhost suhosin[]: ALERT - script tried to increase memory_limit ...

  9. RestTemplate使用不当引发的问题分析

    背景 系统: SpringBoot开发的Web应用: ORM: JPA(Hibernate) 接口功能简述: 根据实体类ID到数据库中查询实体信息,然后使用RestTemplate调用外部系统接口获取 ...

随机推荐

  1. THUWC2020 划船记

    PS:THUWC2020在2019年 Day 1 考场外的太懒了不写了. 三题题目大意: T1: T2: 给定一个\(n(\leq 10^5)\)个结点的有向图,每条边有个limit,表示经过这条边l ...

  2. 64、Spark Streaming:StreamingContext初始化与Receiver启动原理剖析与源码分析

    一.StreamingContext源码分析 ###入口 org.apache.spark.streaming/StreamingContext.scala /** * 在创建和完成StreamCon ...

  3. vue中使用vue-pdf插件显示pdf

    最近项目需求需要在vue中展示pdf,上网搜索了实现方法,找到vue-pdf这个插件非常好用,并且还有许多方法.属性能进行功能扩展. 一.安装 npm install --save vue-pdf 二 ...

  4. 无人机一体化3DGIS服务平台

    随着无人机技术的发展,无人机携带多种设备为GIS应用提供多元化海量基础数据.无人机航测更是以快速.灵活.高效的数据获取方式,迅速扩大了现有的GIS市场,同时GIS行业的广泛应用也推动了无人机技术的发展 ...

  5. es6学习1:let和const

    一:let   类似var 但是所声明的变量,只在let命令所在的代码块内有效. 1) 不存在变量提升 // var 的情况 console.log(foo); // 输出undefined var ...

  6. 2015-2016-2《Java程序设计》团队博客4

    一.类结构图 这一周将所有的类都进行了实现,以下是这周实现的类图:         二.项目进展 目前已经将所有代码都编写完成,正在进行整体测试.虽然期间遇到了一些问题,但我们一起进行了讨论,并查找了 ...

  7. 学习opencv(1)

    目录 CV_8UC3 Scalar--颜色赋值 using namespace cv找不到命名空间 waitKey() getTickCount() 引用 CV_8UC3 a) 存放单通道图像中像素: ...

  8. 团队作业-Alpha(2/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:http://edu.cnblogs.com/campus/fzu/SoftwareEngineeri ...

  9. 快速激活Navicat Premium 12

    Navicat Premium 12是一套数据库开发管理工具,支持链家MySQL.Oracle.SQL server等多种数据库,快速便捷创建.管理和维护数据库 一.下载 https://www.na ...

  10. ukulele弹奏模拟器v1.0(待完善)

    写在前面 最近听beyond乐队的<灰色轨迹>听上瘾了,300多遍,震惊!!尤其喜欢最后一分半钟的吉他solo,真可谓吉他没有酒,依然让我醉如老狗.. 翻了翻网上的视频,瞬间觉得单身20年 ...