# 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. 生产环境中的线程池自动扩容与缩容的动态资源分配经验...相关推荐

  1. 在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom.....

    在java.library.path中找不到允许在生产环境中实现最佳性能的基于APR的Apache Tom- 2021-6-2 19:55:17 org.apache.catalina.core.Ap ...

  2. Sentinel(十五)之在生产环境中使用 Sentinel

    转载自  在生产环境中使用 Sentinel 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel. 生产环境的 Sentinel Das ...

  3. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...

  4. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  5. 记录一次生产环境中Redis内存增长异常排查全流程!

    作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已 ...

  6. 在生产环境中使用 Sentinel

    文章目录 一.安装zookeeper 1. linux环境 2. windows环境 2. 安装并启动zkui 二.编译打包 2.1. 拉取项目 2.2. 启动 2.3. 登录 sentinel 2. ...

  7. 云端设计平台Coohom在生产环境中使用istio的经验与实践

    介绍 自从istio-1.0.0在今年发布了正式版以后,Coohom项目在生产环境中也开启了使用istio来作为服务网格. 本文将会介绍与分享在Coohom项目在使用istio中的一些实践与经验. C ...

  8. JDK 9 发布仅数月,为何在生产环境中却频遭嫌弃?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 千呼万唤始出来,在经历了整整一年的跳票之后,Java 9 终于在 9 月 21 日拨开云雾, ...

  9. Elastic:培训视频 - ​在生产环境中配置 Fleet Server 和 Elastic Agent 之间的安全

    在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考.希望对大家有所帮助.优酷的视频频道地址在这里,B站频道 Elastic 简介及 Elastic Stack 安装 Elastic Stack ...

  10. Java 17.0.2 LTS 生产环境免费使用版本下载地址

    Java 17 LTS 是 Java SE 平台的最新长期支持版本.根据Oracle 免费条款和条件许可,JDK 17 二进制文件可在生产环境中免费使用,并可免费重新分发.自Java 8u202版本后 ...

最新文章

  1. K-L散度(相对熵)
  2. 安装dos2unix
  3. python dtype什么意思_DataFrame中的字符串,但dtype是对象
  4. ImageJ使用手册介绍
  5. java 读取Excel(.xls格式)
  6. 网络领域 ——《Adaptable Switch: A Heterogeneous Switch Architecture for Network-Centric Computing》
  7. 晶圆做成芯片的工艺流程
  8. BlackBerry手机应用上网的通道列表
  9. linux桌面lxde 安装_Ubuntu怎么安装轻量级的LXDE桌面
  10. 【JS提升】六边形的两种画法
  11. 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
  12. “百度杯”CTF比赛 九月场--web Upload
  13. 关于防止游戏行为检测的几点建议技巧
  14. 【HCIE TAC】第二题
  15. 【IPv6】NS,NA 报文学习
  16. 计算机老师新年贺卡祝福语,新年贺卡祝老师祝福语精选
  17. 中英双语多语言外贸企业网站源码系统 - HanCMS - 安装部署教程
  18. 小学学计算机学flash动画,flash动画教学计划
  19. 基于python的毕业设计的药店|药房管理系统
  20. python-App自动化测试框架——uiautomator2之元素操作方法(二)

热门文章

  1. qlineedit限制输入数字_请注意:输入设计需要这些交互反馈
  2. php图片转字节数组中,使用字节数组将图像上传到服务器,在flex 4.5 air中上传php...
  3. c 创建mysql实体模型_ADO.Net实体数据模型添加DB-First/Code First报错
  4. 平均无故障时间100万小时_无故障运行时间MTBF投标要求GB5080.7-中检
  5. 互信息特征选择python_基于互信息的特征选择算法MATLAB实现
  6. python中options类_python命令行参数解析OptionParser类用法实例
  7. MongoDB的入门使用
  8. Snacks HDU 5692 dfs序列+线段树
  9. 格式化字符串两种方式
  10. 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像