springboot下,JedisPool getResource导致大量线程WAITING,服务假死

在SpringBoot 2.1.4.RELEASE应用中,使用JedisPool时发现服务出现线程WAITING状态,导致超时和假死现象。排查发现,大量线程在JedisPool.getResource时被阻塞,原因是连接Redis时可能超时且max-wait配置为-1,使得线程持续等待。解决方案是将max-wait设为正值以限制等待时间,避免线程堆积。
摘要由CSDN通过智能技术生成

环境:

springboot版本2.1.4.RELEASE、jedis连接池

服务配置:

设置了tomcat最大线程数为1000:

server:
  port: 9090
  tomcat:
    uri-encoding: utf-8
    max-threads: 1000

jedis连接池配置:

      pool:
        max-active: 300  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1  # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 100  # 连接池中的最大空闲连接
        min-idle: 20   # 连接池中的最小空闲连接

现象:

1、浏览器访问业务接口链接,报超时,且服务日志没有接口相关日志输出

2、Eureka控制台上能够看到该服务节点,且状态正常

3、打开服务日志查看,每隔5分钟,和Eureka通讯一次

23:47:36.206 INFO  [trap-executor-0] c.n.d.s.r.a.ConfigClusterResolver - Resolving eureka endpoints via configuration
23:52:36.206 INFO  [trap-executor-0] c.n.d.s.r.a.ConfigClusterResolver - Resolving eureka endpoints via configuration
23:57:36.206 INFO  [trap-executor-0] c.n.d.s.r.a.ConfigClusterResolver - Resolving eureka endpoints via configuration

排查:

jps

top -Hp pid

发现 Threads:  1017 total
这么多的线程说明服务不正常,正常来说,线程数也就80多,100以内。

继续排查

jstack pid

发现有大量线程处于WAITING状态:

"http-nio-9084-exec-1059" #18281 daemon prio=5 os_prio=0 tid=0x00007f951cc17000 nid=0x75de waiting on condition [0x00007f947d1cf000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000801d03f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值