首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当并发api调用aws中的10000以上时,Spring 2 Hikari连接不可用

当并发api调用aws中的10000以上时,Spring 2 Hikari连接不可用
EN

Stack Overflow用户
提问于 2020-07-16 08:40:46
回答 3查看 1.4K关注 0票数 1

我使用spring 2作为API,托管在aws ecs fargate上。数据库在RDS上为10.6级,16 gb内存,4 cpu。

我的hikari配置如下:

代码语言:javascript
运行
复制
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1
spring.datasource.hikari.maximum-pool-size=100
spring.datasource.hikari.minimum-idle=80
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=500000
spring.datasource.hikari.max-lifetime=1800000

一般情况下这是完美的..。但是当负载出现在服务器上时,比如说大约5000并发API请求.(这也不是很大.),我的应用程序会崩溃。启用了hikari的调试日志。因此,获取以下信息:

代码语言:javascript
运行
复制
hikaripool-1 - pool stats (total=100 active=100 idle=0 waiting=100)

异常消息显示连接不可用:

代码语言:javascript
运行
复制
HikariPool-1 - Connection is not available, request timed out after 30000ms.
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC

同时,当我看到RDS提高了性能时,最大查询执行时间也是< 0.03 second..And CPU利用率也低于50%。所以数据库服务器没有问题。

我只使用实体和JPA。不通过手动打开连接来使用任何查询。因此,关闭连接或连接泄漏可能不是问题。但在启用泄漏检测之后:

代码语言:javascript
运行
复制
spring.datasource.hikari.leakDetectionThreshold=2000

在日志中获取警告,显示明显的连接泄漏检测到:当我检查指向此错误的方法时:那么它只是JPA findById()方法。

那么,什么应该是连接不可用的根本原因,并且只为10k api请求请求超时。有100个游泳池大小..。为什么在活动连接转到100,等待是100之后,它不释放任何连接?我的ECS应用服务器在此错误下自动重新启动,并仅在5-7分钟后才可访问。

EN

回答 3

Stack Overflow用户

发布于 2020-07-16 09:04:25

在测试时,HikariCP建议在出现尖峰需求时删除minimumIdle

为了最大限度地提高性能和响应尖峰需求,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接。

如果你把它移除。同时,空闲超时也是无关的。

另见为HikariCP配置PostgreSQL

票数 0
EN

Stack Overflow用户

发布于 2022-08-17 09:21:25

由于配置中的连接池大小错误,您的应用程序可能会将其限制为超时。池的大小是100的10倍,这将影响性能和稳定性。

HikariCP池大小公式可以在它们的维基中找到,但看起来如下所示:

((core_count * 2) + effective_spindle_count)。核心计数不应包括HT线程,即使启用了超线程。

如果您有4个核心,那么您的连接池大小可以保持在默认大小为10。

票数 0
EN

Stack Overflow用户

发布于 2022-11-20 21:09:11

如果这可能有帮助的话,我最近正面临着这个问题,这给了我一段艰难的时光。

服务器接受太多hikari池无法处理的请求,因此hikari试图获得额外的连接以满足需求的激增。

例如:对于带有200个默认线程的tomcat,如果您的maxPoolSize = 10,在峰值请求时,您的服务器将尝试同时服务200个线程。如果池中的连接繁忙,hikari将尝试获得190个连接,这就是您在等待中看到的。

我就是这样管理它的。

我确保tomcat线程不会超过hikari maxPoolSize的数量。这样,就不需要在高峰期间要求更多的联系了。

在spring引导中,这是我使用的配置。

代码语言:javascript
运行
复制
server.tomcat.threads.max = 50
spring.datasource.hikari.maximumPoolSize = 50

注意: 50是根据您的服务器容量而变化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62930825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档