我正在使用Spring Boot 2的API,托管在aws ecs fargate。和数据库是postgress 10.6的RDS与16 gb的内存和4 cpu。
我的hikari配置如下:
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..所以得到以下消息:
hikaripool-1 - pool stats (total=100 active=100 idle=0 waiting=100)
异常消息表示连接不可用:
HikariPool-1 - Connection is not available, request timed out after 30000ms.
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC
同时,当我看到RDS的postgress性能更深入,最大查询执行时间〈0.03秒..和CPU利用率也低于50%。所以没有问题的数据库服务器。
我只使用entitymager和JPA...不使用任何手动打开连接的查询。所以关闭连接或连接泄漏可能不是问题。但是在启用泄漏检测后:
spring.datasource.hikari.leakDetectionThreshold=2000
日志中出现警告,指出检测到明显的连接泄漏:当我检查指向此错误的方法时:那么它就是JPA findById()方法。
那么,连接不可用和请求超时的根本原因应该是什么?只有10 k api请求..与100池大小..为什么它不释放任何连接后,活动连接去100和等待是100?我的ECS应用程序服务器自动重新启动与此错误和访问后,只有5-7分钟后..
3条答案
按热度按时间nue99wik1#
HikariCP建议在测试时出现 * 峰值需求 * 时删除
minimumIdle
为了最大化性能和对高峰需求的响应,我们建议不要设置此值,而是允许HikariCP作为固定大小的连接
如果您删除它,idle-timeout也是无关紧要的
另请参阅configure HikariCP for PostgreSQL
xzabzqsa2#
很可能是由于配置中的连接池大小错误,应用程序将自己限制为超时。100的池大小是10倍,这将影响性能和稳定性
HikariCP Pool大小公式可以在他们的wiki中找到,但它看起来像这样:
((core_count * 2)+ effective_spindle_count).内核计数不应包括超线程,即使启用了超线程.
如果您有4个核心,则可以将连接池大小保留为默认大小10。
hfsqlsce3#
如果这可能有帮助的话,我最近正面临这个问题,它给了我一段坚韧的时光。
服务器接受了太多hikari池无法处理的请求,因此hikari尝试获得额外的连接来满足这一需求高峰。
例如,对于有200个默认线程的tomcat,如果maxPoolSize = 10,在高峰请求时,服务器将尝试同时服务200个线程。如果池中的连接忙碌,hikari将尝试获得190个连接,这就是您在等待中看到的。
这是我的管理方式。
我确保了tomcat线程不会超过hikari maxPoolSize的数量,这样在spike期间就不需要请求更多的连接了。
在Spring Boot 中,这是我使用的配置。
注意:50是可变的,具体取决于服务器容量