一、背景
需求:动态调整参数、细粒度监控、秒级监控
线程池参数调优,需要不断的进行测试,判断内存占用等因素,调优没法热部署
二、美团DynamicTp
(一)核心功能
- 动态调参
- 线程池的核心大小
- 最大线程大小
- 队列长度
- 任务监控
- 线程池的任务执行情况
- 最大任务执行时间
- 平均任务执行时间
- 负载告警
- 线程池负载数达到一定的阈值
- 操作日志
- 参看线程池参数的修改记录
原理
(1)动态更新
直接调用 JDK 的 setCoreThreadSize等方法(public)
(2)监控
作为Bean注入容器,修改配置后,通过发布Eventt,异步通知到钉钉群
(3)注意事项
1.普通 JUC 线程池想要被监控,可以 @Bean 定义时加 @DynamicTp 注解
2.动态线程池实例服务启动时会根据配置中心的配置动态注册到Spring容器中,建议不要用@Bean编程式重复声明同一线程池实例,直接配置在配置中心就行
3.阻塞队列只有 VariableLinkedBlockingQueue 类型可以修改 capacity。
该类型功能和 LinkedBlockingQueue 相似, 只是 capacity 不是 final 类型,可以修改,VariableLinkedBlockingQueue 参考 RabbitMq 的实现
(二)adapter模块
主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数调整,监控告警这些增强功能。
1,Jetty
2,Undertow
3,Dubbo线程池
4,RocketMq
5,Hystrix