线程池的监控

概述

线程池的监控是指对应用程序中使用的线程池进行实时跟踪、分析和管理的过程。线程池监控旨在确保线程池的有效运行,并及时发现并解决潜在的问题,以保障应用程序的性能和稳定性。

线程池监控最好支持三个地方:

  • 动态调参:在运行时动态调整线程池参数,包括核心线程数、最大线程数、空闲线程超时时间、任务队列大小等

    从前端接参,根据前端传的线程池名从map中获取线程池进行set方法动态修改(这个参数也可以持久化数据库)

  • 通知报警:目前支持调参通知、活性、队列容量、拒绝策略、超时共六类通知报警维度,在运行时实时+定时检测,触发阈值进行推送

  • 运行监控定时采集线程池运行指标数据,提供 jsonlog、micrometer、endpoint、jmx 四种指标数据采集方式,可灵活选择

监控指标

  • 核心参数:
    • 线程池名称
    • 基本配置:核心线程数、最大线程数
    • 最大线程过期时间
    • 任务队列类型、以及最大容量
    • 拒绝策略
  • 活跃度监控:
    • 当前存在线程数、活跃线程数(通过get方法)
    • 任务队列大小、任务队列剩余大小(通过get方法)
    • 任务总数、完成任务数(通过get方法)、拒绝任务数(自定义拒绝策略进行统计,实现RejectedExecutionHandler
  • 过载监控:
    • 执行超时任务数、排队超时任务数(在excutebeforeExecute afterExecute统计时间,等待时间为开始时间-创建时间,需要传入相应的超时时间)
    • 利用率:活动线程数和最大线程数的比值
    • tps(通过计算每秒完成的任务数)

可以在某些数据设置阈值(例如队列容量、超时任务、拒绝任务),超过通过邮件/短信通知警告

监控方法步骤

  1. 封装自己的线程池类,继承ThreadPoolExecutor重写各个方法例如executebeforeExecuteafterExecute,在这些方面里面进行相应的属性数据统计
  2. 定时去采集该线程池中的属性,存数据库