迁移到虚拟线程后,Spring Boot 应用程序的延迟增加

Increased latency over Spring Boot application after moving to Virtual Thread

提问人:Naman 提问时间:11/13/2023 最后编辑:Naman 更新时间:11/14/2023 访问量:68

问:

我最近迁移了部署的一个应用程序,以使用引用本文档的虚拟线程。spring-bootJDK-21

尽管此更改后,应用程序的平均延迟(~40ms)没有太大变化,但与过去相比,第 99 个百分位数略有不同。

- 悬停部署时间后下图中当前周期线和上一周期线之间的间隙。enter image description here

在观察 JVM 指标后,我唯一可以得出的相关性是与应用程序报告的 BlockedWaiting 线程计数增加的变化有关。enter image description here

我有一个明显的问题是,以我的方式使用虚拟线程是否正确。还有其他因素需要考虑吗?

此外,是什么原因导致了通过指标报告的线程状态的变化?请注意,大约在一天内,这些数字在图像中没有那么高,抖动模式。

信息 - 应用程序使用基于 .spring-boot:3.1.4spring-framework:6.0.12

java spring-boot java-21 虚拟线程

评论

0赞 M. Deinum 11/13/2023
如果看不到您的应用程序,这将无法回答。我还建议仔细阅读虚拟线程,特别是何时使用它们以及何时使用它们。它们在某些情况下很有用,而在其他情况下则没有,只会降低性能。
0赞 Naman 11/14/2023
@M.Deinum,您在应用程序中具体暗示了可能导致这种情况的原因是什么?我认为(询问的原因)该更改在平台本身非常通用,唯一涉及的主要代码行是protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
0赞 M. Deinum 11/14/2023
虚拟线程在用于 IO 绑定任务时提供最大优势,而不是用于计算绑定任务。另一件事是,根据 Spring (Boot) 的版本,您可能会由于使用关键字和使用 s 而遇到线程固定问题。在 Spring Framework 6 及更高版本中,已经做出了真正的努力来更改框架的某些部分,以便更好地与虚拟线程一起工作。syncronizedThreadLocal
0赞 Naman 11/14/2023
@M.Deinum 我的应用程序使用的 Spring Boot 版本很可能是基于 .感谢您的强调,我确实知道启动 3.2 很可能很快就会正式发布,并且将有 6.1.0 和更多关于虚拟线程的工作。会等待,尝试升级以跟进我的发现。3.1.4spring-framework:6.0.12
0赞 Naman 11/27/2023
@M.Deinum 已升级到 spring-boot:3.2,但延迟趋势保持不变。我是否应该认为仅建议在某些应用程序中使用通过 spring boot 使用虚拟线程?

答: 暂无答案