基本 Spring boot + Postgresql 应用程序的性能问题

问题描述 投票:0回答:1

我有基于 spring security/spring boot 和 postgresql 数据库构建的用户身份验证微服务。当我以每秒 1000 个请求开始性能测试时,我发现服务的响应时间长达 16 秒,这绝对是不可接受的。我做了分析,发现大部分时间都被

ConcurrentBag#borrow
TransactionAspectSupport#invokeWithinTransaction
方法消耗了。知道如何解决这个问题。它托管在 heroku 上。我已将微服务实例增加到 2 个,还增加了数据库 cpu、内存和磁盘,但这没有帮助。

spring boot版本是3.2.3

截图

postgresql spring-boot heroku spring-data-jpa performance-testing
1个回答
0
投票

我只是瞪大了眼睛

ConcurrentBag borrow
,第一个点击是https://javadoc.io/doc/com.zaxxer/HikariCP/2.4.3/com/zaxxer/hikari/util/ConcurrentBag.html

如果这确实是我们所说的

ConcurrentBag
,那么您的连接池似乎已超载,并且请求正在等待获取连接。 这就是 @M.Deinum 在他的评论中提到的。

有多种方法可以解决这个问题。 哪一种是正确的很大程度上取决于您的环境。

  1. M。 Deinum 有一个非常好的观点:需要支持 1000 个请求/秒吗?这是一些严重的负担。
  2. 如果确实是连接池的问题,您可以增加池中的连接数。当然,在很多情况下,这只会让你的数据库感到恶心,但我想这是值得一试的。
  3. 为连接池使用较短的超时。这将使一些请求最终失败。但由于 16 秒的响应时间,他们基本上失败了。
  4. 缩短您的交易时间,这在大多数情况下与您的连接持续时间一对一地映射。这就是@sge 的评论的内容

    您启用了 spring.jpa.open-in-view 吗?你可以尝试禁用它。启用后,整个请求的 dbconnection 将从池中取出。

  5. 首先不要使用缓存来访问数据库。当然,这可能在测试中效果很好,但在生产中完全失败,因此请确保您测量的内容是现实的。
© www.soinside.com 2019 - 2024. All rights reserved.