前言:本文通过案例详细介绍 APM 新推出的线程池与连接池监控功能。

概要

在 Java 生态系统中,Tomcat 线程池、Dubbo 线程池和 Druid 连接池等资源池被广泛使用。若缺乏有效的监控机制,资源池可能会面临一系列挑战,包括难以察觉的性能瓶颈、资源的不必要浪费、系统稳定性的潜在威胁,以及问题定位的复杂性等。

在本文中,我们将探讨应用性能监控 APM 新推出的线程池与连接池监控功能。通过一系列实际案例,我们将详细阐述如何有效利用这些工具进行监控,同时提供最佳实践指南,帮助用户构建起符合自身需求的监控体系。

资源池的目的/收益

资源池是一个通用的概念,指的是将有限的资源集中管理和分配给多个用户或任务的机制。资源池的目的是通过有效分配和重用资源来提高系统的效率、性能和可伸缩性。常见的资源池主要有线程池、连接池和内存池等。

线程池

线程池是管理并发执行线程的资源池。它维护着一组工作线程,这些线程可以被重复用于执行多个任务,从而避免了频繁创建和销毁线程所带来的性能开销。主流公共库中使用线程池的有 Tomcat、Dubbo 等。

在实际应用中,线程池负责处理各种任务,例如在 Web 服务器中处理用户请求或在分布式服务框架中处理远程调用。通过合理的配置,线程池能够提升系统的并发处理能力,确保任务的高效执行;而配置不当则可能导致资源不足,引发任务积压和延迟。

连接池

连接池专注于管理数据库连接的资源池。它维护着一组可用的数据库连接,当应用程序需要访问数据库时,可以从连接池中获取一个连接,使用完毕后再将其释放回池中。主流公共库中使用连接池的有 Druid 等。

在数据库访问层,连接池的性能直接影响应用程序的数据库操作效率和资源利用率。通过适当的配置和监控,连接池能够显著提升数据库操作的性能,确保系统的稳定性和可靠性。对于依赖数据库操作的应用程序,优化连接池的配置是提升性能的关键环节。

在高并发和大负载的情况下,线程池、连接池性能和稳定性对应用程序的整体性能至关重要。Java 探针能够帮助监控框架的运行状态和性能指标,辅助优化框架的性能表现,及时发现和解决潜在的性能瓶颈和问题,保障应用程序的正常运行。

APM 资源能力

应用性能监控 APM 在实施资源池监控埋点时,采用 Java 字节码注入技术对框架源码进行插桩,精确地捕获各类资源池的操作,从而实现对这些资源池的深入监控。通过这种方式,探针能够透明地访问资源池内部的状态和指标,无需修改原有代码或增加额外的监控逻辑。

从 Tomcat 容器启动之初,探针便通过字节码技术介入,捕获线程池和连接池对象,并将它们注册到监控系统中。通过设定的定时任务,探针周期性地调用这些资源池的接口,收集关键性能指标。

下图简单描述了探针对 Tomcat 线程池监控的原理,这一原理同样适用于其他资源池的监控。

请在此添加图片描述

目前,针对线程池以及连接池,APM 提供了常见的指标:

池对象 指标名称 指标含义
线程池 活跃线程数 线程池中正在执行任务的线程数量
最大线程数 线程池中允许创建的线程数量
核心线程数 线程池的基本线程数量
队列大小 等待执行的任务个数
线程池大小 线程池中线程数量
连接池 活跃连接数 正在使用中的数据库连接
当前连接数 连接池中总的连接数
最大连接数 连接池中允许创建的连接数量
等待连接数 正在等待可用连接的线程数量
空闲连接数 连接池中可用的连接数

在引入应用性能监控 APM 探针后,将改善线程池和连接池的监控和管理,解决缺乏监控所带来的问题:

  • 实时性能监控:APM 提供实时池类指标,使得性能瓶颈能够快速被识别和定位,如线程活跃度以及数据库连接的使用情况。

  • 资源优化:通过监控资源使用情况,可以辅助开发人员优化线程和连接的分配,减少浪费,提高资源利用率。

  • 系统稳定性增强:通过持续监控系统,能及时发现异常和潜在的故障,增强系统的稳定性和可靠性。

  • 高效的运维:探针的监控和 APM 告警能力减少了运维团队的工作负担,在发生问题时能快速定位,提高运维效率。

那么,当线上发生的故障是由线程池或连接池引起时,我们要如何操作才能快速定位这类问题?接下来通过举例子让大家更好地了解应用性能监控 APM 资源池监控能力。

APM 资源池监控案例

正在稳定运行的 springboot-service 后端服务,底层依托于 Tomcat,并采用 Druid 作为其数据库连接池。

在正常运行状态下,接口/api/v1/user/get 的监控数据显示如下:

请在此添加图片描述

线程池监控:

请在此添加图片描述

连接池监控:

请在此添加图片描述

我们为线程池和连接池分别设定了如下的告警规则:

指标告警(任意)

· 活跃线程数 > 100个,统计粒度1分钟,连续1次满足条件则每10分钟告警一次

· 线程池任务数 > 150个,统计粒度1分钟,连续1次满足条件则每1小时告警一次

针对连接池配置的告警规则如下:

指标告警(任意)

· 活跃连接数 > 5个,统计粒度1分钟,连续1次满足条件则每1小时告警一次

· 等待连接数 > 100个,统计粒度1分钟,连续1次满足条件则每1小时告警一次

案例1(Tomcat线程池告警):

在某一时刻,springboot-service 触发了线程池告警,告警显示活跃线程数和线程池任务数均超出了预设阈值。

请在此添加图片描述

线程池监控此时看到各项指标处于异常状态:

请在此添加图片描述

通过深入分析接口监控数据,发现 /api/v1/user/get 接口响应时间异常延长:

请在此添加图片描述

进一步链路详情分析,揭示了其中的 getUser 调用耗时异常高:

请在此添加图片描述

其调用代码为:

 @Override
public User getUser() {
  // 获取当前时间
  LocalDateTime localDateTime = LocalDateTime.now();
  try {
    Thread.sleep(2000);
  } catch (InterruptedException e) {
    // ignore
  }
  return new User("username", "password");
}

识别并移除了导致延迟的休眠操作后,springboot-service 的线程池指标恢复正常,系统运行平稳。

请在此添加图片描述

案例2(Druid连接池告警):

在某一时刻,sprintgboot-service 触发了连接池告警,监控数据显示活跃连接数和等待连接的线程数均超出了预设阈值。

请在此添加图片描述

通过借鉴线程池告警的排查流程,我们最终诊断出在执行 SQL 查询过程中,由于连接资源紧张,多数线程无法及时获取数据库连接,导致了广泛的阻塞现象。

请在此添加图片描述

这一发现指引我们根据应用程序的实际规模和需求,调整和设置更为合适的连接池参数。

线程池和连接池的监控为用户揭示了系统运行的深层状态,通过告警机制及时捕捉潜在问题,结合 APM链路追踪 的能力,用户能够迅速定位问题根源,并有效解决问题,从而保障系统的稳定运行和性能优化。

APM 资源池使用指南

在前述案例中,我们已经见证了线程池和连接池监控在实际故障排查中的应用,以及它们在确保系统稳定性和性能优化方面的重要性。这些情景不仅展示了监控系统的能力,也揭示了在面对不同的系统挑战时,如何有效地利用监控数据来指导决策。

现在,让我们进一步探讨如何将这些经验转化为一套系统化的最佳实践,以便在日常运维中实现更加高效和可靠的资源管理。

应用性能监控 APM 提供了针对线程池和连接池关键指标的监控能力,在【应用诊断】页面,可以通过实时曲线展示资源池关键指标。

APM 提供了活跃线程数、最大线程数、核心线程数、线程池任务数以及线程池大小指标。这些指标随着时间动态变化,帮助用户快速识别潜在的性能瓶颈和资源分配问题。

请在此添加图片描述

关于连接池,APM 提供了活跃连接数、最大连接数、当前连接数、空闲连接数以及等待连接数指标,辅助用户一目了解连接池的当前状态,有助于用户评估数据库资源的使用情况和效率。

请在此添加图片描述

在 APM 告警配置界面中,用户可以轻松设定告警阈值和通知方式。

请在此添加图片描述

在选择筛选条件和告警对象维度时,我们可以选择以下维度:

  • 池种类:告警的资源池的种类

    • thread:告警对象为线程池
    • connection:告警对象为连接池
  • 组件类型:告警的资源池的类型

    • tomcat:告警对象为 Tomcat 线程池
    • dubbo:告警对象为 Dubbo 线程池
    • druid: 告警对象为 Druid 连接池
  • 池名称:告警的资源池的名称

在选择筛选条件时,为确保告警的准确性,我们推荐用户填上池种类筛选条件。当配置线程池告警时,筛选条件配置池种类为 thread;当配置连接池告警时,筛选条件配置池种类为 connection。

用户可以通过页面配置对应的告警以及用户通知,确保用户能够及时接收到关键的性能告警。

请在此添加图片描述

当监控指标超过设定的阈值时,用户将通过选择的通知方式接收到告警。告警信息包含详细的告警维度,以便用户迅速响应。

请在此添加图片描述

结论

应用性能监控 APM 通过提供深入的指标监控和告警功能,为用户提供了对线程池和连接池全面的监控能力。结合实际案例,用户可以有效地利用这些工具来识别和定位性能问题,进而采取行动解决,确保应用程序的高效和稳定运行。

监控这些关键组件对于确保应用程序的性能、可靠性和稳定性至关重要。线程池和连接池的健康状况直接影响到系统的响应时间和处理能力,因此实时监控它们的状态对于快速识别和解决性能瓶颈,优化资源使用以及预防系统故障具有显著的意义。

展望未来,应用性能监控 APM 将持续致力于提升线程池和连接池的监控能力,并扩展对更多关键组件的支持,以满足用户不断增长的监控需求。

联系我们

如有任何疑问,欢迎扫码进入官方交流群~

请在此添加图片描述

关于腾讯云可观测平台

腾讯云可观测平台(Tencent Cloud Observability Platform,TCOP)基于指标、链路、日志、事件的全类型监控数据,结合强大的可视化和告警能力,为您提供一体化监控解决方案。满足您全链路、端到端的统一监控诉求,提高运维排障效率,为业务的健康和稳定保驾护航。功能模块有:

  • Prometheus 监控:开箱即用的 Prometheus 托管服务;
  • 应用性能监控 APM:支持无侵入式探针,零配置获得开箱即用的应用观测能力;
  • 云拨测 CAT:利用分布于全球的监测网络,提供模拟终端用户体验的拨测服务;
  • 前端性能监控 RUM:Web、小程序等大前端领域的页面质量和性能监测;
  • Grafana 可视化服务:提供免运维、免搭建的 Grafana 托管服务;
  • 云压测 PTS:模拟海量用户的真实业务场景,全方位验证系统可用性和稳定性;
  • ......等等
    点击播放视频快速了解👇

APM 相关文章推荐:

请在此添加图片描述


欢迎关注腾讯云可观测,了解最新动态

👇点击阅读原文了解腾讯云可观测平台

文章来源于腾讯云开发者社区,点击查看原文