java 线程池扩容_106. 生产环境中的线程池自动扩容与缩容的动态资源分配经验...
# 106. 生产环境中的线程池自动扩容与缩容的动态资源分配经验
可能会出现一种情况,比如说我们的某个依赖在高峰期,需要耗费 100 个线程,但是在那个时间段,刚好其他的依赖的线程池其实就维持一两个就可以了
但是,如果我们都是设置死的,每个服务就给 10个 线程,那就很坑,可能就导致有的服务在高峰期需要更多的资源,但是没资源了,导致很多的 reject
但是其他的服务,每秒钟就易一两个请求,结果也占用了 10个 线程,占着茅坑不拉屎
可以利用 hystrix 的配置成弹性的线程资源调度的模式
通过以下测试方法
输出日志
三个被降级,因为一次只能最大 10 个线程,会发现所有的线程名称都是新的,
所以这里每一个 command 都是一个新的线程,但是在官网文档中又看到说,在空闲之后,
会把线程销毁。这个就看不太明白是怎么一回事情了
# 配置 withMaximumSize 无效解决
项目中实战 hystrix 的时候发现这里的配置老是不太对,
如下面这个配置,我给了最大线程 100,但是给 50 个并发线程就会大量的降级
这个问题困扰了我很长时间,后来跟踪源码,当 command 被拒绝的时候,会报错
进入源码后会发现,这里会先判定线程池队列大小是否已经超过了 queueSizeRejectionThreshold 大小;
在前面已经学到过该大小是可以动态调整的。含义是调整队列大小;
那么这里有一个疑问了,为什么会先判断是否已经超了?
会发现使用了 ThreadPoolExecutor.submit 方法;我在 debug 的时候看过了 ThreadPoolExecutor 的参数,的确是我们设置的;
之前不知道 ThreadPoolExecutor 的用法,所以根本想不到为什么。
百度之后,ThreadPoolExecutor 会检查队列,但是在这之前 hystrix 会先检查一次,所以就导致了还没有进入线程池就报错了;
那么问题是为什么队列里面有这么的线程,而且在日志中看不出来到底有几个线程在执行呢?最简单的回答就是 hystrix 包装了线程池;
最后找到一个根源问题:百度之后,创建 ThreadPoolExecutor 的时候,会传入一个 BlockingQueue,如果使用无限容量的阻塞队列(如 LinkedBlockingQueue)时,
不会创建临时线程(因为队列不会满),所以线程数保持 corePoolSize。 而刚好在 debug 时看到的队列就是 LinkedBlockingQueue;
这个时候就真相大白了;原因就是设置了队列大小!下面使用一个 ThreadPoolExecutor 的测试用例来浮现这个问题 当使用 LinkedBlockingDeque 时,运行后观察控制台,只会发现最多只有 20 个线程被复用;这里的队列大小是 20;
当使用 SynchronousQueue 时,就会瞬间出现 40 个线程
回到最初的问题:配置 withMaximumSize 偶尔有效偶尔无效
解决方案:想使用 withMaximumSize 动态调整线程数量的时候,就不要设置等待队列; 如下
TIP
前面和本章讲解的配置相关实践的内容,这些在 官网文档(opens new window) 中都有写到,老样子就是全部是英文文档
java 线程池扩容_106. 生产环境中的线程池自动扩容与缩容的动态资源分配经验...相关推荐
- 在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom.....
在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom- 2021-6-2 19:55:17 org.apache.catalina.core.Ap ...
- Sentinel(十五)之在生产环境中使用 Sentinel
转载自 在生产环境中使用 Sentinel 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel. 生产环境的 Sentinel Das ...
- Dubbo Mesh 在闲鱼生产环境中的落地实践
本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...
- 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...
- 记录一次生产环境中Redis内存增长异常排查全流程!
作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已 ...
- 在生产环境中使用 Sentinel
文章目录 一.安装zookeeper 1. linux环境 2. windows环境 2. 安装并启动zkui 二.编译打包 2.1. 拉取项目 2.2. 启动 2.3. 登录 sentinel 2. ...
- 云端设计平台Coohom在生产环境中使用istio的经验与实践
介绍 自从istio-1.0.0在今年发布了正式版以后,Coohom项目在生产环境中也开启了使用istio来作为服务网格. 本文将会介绍与分享在Coohom项目在使用istio中的一些实践与经验. C ...
- JDK 9 发布仅数月,为何在生产环境中却频遭嫌弃?
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 千呼万唤始出来,在经历了整整一年的跳票之后,Java 9 终于在 9 月 21 日拨开云雾, ...
- Elastic:培训视频 - 在生产环境中配置 Fleet Server 和 Elastic Agent 之间的安全
在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考.希望对大家有所帮助.优酷的视频频道地址在这里,B站频道 Elastic 简介及 Elastic Stack 安装 Elastic Stack ...
- Java 17.0.2 LTS 生产环境免费使用版本下载地址
Java 17 LTS 是 Java SE 平台的最新长期支持版本.根据Oracle 免费条款和条件许可,JDK 17 二进制文件可在生产环境中免费使用,并可免费重新分发.自Java 8u202版本后 ...
最新文章
- K-L散度(相对熵)
- 安装dos2unix
- python dtype什么意思_DataFrame中的字符串,但dtype是对象
- ImageJ使用手册介绍
- java 读取Excel(.xls格式)
- 网络领域 ——《Adaptable Switch: A Heterogeneous Switch Architecture for Network-Centric Computing》
- 晶圆做成芯片的工艺流程
- BlackBerry手机应用上网的通道列表
- linux桌面lxde 安装_Ubuntu怎么安装轻量级的LXDE桌面
- 【JS提升】六边形的两种画法
- 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
- “百度杯”CTF比赛 九月场--web Upload
- 关于防止游戏行为检测的几点建议技巧
- 【HCIE TAC】第二题
- 【IPv6】NS,NA 报文学习
- 计算机老师新年贺卡祝福语,新年贺卡祝老师祝福语精选
- 中英双语多语言外贸企业网站源码系统 - HanCMS - 安装部署教程
- 小学学计算机学flash动画,flash动画教学计划
- 基于python的毕业设计的药店|药房管理系统
- python-App自动化测试框架——uiautomator2之元素操作方法(二)
热门文章
- qlineedit限制输入数字_请注意:输入设计需要这些交互反馈
- php图片转字节数组中,使用字节数组将图像上传到服务器,在flex 4.5 air中上传php...
- c 创建mysql实体模型_ADO.Net实体数据模型添加DB-First/Code First报错
- 平均无故障时间100万小时_无故障运行时间MTBF投标要求GB5080.7-中检
- 互信息特征选择python_基于互信息的特征选择算法MATLAB实现
- python中options类_python命令行参数解析OptionParser类用法实例
- MongoDB的入门使用
- Snacks HDU 5692 dfs序列+线段树
- 格式化字符串两种方式
- 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像