线程池监控
线程池在开发中比较常见的功能,但是线程池监控也是非常有必要的。让我们随时知道线程池的吞吐量,及时调整配置,让系统性能达到最优化。
线程池的监控指标
我们经常创建线程池都是通过如下的方式进行;
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(100),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
对于线程池的参数我就不多赘述了,观察这个类我们发现
暴露了公共的方法,可以访问到一下指标信息,我们通过这些定时采集这些指标就可以上报监控软件从而实现对线程池的监控。
指标信息解读
completedTaskCount:完成的任务数
activeCount:活跃的任务数
tpRef.getQueue().size():队列里面的任务数
remainingCapacity:队列剩余容量
poolSize:当前线程池中的线程数量
corePoolSize:线程池中核心线程数
maximumPoolSize:线程池中允许最大线程数
上面的指标信息是我们最常用的ThreadPoolExecutor中的指标信息。对于ScheduledThreadPoolExecutor
,ForkJoinPool
里面的这些指标都是可以自行去了解。
二:监控
知道怎么获取这些指标,然后只需要建立一个线程,间隔去采集信息上报到监控系统就可以了。
如果采用的promothues作为监控系统的话,那开源框架micrometer
,提供好了一个类ExecutorServiceMetrics
,可以对线程池包装后然后记录,等promothues进行抓取信息,然后加上grafana
进行展示
demo如下:
ThreadPoolExecutor es = new ThreadPoolExecutor(5, 5, 1L, TimeUnit.SECONDS, new SynchronousQueue<>(), new NamedThreadFactory("test"), new ThreadPoolExecutor.AbortPolicy());
MeterRegistry meterRegistry = new SimpleMeterRegistry();
ExecutorService monitores = ExecutorServiceMetrics.monitor(meterRegistry, es, "test-thread-pool-monitor");
总结
在并发高的常见下,线程池监控还是非常有必要的。及时发现线程池的状态,方便基于业务对线程池进行调优。