SpringBoot单实例压测150请求遇PostgreSQL query_wait_timeout问题咨询
问题描述
我使用SpringBoot应用搭配Azure上的PostgreSQL数据库,通过JMeter做负载测试:
- 并发100个请求访问单个API接口时正常运行
- 并发150个请求时出现错误
- 应用自动扩缩至2个实例时,150个请求可正常执行,但单实例状态下触发如下错误日志:
2022-12-21 17:29:43.000 WARN 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08P01 2022-12-21 17:29:43.000 ERROR 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper : FATAL: query_wait_timeout 2022-12-21 17:29:43.000 WARN 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08006 2022-12-21 17:29:43.001 ERROR 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper : An I/O error occurred while sending to the backend. 2022-12-21 17:29:43.090 WARN 1 --- [http-nio-8080-exec-61] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08P01 2022-12-21 17:29:43.090 ERROR 1 --- [http-nio-8080-exec-61] o.h.engine.jdbc.spi.SqlExceptionHelper : FATAL: query_wait_timeout
需要明确:
- 该问题属于内存问题还是数据库问题?
- 如何解决该问题?
问题分析与解决方案
1. 问题类型判定
这是数据库相关问题,并非应用内存问题:
- 错误日志中明确出现
FATAL: query_wait_timeout,这是PostgreSQL的查询等待超时错误,意味着数据库无法及时处理排队的查询请求,导致请求超时被终止; - 应用扩缩到2个实例后,请求被分摊到两个实例,每个实例发起的数据库请求量减少,数据库能承受,因此恢复正常;
- 内存问题通常会伴随
OutOfMemoryError等日志,当前日志中无相关信息,可排除内存问题。
2. 解决方法
(1)调整PostgreSQL的query_wait_timeout参数
query_wait_timeout控制查询在数据库队列中等待执行的最长时间,默认值可能较短。可以在Azure门户中找到对应的PostgreSQL实例,进入“服务器参数”页面,将该参数调大(比如从默认的5秒调整为10-15秒),给数据库足够的时间处理排队请求。
(2)优化数据库连接池配置
Spring Boot默认使用HikariCP连接池,调整以下参数避免单实例发起过多数据库连接:
spring.datasource.hikari.maximum-pool-size:根据数据库的最大连接数限制合理设置,避免连接数耗尽导致请求排队;spring.datasource.hikari.connection-timeout:调整连接超时时间,适配数据库的处理能力。
(3)优化API对应的SQL查询
检查该接口执行的SQL是否存在性能瓶颈:
- 使用
EXPLAIN分析SQL执行计划,查看是否存在全表扫描、缺少索引等问题; - 给查询字段添加合适的索引,减少单条SQL的执行时间,提升数据库的并发处理能力。
(4)调整应用实例的并发配置
限制单实例的并发请求数,避免瞬间发起过多数据库请求:
- 修改Spring Boot的Tomcat线程配置:
server.tomcat.max-threads,设置合理的最大值(比如200以内),让请求在应用层排队,避免压垮数据库。
(5)升级Azure PostgreSQL实例规格
如果数据库本身的CPU、内存资源不足,无法支撑高并发请求,可以考虑升级Azure PostgreSQL的实例规格,选择更高配置的虚拟机类型,提升数据库的整体处理能力。
内容的提问来源于stack exchange,提问作者Keshav Sahu
相关产品推荐
相关产品推荐

