spring-boot 项目启动过慢问题##
问题表现
最近手上一个基于 spring-boot 开发的系统在阿里云的 ECS 上(ubuntu 14.04)启动过程中碰到启动时间过长问题,表现如下,启动日志长时间处于一下状态:
即系统会卡在:
INFO o.s.b.c.e.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*]
这句日志上长达十分钟以上。
分析流程如下
-
找出耗时较长的线程,用 jps 命令或者 top 命令。
-
使用 top 命令能够发现占用系统资源较多的 java 进程。如下图:
- 用 jstack 命令分析 java 进程
jstack 25717
,结果如下
发现localhost-startStop-1这个线程一直处于 runnable 状态,在 google 上查询对应的关键字,发现篇文章Tomcat startup time surprises,大意是说:启动Spring Boot内嵌的Tomcat时会话创建一个安全的ID生成器,为了提供最高的安全级别,Java使用
/dev/random
作为随机数生成器。但是/dev/random
工作方式是阻塞式的。上述文章也提供了解决方案,采用
/dev/urandom
(非阻塞式的,但是安全性会低一些)来生成随机数。 -
解决方案
根据上述文章,可以修改系统属性将Spring Boot的嵌入式Tomcat实例配置为使用/dev/urandom
来生成随机来解决这个问题。具体操作如下,在.bashrc
中添加如下的环境变量。
export MAVEN_OPTS=-Djava.security.egd=file:/dev/urandom
执行 source .bashrc
即可。
重新启动系统,上述问题解决
参考文章:
网友评论