Spring Boot 2.x 的性能问题?

Posted

技术标签:

【中文标题】Spring Boot 2.x 的性能问题?【英文标题】:Performance issues with Spring Boot 2.x? 【发布时间】:2019-11-10 16:44:52 【问题描述】:

我最近将 Web 应用程序中使用的 Spring Boot 版本从 1.5 版更新到了 2.1 版。当我针对它运行负载测试时,我的运行时间从 25 分钟变为 35 分钟。

我知道这是一个宽泛的问题,但是有没有人知道为什么在升级 Spring Boot 库后应用程序会如此显着变慢?

编辑:在花费大量时间尝试了解分析器输出之后,问题似乎出在与数据库的通信中。 Mariadb JDBC 驱动程序调用 java.io.FilterInputStream.read 从数据库中取回数据。根据分析器的说法,在 Spring Boot 2 中运行时,应用程序在此方法中花费的时间几乎是在 Spring Boot 1 中的两倍(两者都使用 Hikari)。相同的应用程序。相同的数据库。相同的 mariadb 驱动程序。只是 Spring 的版本发生了变化,无论 Spring 引入了什么(比如 tomcat 9 而不是 8,或者 hibernate 5.3 而不是 hibernate 5.0)

编辑#2:我做了更多的测试。我用降级的 Tomcat (8.5.37) 运行 Spring Boot 2.1,性能仍然很差,所以 Tomcat 似乎不是问题。接下来,我使用升级后的 Hibernate (5.3.10) 运行 Spring Boot 1.5,性能仍然很好,所以 Hibernate 似乎也不是问题。除了 Spring Boot 本身之外,这并没有留下太多的东西,而对于我来说,为什么 java.io 中的一个类在一个框架下会比另一个框架下花费更长的时间对我来说仍然是一个完全的谜。

这使我无法将 Spring Boot 更新推进到生产中,因此我感谢您的任何指点,

史蒂夫

【问题讨论】:

设置了哪些属性?代码有多复杂?后端是什么?有很多事情可能导致这种情况 25 分钟的测试已经很庞大了。只有完整的集成测试才会花费这么多时间。 它们是完整的集成测试,旨在展示应用程序在数千名用户中的表现,这就是运行需要一段时间的原因。这是一个使用 Tiles 和 JSP 页面作为前端的 Spring MVC 项目。我不会认为它是一个特别复杂的应用程序,所以当性能测试下降这么多时,我感到非常惊讶。我应该检查任何特定的属性吗?特别是从 Spring Boot 1.5 到 2.1 的变化? 【参考方案1】:

这可能不是完美的答案。

但只是一个观察:如果与版本 1(1.59) 相比,Spring boot 2(2.1.4 到 2.1.7)肯定存在性能问题。

我们运行了 8 小时的 JMeter 测试,达到 100-150 tps,这在两个版本中都维持了负载,但平均响应时间增加了近 50-70 毫秒,并且出现了很多峰值。

低于 2.1.4 的版本(2.1.3 性能稍好,但不是最好的。

1 >> 2.1.3 > 2.1.7

【讨论】:

【参考方案2】:

性能下降可能有很多原因。所以我建议在你的应用程序中包含javamelody-spring-boot-starter。

这样您可能会发现最长的 http 或 sql 请求之间的性能下降。

也许更重要的是,根据负载测试或生产中的统计数据,您可能会发现应该改进哪些 http 和 sql 请求的整体性能。

【讨论】:

感谢您指出 JavaMelody。我以前没听说过。我看到的结果很有趣。它表明 Spring Boot 2 中的大多数数字都比 Spring Boot 1 好。查询更快,服务方法更快,但整体性能更慢。在 Spring Boot 2 中标记为更高的 JavaMelody 的唯一数字是在 JSP 渲染中。你知道有什么方法可以让 JSP 更快吗?我不确定 JSP 是否单独解释了我所看到的放缓。还有什么我应该看的吗?

以上是关于Spring Boot 2.x 的性能问题?的主要内容,如果未能解决你的问题,请参考以下文章

一文带您搞清什么是 Spring Boot 2.x WebFlux

Spring Boot 性能优化

Spring Boot 性能优化

Spring Boot 嵌入式 Tomcat 性能

Spring boot servlet 在 Tomcat 中显示性能问题,但在 Jetty 中没有

Spring Boot 2.x(十四):整合Redis,看这一篇就够了