0%

使用性能分析工具定位Spring Boot启动慢问题

背景
项目最近做了大的改动,添加了大量配置,Spring Boot项目启动时间从原来的100秒变成了400秒以上。从大量无效日志中一时难以看出瓶颈所在。首先需要一款性能分析软件,发现Intel® VTune™ Profiler对项目性能影响甚小。

性能分析
VTune是 Intel 提供的一个强大的应用程序性能分析软件,如何使用只需要看这两篇官方教程。(下载需要注册intel账号)
《在windows上面启动》https://software.intel.com/en-us/get-started-with-vtune-windows-os
《分析Java程序》https://software.intel.com/zh-cn/vtune-help-java-code-analysis
为了能够在VTune分析Java项目,首先创建一个启动脚本启动项目,然后在VTune创建一个性能分析项目开启性能监控。
start.bat脚本如下,很简单。

java -jar myboot.jar
1

项目启动后结束性能监控,VTune会自动分析监控结果,在Bottom-up Tab页可以看到哪些方法花费了大量CPU时间。
其中Spring的一个matches方法就占用了50秒。

org.springframework.boot.bind.DefaultPropertyNamePatternsMatcher.matches
1

性能瓶颈
查阅DefaultPropertyNamePatternsMatcher.matches源码及资料,matches的作用是根据我们在ConfigurationProperties中设置的prefix的值获取对应的匹配项。
由于分库分表后有多个主库与从库,Properties配置了大量不同的数据源。解析这些数据源配置耗费了大量时间,再加上解析后初始化数据源对象。

spring.datasource.url=jdbc:mysql://127.0.0.1:3310/test
spring.datasource.username=root
spring.datasource.password=123456
1
2
3
@Bean(name = “masterDataSource”)
@ConfigurationProperties(prefix = “spring.datasource”)
public DataSource masterDataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
}
1
2
3
4
5
根据Spring官方github,matches在匹配prefix值的过程中确实性能欠佳,尤其是prefix越短所花费的匹配时间越长。
详见:spring boot startup performance issue when large properties file

改善
matches性能问题在Spring Boot 2中已经得到改善,但项目升Spring Boot 2遥遥无期。
既然瓶颈在过多的prefix,首先可以减少prefix配置但治标不治本。最终解决方法为本地调试绕过Spring matches方法,改用测试插件去初始化数据源,将项目启动时间从400秒压缩为100秒左右。
————————————————
版权声明:本文为CSDN博主「tom3mao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/j16421881/article/details/105444700

Welcome to my other publishing channels