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. 洛谷P3205 合唱队

    题目 区间dp.但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路. 这个题我们首先发现每个人在插入的时候一定插入到队伍 ...

  2. 树莓派基于scratch2控制GPIO

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/raspberry_scratch2_gpio_control.m ...

  3. 使用ADO.NET

    Program using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  4. Nginx压测和并发预估

    一.Nginx并发预估 预估算法:{(?G)*1024-system}/请求大小 (?G):表示内存大小1024:表示内存容量标准进制system:表示系统和服务占用的额外内存和需要预留的内存请求大小 ...

  5. hdoj - 1342 Lotto

    Problem Description In a Lotto I have ever played, one has to select 6 numbers from the set {1,2,... ...

  6. 安装Rancher容器化管理平台

    卸载已有的避免冲突 yum remove docker  docker-common docker-selinux docker-engine   安装需要的软件包,yum-util 提供yum-co ...

  7. nginx日志切割和日志清理

    ##########################日志切割################################1.上传脚本到/usr/local/nginx/logs/下 2.并附执行权 ...

  8. debug console不见了

    点击左侧这个标志.

  9. 【Redis】Redis 发布订阅

    Redis 发布订阅介绍 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 c ...

  10. iOS开发应该知道的7个编程概念

    对流行工具(如Xcode)和编程概念(如视图控制器)的高级讨论,这些对iOS开发本身很有用. 1. Xcode Xcode是iOS应用开发社区所见过的最通用的IDE.由于集成开发环境来自Apple,它 ...