hystrix 配置了较大的核心线程数导致wating线程过多的问题

在Spring Cloud Camden.SR7版本中,使用Hystrix并配置了较大核心线程数会导致等待线程过多。当Feign调用服务时,每次请求都会新建线程,因核心线程数未达到最大线程数,线程不会退出,形成循环等待。解决方案包括动态调整线程池参数,或者自定义HystrixConcurrencyStrategy创建线程池。此外,通过Java代码或shell命令可以获取Hystrix线程池信息。
摘要由CSDN通过智能技术生成

环境
spring cloud 版本 Camden.SR7
开启Hystrix

背景 
当通过hystrix.threadpool.default.coreSize设置核心线程数量时 创建线程池时核心线程数和最大线程数都使用的它
当执行feign逻辑时 会判断当前线程数是否小于最大线程数 所以每次都会新建一个线程来执行网络请求
当请求执行完毕以后由于当前线程数不大于核心线程数(永远满足不了)所以不会退出死循环 而是从队列中获取请求 没有的话将阻塞
如果coreSize设置的过大  通过feign调用的服务过的 且每个服务调用的次数足够多 将导致wating线程数很大 
当核心线程数设置为200  5个服务持续调用  当调用1000次后线程总数将达到1000  每个服务200线程 如果并发底的话 可能只有几个线程在工作 其他线程都在睡觉

解决方式
方式一
 获取进程hystrix线程的waiting和running的比列  根据比列来设置线程池的参数
获取hystrix线程数量可以通过shell命令或java代码
shell命令:通过jstack -l ${pid} >> thread.dump 获取dump文件 
通过grep分析 如cat hystrix.dump|grep hystrix-[|wc -l]       通过网站分析 https://www.fastthread.io
通过反射获取threadPool修改核心线程数和最大线程数与允许最大空闲时间
####方式二:直接把HystrixConcurrencyStrategy换掉由自己来创建线程池
建立相同的包 把代码copy一份想怎么改就这么改

java代码获取hystrix线程池信息   也可以到HystrixCircuitBreaker里面获取

Field field = ReflectionUtils.findField(HystrixThreadPool.Factory.clas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值