腾讯二面:你们线程池是怎么做监控的?

本文探讨了Java线程池的监控方法,包括通过定时获取运行数据而非任务执行埋点,监控指标如负载、线程数、拒绝策略执行次数等,并建议使用时序数据库存储历史数据,最后提出了公共监控的抽象线程池存储设计和监控图表展示方案。
摘要由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监控的指标有哪些?

说一下目前 Hippo4J 定义的线程池监控指标,包括不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值