线程池如何监控,才能帮助开发者快速定位线上错误?

本文探讨了线程池监控的重要性,建议通过定时获取运行数据而非运行时埋点来避免性能影响。监控指标包括线程池负载、核心线程数、拒绝策略执行次数等。监控数据存储可以采用时序数据库,如MySQL,并通过设定有效期来管理数据量。此外,文章提出将数据存储和查询展示抽象为服务端功能,以减轻客户端压力并实现中心化管理。最后,文章提到了Hippo4J框架在监控图表展示和Prometheus集成方面的进展。
摘要由CSDN通过智能技术生成

大部分情况下,线程池的运行情况对于使用者来说是个黑盒,运行情况不可知,会导致 生产出现事故问题排查困难,以及线程池参数难以定义。文章围绕线程池监控展开,讨论 线程池如何监控、监控的指标以及监控数据的存储展示

01、如何监控运行数据


设想一下,如果想监控线程池的运行数据,你会怎么操作?这里提供两种常规思路

1、线程池运行时埋点,每一次运行任务都进行统计
2、定时获取线程池的运行数据


这里我推荐第二种,因为线程池的监控 API 会通过 获取主锁来控制结果的相对准确性,性能相对较差,后面会详细说明。为什么叫相对准确?因为任务和线程的状态在计算过程中可能会动态变化,只能给到一个近似值,保证不了绝对准确,模拟下定时采集线程池运行时数据的代码。

private ScheduledThreadPoolExecutor collectVesselExecutor;

String collectVesselTaskName = "client.scheduled.collect.data";
collectVesselExecutor = new ScheduledThreadPoolExecutor(
        new Integer(1),
        ThreadFactoryBuilder.builder().daemon(true).prefix(collectVesselTaskName).build()
);

// 延迟 initialDelay 后循环调用. scheduleWithFixedDelay 每次执行时间为上一次任务结束时, 向后推一个时间间隔
collectVesselExecutor.scheduleWithFixedDelay(
        () -> runTimeGatherTask(),
        properties.getInitialDelay(),
        properties.getCollectInterval(),
        TimeUnit.MILLISECONDS
);


一般线程池分为两种方式创建,Spring Bean 和非 Spring Bean,假设创建的线程池是 Spring 管理的,我们只需要在 Spring 容器启动成功后,延迟一段时间后开始采集运行数据就 OK 了。

不论线程池是否由 Spring 管理,采集的方式大致相同。一种从 Spring 容器取,一种是创建好线程池后放到一个自定义容器。

02、监控的指标有哪些?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值