背景

我们公司正在处于某个项目的维护阶段,领导对资源告警比较重视,服务器资源告警的就不说了,运维同学每隔一小时都会检测线上环境的应用服务信息,例如:网关日志响应时间告警/nginx日志接口响应时间告警/日志关键字异常日志告警等,每周都需要对告警信息的排查分析~

都是通过邮件发送给干系人~

 例如,这个是邮件信息截图~

 排查思路

日志--【检索】->traceId--【skywaling】->完整的调用链信息

1.从日志中查到TraceId。

2.通过TraceId获取调用链

通过traceId在skywalking中的可视化界面上可以看出获取数据库链接就花费了7百多毫秒

大家无需纠结接口花费了6s多,而本次却在重点说获取链接池的情况。其他的可以从代码或者sql进行入手优化~~只是获取数据库链接耗时较多,所以着重进行了分析。

3.查看该应用的数据库链接池配置

    druid:# 初始化时建立物理连接的个数initial-size: 20# 最大连接池数量max-active: 100# 最小连接池数量min-idle: 20# 获取连接时最大等待时间max-wait: 60000# 是否缓存preparedStatement,也就是PSCache。pool-prepared-statements: false# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。max-pool-prepared-statement-per-connection-size: -1# 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。validation-query: SELECT 'x'# 单位:秒,检测连接是否有效的超时时间。validation-query-timeout: 1# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。test-on-borrow: false# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。test-on-return: false# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。test-while-idle: true# 有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明time-between-eviction-runs-millis: 6000# 连接保持空闲而不被驱逐的最小时间min-evictable-idle-time-millis: 1200000max-evictable-idle-time-millis: 1800000# 监控页面相关配置stat-view-servlet:url-pattern: /druid/*allow: ""enabled: true

4.获取该应用数据库链接池的监控(需要对应的时间段)

从图中可以看出PoolingCount在这个时刻突然下降,突然下降可能表示有突发流量

详细解释(poolingCount )

在数据库连接池监控中,poolingCount 是一个重要的监控指标,它表示当前连接池中空闲的、可用的数据库连接数量

含义

  • poolingCount 表示连接池中当前处于空闲状态、可以被应用程序直接获取使用的连接数量

  • 这些连接已经创建并与数据库建立了连接,但暂时没有被应用程序使用

  • 它是连接池中"准备好的"连接的数量

相关指标对比

在常见的连接池实现中,通常会有以下相关指标:

指标名称含义
poolingCount当前空闲连接数
activeCount当前活跃连接数(正在被使用的连接)
maxActive连接池最大允许的连接数
minIdle连接池保持的最小空闲连接数
maxIdle连接池允许的最大空闲连接数

监控意义

  1. 性能调优依据

    • 如果 poolingCount 经常为0,可能表明连接池配置过小

    • 如果 poolingCount 长期很高,可能表明配置过大

  2. 问题诊断

    • poolingCount 突然下降可能表示有突发流量

    • poolingCount 长期低位可能表示连接泄漏

  3. 容量规划

    • 结合 activeCount 和 poolingCount 可以评估连接池使用情况

    • 帮助确定合适的 maxActive 和 minIdle 参数

✅ 图表汇总分析(监控时间:近6小时)

1. IdleConnection(空闲连接)

  • 大部分时间维持在 20 左右,直到接近 14:00 时突然拉升。

  • 说明min-idle: 20 已经生效,Druid 正在努力维持至少 20 个空闲连接。


2. PoolingCount(连接池中的连接总数)

  • 长期稳定在 5~10 左右,你说的问题验证了。

  • 但注意这个指标来源标注为 TotalConnection(...),它并非严格意义的“空闲连接数”,可能是连接池当前存在的连接总数(和 Idle + Active 的关系要确认 exporter 定义)。


3. ActiveConnection(活跃连接数)

  • 绝大多数时间活跃连接在 0~2 之间

  • 即使接近 14:00 的高峰期,也只有少量连接(<10)在活跃使用;

  • 说明系统当前数据库并发负载是低的


4. ThreadsAwaitingConnection(等待获取连接的线程数)

  • 全程为 0;

  • ✅ 说明连接池没有连接耗尽问题,应用线程从不需等待连接。


5. MaxConnection(连接池历史最大并发连接数)

  • 常态是 4,只有在快到 14:00 时突增至 200;

  • 猜测是某个服务(或某次压测)在那个时段拉高了连接数。


✅ 结论

项目结论
min-idle 是否生效?✅ 是的,空闲连接维持在 20
是否存在连接不足 / 堵塞?❌ 没有。activeCountwaitThreadCount 都非常低
是否需要增加 min-idle?目前不需要,现有配置已满足需求
是否要扩大连接池?❌ 不需要,max-active: 100 远超实际并发需求

当前链接数在22左右,超过了预热的的链接数20,所以需要与mysql中建立链接。

思考:

但是为什么与mysql建立链接这么长时间?

1.mysql的监控

Threads Cached = 1 意味着什么?

这表示:

  • 当前 MySQL 有 1 个空闲线程 在等待下一个连接复用;

  • 如果有新连接请求到来,MySQL 可以立刻用这 1 个线程处理,而 无需调用 pthread_create() 创建新线程

重点观察图表分析

1. 线程缓存 (MySQL Thread Cache)

  • Threads Created 几乎为 0,说明线程缓存有效;

  • 但 Threads Cached 明显有下降段(21:45 前后出现断崖);

  •  表示短时间内大量连接请求导致缓存线程被用完,需新建线程。

这会造成连接响应变慢,尤其是连接池新建连接时要与数据库创建新线程,代价高。


2. 临时表 (MySQL Temporary Objects)

  • 每秒创建临时表数在 4~5 个,且偶尔触发 Created Tmp Disk Tables(磁盘临时表);

  • 说明存在大量使用 GROUP BYORDER BY、子查询、联合查询等临时表消耗。

 磁盘临时表严重影响 SQL 响应速度,从而增加连接持有时间。


3. 排序 (MySQL Sorts)

  • Sort Rows 高峰时可达 30~40;

  • Sort Scan 也非 0,说明未命中索引的排序操作存在。

 排序越多、越复杂,单个 SQL 执行越慢 → 应用端连接持有时间越长 → 导致连接池空闲不足。


4. Select Types 分布

  • Select Scan 稳定在高位,说明存在大量全表扫描;

  • Select Range 较低,表示索引未能充分利用。


5. 慢查询 (MySQL Slow Queries)

  • 21:45 左右出现明显慢 SQL 峰值,最高达 1.45/s;

  • 时间点与线程缓存耗尽、临时表升高高度吻合!


综合分析:导致连接获取慢的根因

MySQL 层临时表多 / 排序多 / 索引未命中SQL 响应时间延长,连接被长时间占用
MySQL 层Thread Cache 命中率下降新建线程成本高,拖慢新连接初始化
应用层连接池配置不足 / minIdle 过低无法预热足够连接,应对突发请求
应用层SQL 过慢 + 连接未及时释放导致连接池回收和复用效率变差

 优化建议

A. MySQL 层建议

慢查询排查开启 slow_query_log,排查 21:45 的慢 SQL
索引优化优化 SELECT SCAN 多的表结构,添加合适联合索引
避免临时表检查是否有复杂嵌套子查询 / group by 未配 index
调大线程缓存thread_cache_size = 128
临时表优化调整 tmp_table_size 和 max_heap_table_size 至 128M 起步
排序优化优化 ORDER BY 相关 SQL,能使用索引就用索引

B. 应用层建议(Druid)

spring:datasource:druid:initial-size: 30min-idle: 30max-active: 100max-wait: 30000validation-query: SELECT 1test-on-borrow: truetest-while-idle: truetime-between-eviction-runs-millis: 5000remove-abandoned: trueremove-abandoned-timeout: 180log-abandoned: true

重点说明:

  • initial-sizemin-idle: 提高初始连接和空闲连接数,快速预热;

  • test-on-borrow: 确保连接可用,避免使用“死连接”;

  • remove-abandoned: 回收长时间未关闭连接,防止泄露;

  • max-wait: 缩短应用等待连接时间,提高失败可控性;

总结一句话:

MySQL 当前存在执行慢 / 缓存线程耗尽 / 排序临时表密集的问题,间接导致应用端连接获取慢,连接池设置不当进一步放大了问题

当前mysql数据库设置:

SHOW VARIABLES LIKE 'thread_cache_size';

68 

将thread_cache_size 调整到128后,后续再看结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91398.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91398.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91398.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel常用函数大全,非常实用

一、数学与统计函数1. SUM作用&#xff1a;求和SUM(number1, [number2], ...)SUM(A1:A10) ➔ 计算A1到A10单元格的总和注意&#xff1a;自动忽略文本和空单元格2. AVERAGE作用&#xff1a;计算平均值AVERAGE(number1, [number2], ...)AVERAGE(B2:B20) ➔ 计算B列20个数据的平均…

性能优化(一):时间分片(Time Slicing):让你的应用在高负载下“永不卡顿”的秘密

性能优化(一)&#xff1a;时间分片&#xff08;Time Slicing&#xff09;&#xff1a;让你的应用在高负载下“永不卡顿”的秘密 引子&#xff1a;那张让你浏览器崩溃的“无限列表” 想象一个场景&#xff1a;你需要渲染一个包含一万个项目的列表。在我们的“看不见”的应用中&a…

《C++》STL--list容器详解

在 C 标准模板库(STL)中&#xff0c;list 是一个非常重要的序列容器&#xff0c;它实现了双向链表的数据结构。与 vector 和 deque 不同&#xff0c;list 提供了高效的插入和删除操作&#xff0c;特别是在任意位置。本文将深入探讨 list 容器的特性、使用方法以及常见操作。 文…

Day 28:类的定义和方法

DAY 28 类的定义和方法 知识点学习 1. 类的定义 在Python中&#xff0c;类是创建对象的模板。使用class关键字来定义一个类。类名通常采用首字母大写的命名方式&#xff08;PascalCase&#xff09;。 # 最简单的类定义 class MyClass:pass # 使用pass占位符类的定义就像是…

OSPF综合实验报告册

一、实验拓扑二、实验要求1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#x…

网络层6——内部网关协议RIP、OSPF(重点)

目录 一、基本概念 1、理想的路由算法应具备的特点 2、分层次的路由选择协议 二、内部网关协议RIP 1、特点 2、路由交换信息 3、距离向量算法 4、坏消息传送慢问题 5、RIP报文格式 三、内部网关协议OSPF 1、特点 2、其他特点 3、自治系统区域划分 4、OSPF的5中分…

同品牌的系列广告要如何保证宣传的连贯性?

对于品牌的系列广告而言&#xff0c;内容的连贯性十分重要。如果系列广告之间缺乏内在联系&#xff0c;不仅会削弱品牌形象的统一性&#xff0c;还可能导致用户的认知混乱。保证宣传内容的连贯性不是让每则广告完全相同&#xff0c;而是在变化中保持核心要素的一致性。我们该如…

深度学习:激活函数Activaton Function

一、为什么需要激活函数&#xff1f;神经网络本质上是多个线性变换&#xff08;矩阵乘法&#xff09;叠加。如果没有激活函数&#xff0c;即使叠加多层&#xff0c;整体仍等价于一个线性函数&#xff1a;这样的网络无法学习和拟合现实世界中复杂的非线性关系。激活函数的作用&a…

deepseek: 切分类和长函数到同名文件中

import re import sys import os import ast from tokenize import generate_tokens, COMMENT, STRING, NL, INDENT, DEDENT import iodef extract_entities(filename):"""提取类和函数到单独文件"""with open(filename, r, encodingutf-8) as f…

新型融合肽递送外泌体修饰可注射温敏水凝胶用于骨再生

温敏水凝胶因能模拟细胞外基质微环境&#xff0c;且具有原位注射性和形态适应性&#xff0c;在骨组织工程中应用广泛。小肠黏膜下层&#xff08;SIS&#xff09;作为天然细胞外基质来源&#xff0c;富含 I 型和 III 型胶原蛋白及多种生物活性因子&#xff0c;其制备的水凝胶在组…

SPI接口的4种模式(根据时钟极性和时钟相位)

SPI&#xff08;Serial Peripheral Interface&#xff09; 接口根据时钟极性&#xff08;CPOL&#xff09;和时钟相位&#xff08;CPHA&#xff09;的不同组合&#xff0c;共有 4种工作模式。这些模式决定了数据采样和传输的时序关系&#xff0c;是SPI通信中必须正确配置的关键…

Java:高频面试知识分享2

HashSet 和 TreeSet 的区别&#xff1f;底层实现&#xff1a;HashSet 基于 HashMap 实现&#xff0c;使用哈希表存储元素&#xff1b;TreeSet 基于 TreeMap&#xff0c;底层为红黑树。元素顺序&#xff1a;HashSet 无序&#xff1b;TreeSet 会根据元素的自然顺序或传入的 Compa…

C语言习题讲解-第九讲- 常见错误分类等

C语言习题讲解-第九讲- 常见错误分类等1. C程序常见的错误分类不包含&#xff1a;&#xff08; &#xff09;2. 根据下面递归函数&#xff1a;调用函数 Fun(2) &#xff0c;返回值是多少&#xff08; &#xff09;3. 关于递归的描述错误的是&#xff1a;&#xff08; &#x…

A∗算法(A-star algorithm)一种在路径规划和图搜索中广泛使用的启发式搜索算法

A∗A*A∗算法&#xff08;A-star algorithm&#xff09;是一种在路径规划和图搜索中广泛使用的启发式搜索算法&#xff0c;它结合了Dijkstra算法的广度优先搜索思想和启发式算法的效率优势&#xff0c;能够高效地找到从起点到终点的最短路径。 1. 基本原理 A*算法的核心是通过估…

UniappDay06

1.填写订单-渲染基本信息 静态结构&#xff08;分包&#xff09;封装请求API import { http } from /utils/http import { OrderPreResult } from /types/orderexport const getmemberOrderPreAPI () > {return http<OrderPreResult>({method: GET,url: /member/orde…

论文略读:GINGER: Grounded Information Nugget-Based Generation of Responses

SIGIR 2025用户日益依赖对话助手&#xff08;如 ChatGPT&#xff09;来满足多种信息需求&#xff0c;这些需求包括开放式问题、需要推理的间接回答&#xff0c;以及答案分布在多个段落中的复杂查询RAG试图通过在生成过程中引入检索到的信息来解决这些问题但如何确保回应的透明性…

从内部保护你的网络

想象一下&#xff0c;你是一家高端俱乐部的老板&#xff0c;商务贵宾们聚集在这里分享信息、放松身心。然后假设你雇佣了最顶尖的安保人员——“保镖”——站在门口&#xff0c;确保你准确掌握所有进出的人员&#xff0c;并确保所有人的安全。不妨想象一下丹尼尔克雷格和杜安约…

Redis 中 ZipList 的级联更新问题

ZipList 的结构ZipList 是 Redis 中用于实现 ZSet 的压缩数据结构&#xff0c;其元素采用连续存储方式&#xff0c;具有很高的内存紧凑性。ZipList 结构组成如下&#xff1a;zlbytes&#xff1a;4字节&#xff0c;记录整个ziplist的字节数zltail&#xff1a;4字节&#xff0c;记…

【苍穹外卖项目】Day05

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 一、Redis入门 Redis简介 Redis是一个基于内存的 key-value 结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热…

语音识别dolphin 学习笔记

目录 Dolphin简介 Dolphin 中共有 4 个模型&#xff0c;其中 2 个现在可用。 使用demo Dolphin简介 Dolphin 是由 Dataocean AI 和清华大学合作开发的多语言、多任务语音识别模型。它支持东亚、南亚、东南亚和中东的 40 种东方语言&#xff0c;同时支持 22 种汉语方言。该模…