spring-boot - 当AWS中并发api调用超过10000时,Spring book 2 Hikari连接不可用
问题描述
我正在将 Spring Boot 2 用于 API,托管在 aws ecs fargate 上。数据库是 RDS 上的 postgress 10.6,具有 16 gb ram 和 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() 方法..
那么连接不可用和请求超时的根本原因应该是什么 10k api 请求.. 池大小为 100.. 为什么在活动连接达到 100 并且等待为 100 后它不释放任何连接?我的 ECS 应用程序服务器会自动重启并出现此错误,并且仅在 5-7 分钟后才能访问..
解决方案
HikariCP建议您在测试minimumIdle
时出现峰值需求时移除
为了获得最大性能和对尖峰需求的响应,我们建议不要设置此值,而是允许 HikariCP 充当固定大小的连接
如果你删除它。空闲超时也无关紧要
推荐阅读
- powershell - 每 3 秒清除一次运行无限循环的 powershell 的内存/缓冲区
- dart - Flutter:传递未来
与图表一样 - ms-access - 应用程序定义或对象定义的错误设置子表单记录源
- python - 如何使用 sun Grid Engine qsub 传递包含大括号的命令行参数?
- python - 量化递减收益或线性回归或其他?
- java - java netbeans 新的驱动类是`com.mysql.cj.jdbc.Driver'
- xamarin.ios - 尝试转到上一个情节提要时出现 NullReferenceException
- roslyn - 在 Roslyn Analyzer 中获取元组类型
- ruby-on-rails - 如何在rails中的CSV字符串中添加新列
- c++ - 如何提示用户重新循环整个程序?