环境:
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)