springboot項目啟動慢,懷疑jdk有問題

項目啟動慢,並且沒有啟動日誌,開發環境和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微服務啟動慢的問題排查

 

Tags: