log4j因随机数导致springboot项目启动慢

项目启动慢,并且没有启动日志,开发环境和windows服务器都正常,到linux后出现问题,你觉得会是哪儿的问题?

最近收到一位同事求助,说springboot应用在客户的一台Linux机器上启动非常慢,超过10分钟,并且没有任何日志。而之前部署在window服务器上面没有问题;

 

 

 

正是因为这个求助,我开始重新审查之前遗留的一个spring微服务启动慢的问题。于是我开始分析之前遗留的项目问题,如果解决了,没准能一箭双雕,把这次同事的问题也解决了。经过我缜密的分析,顺利将历史遗留的spring cloud启动慢的问题给解决了,并且写了一个总结分享给了同事,案例分享在这里。在解决了spring cloud服务启动慢的问题后,我怀疑这个项目的linux服务器也是相同的原因。于是我让他先配置host,把ipv6的解析也配置上。但是,同事说配置host后启动还是很慢。这就奇了怪了。



jstack利器

 

对于这种日志都没有打印出来的程序,只能使用jstack先尝试看看,能否取到当前运行堆栈了。于是我让同事给打印了一个,结果如下:

 

 

 

当我看到最上面一行,我首先怀疑是系统在启动的时候,读取到没有权限的文件或者不存在的文件了。



 

 

并指出是入口方法第16行,结果同事给我截图源码,16行只是springboot的程序的启动方法。而同事也有自己的看法,他觉得这台linux机器的jdk安装有问题。中间争论不休(此处省略3000字),一度陷入歧途。

后来我又认真看了看代码和堆栈,发现是springboot在启动的时候,需要用到一个uuid,而uuid依赖随机数,系统在生成随机数的时候阻塞了。

 

 

 

 

发现问题,百度一下,发现可以通过增加jvm参数-Djava.security.egd=file:/dev/urandom来解决。

于是让同事增加测试,增加之后,启动速度快了很多(意思是比原来快了,但是仍然比在本机启动慢)。好家伙,百度方案不好使啊。于是我又深入的研究了一下。发现是linux熵池耗尽导致随机数生成慢。估计是这台linux老久没人使用了。解决方法就是使用软件,增加熵池的值。我安装的ng-tools,安装方法可以百度。

安装之后,程序启动比在本机和linux启动还快。

 

你可能会有疑问,这个问题其实可以一开始就看出来。但是换做是你,也未必一眼就看出问题。这个问题发生的时候,同事还在问我另外一个海康威视sdk导致程序崩溃的问题。现实就是这样,你必须在吵闹的环境中保持冷静,才能找到问题的原因。

 

也许你对以下话题也感兴趣

生产环境部署springcloud微服务启动慢的问题排查

 

看别人踩坑,铺平自己的路,欢迎关注猿界汪汪队;

 

posted @ 2021-12-09 21:38  猿界汪汪队  阅读(747)  评论(2编辑  收藏  举报