我正在使用PostgreSQL作为数据库的SpringBoot应用程序,我正在从Jmeter进行负载测试,数据库托管在azure中,当我尝试向单个API或端点并行/并发地发送150个Rest请求时,我得到以下错误,但有100个请求它成功工作。
误差:
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
我想提高应用程序的性能,简而言之,解决上面的错误,当我们自动扩展我们的应用程序有两个实例,150个请求通过,但当我们运行一个实例,它给出了上述错误,我想理解
- 是内存问题还是数据库问题? 如何解决?
根据文档:
query_wait_timeout
查询允许等待执行的最大时间。如果在此期间未将查询分配给服务器,则客户机将断开连接。0禁用。如果禁用此功能,则客户端将无限期地排队。[秒]
此设置用于防止无响应的服务器抢占连接。当服务器关闭或由于任何原因拒绝连接时,它也很有帮助。
默认值:120
很可能PostgreSQL连接池中的所有连接都很忙,而你的应用程序在预定义的2分钟超时范围内无法获得一个连接。
选项在:
- 增加连接池大小
- 增加上述超时
- 查看Postgresql慢查询日志和这些查询的执行计划
- 使用JDBC请求采样器 隔离测试数据库
- 使用JProfiler或YourKit等分析工具来查看长处理是否在应用程序源代码的某个地方。