连接池获取连接慢-全面解构所有潜在原因 (连接池获取连接)
前言
应用连接数据库通常通过连接池进行连接,例如 HikariCP、Druid 等。在应用运行期间,可能会出现获取连接缓慢的情况,这往往让工程师无所适从,尤其是偶发场景更是让人头疼。本文将逐步剖析获取连接慢的所有可能原因,并提供相应的调优手段,帮助您成为连接池排障大师。
连接池监控
排查问题的前提是发现问题,因此首先需要拥有连接池的详细监控。以 HikariCP 为例,以下介绍几个常用的指标的含义:
- Active Connections:当前正在使用的连接数
- Total Connections:连接池中创建的总连接数
- Idle Connections:当前空闲的连接数
- Threads Waiting:正在等待获取连接的线程数
- Connection Acquisition Time:获取连接所花费的时间
对应应用程序比较敏感的时间就是获取连接耗时,因为它会直接影响链路的响应时间 (RT)。接下来,我们将逐步分析造成获取连接耗时较高的所有可能性以及解决方案。
排查思路
连接池存在等待连接
获取连接耗时较高最直接的原因就是存在等待连接数。这种情况可以通过观测等待连接数的大盘来验证。
导致等待连接的原因
- 连接池最大连接数不足:如果日常的活跃连接数/总连接比例持续很高,或者 QPS AVG-RT(s) > 连接总数,说明当前连接池的最大连接数已经不足以支撑当前的流量。
- 慢查询和长事务:慢查询会导致连接被长期占用,而长事务也会占用连接,从而导致等待连接的产生。
- 应用负载过高:当应用负载过高时,获取连接的线程会争用 CPU,从而导致获取连接的时间延长。
- 应用 STW:获取连接期间发生的 STW 也会导致获取连接耗时升高。
- 网络阻塞:网络阻塞也会导致获取连接的时间延长。
![连接池](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
调优手段
适当增加连接池最大连接数
连接数也不是越大越好,一般根据 CPU 核数决定。HikariCP 官方给出了一个公式可以参考,最大连接数一般不要超过 50。
``` maxPoolSize = (core_count effective_spindle_count) + 2 ```优化慢查询和长事务
慢 SQL 相对来说比较好排查,数据库或者数据库中间件都有成熟的慢 SQL 采集工具。只需要分析一下指定时间段内是否有慢 SQL 即可。长事务很容易被忽略,可以通过观测连接使用时间指标和 SQL 耗时来分析。
解决应用负载过高
可以通过观测应用的 CPU 和 Load 指标来判断应用负载是否过高。
避免应用 STW
可以通过结合 JVM 监控和 GC 日志来分析 GC 情况。关于 GC 分析不是本文重点,这里简单列举几个重点说明一下(以 ZGC 举例):
- GC 频率过高:GC 频率过高会导致应用频繁 STW
- GC 耗时过长:GC 耗时过长也会导致应用 STW
- ZGC 晋升失败:ZGC 晋升失败会导致应用长时间 STW
解决网络阻塞
网络阻塞问题比较难以排查,具有偶发性和难以观测的特点。网络阻塞分以下几种情况:
- 网络抖动:可以通过观测应用所在主机的 TCP 重传监控是否有尖刺来判断
- 网络带宽打满:可以通过观测网络流量监控来判断
- 数据库和 DAL 异常:可以通过观测数据库和 DAL 监控来判断
除了监控,还可以通过网络循环抓包来分析。可以参考以下命令:
``` tcpdump -i <网卡> port 3306 -w 3306.pcap -C 50 -W 10 ```总结
通过本文的分析和调优手段,您可以逐步剖析连接池获取连接慢的所有可能原因,并找到相应的解决方案。连接池性能优化是一个循序渐进的过程,需要耐心和细致的分析,相信本文能为您成为连接池排障大师提供帮助。
dbcp连接池远程连接数据库的时候,超慢。本地是很快,远程连接在下面一段代码(获取连接)等待了20秒左右
我也正在纠结这个问题 但是还没有解决··········· 哎 那个我现在可以告诉你答案了,其实用连接池远程链接数据库太慢 不是程序问题 而且 不能说他太慢 我做了一个测试 ,以下是简易表格 循环次数本地/远程 是否使用连接池 消耗时间 本地是 5553ms左右 本地否 ms左右 远程是 ms左右 1000 远程否 ms这里面的差别 应该很明显了吧 使用连接池是很快的 尤其是最后我测试的时候,次我实在是等不了,所以用了1000次 结果 少了10倍的循环次数 居然用了那么多ms 希望这个答案可以帮助你 让你不再纠结 哈哈 至于原理 我想 主要是因为 它每次也要去跟别的机器联系一次有关系 ····· 不知是否正确 呵呵
hibernateinsert忽快忽慢
由于以下原因。 1、数据库性能问题:Hibernate执行插入操作时需要与数据库进行交互,如果数据库出现性能问题,那么Hibernate插入数据的速度也会变慢。 2、数据库连接池问题:Hibernate使用连接池来连接数据库,如果连接池中的连接不足或者连接泄露,那么Hibernate插入数据的速度也会受影响。 3、Hibernate配置问题:Hibernate的配置可能不正确,导致Hibernate执行插入操作时速度变慢。 4、数据库表结构问题:数据库表结构可能不合理,导致Hibernate执行插入操作时速度变慢。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。