tomcat在centos下啟動緩慢,耗時較長


將tomcat部署到docker環境,啟動docker tomcat非常順利,先是通過ip加8080端口訪問,發現半天打不開,因為環境在國外,以為是網絡慢等原因打不開,也沒有在意。就等了10來分鍾,發現打開出現 500 internal privoxy error  這個錯誤,網上google這個問題,發現是后端訪問不到,查看tomcat日志,發現有Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds。此處耗費了很長的時間,上網查詢解決。

以下是我系統信息:

tomcat版本:

Server version: Apache Tomcat/8.0.32
Server built: Feb 2 2016 19:34:53 UTC
Server number: 8.0.32.0
OS Name: Linux
OS Version: 3.10.0-514.6.1.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_72-internal-b15
JVM Vendor: Oracle Corporation

內存:

[root@mailatp ~]# free -g
total used free shared buff/cache available
Mem: 1 0 0 0 0 0
Swap: 0 0 0

 

原因:

Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例作為會話ID,這里花去了342秒,也即接近6分鍾。

SHA1PRNG算法是基於SHA-1算法實現且保密性較強的偽隨機數生成器。

在SHA1PRNG中,有一個種子產生器,它根據配置執行各種操作。

 

1)如果Java.security.egd 屬性或securerandom.source屬性指定的是”file:/dev/random”或”file:/dev/urandom”,那么JVM 會使用本地種子產生器NativeSeedGenerator,它會調用super()方法,即調用 SeedGenerator.URLSeedGenerator(/dev/random)方法進行初始化。

 

2)如果java.security.egd屬性或securerandom.source屬性指定的是其它已存在的URL,那么會調用SeedGenerator.URLSeedGenerator(url)方法進行初始化。

 

這就是為什么我們設置值為”file:///dev/urandom”或者值為”file:/./dev/random”都會起作用的原因。

 

在這個實現中,產生器會評估熵池(entropy pool)中的噪聲數量。隨機數是從熵池中進行創建的。當讀操作時,/dev/random設備會只返回熵池中噪聲的隨機字節。/dev/random非 常適合那些需要非常高質量隨機性的場景,比如一次性的支付或生成密鑰的場景。

 

當熵池為空時,來自/dev/random的讀操作將被阻塞,直到熵池收集到足夠的環境噪聲數據。這么做的目的是成為一個密碼安全的偽隨機數發生器,熵池要有盡可能大的輸出。對於生成高質量的加密密鑰或者是需要長期保護的場景,一定要這么做。

 

隨機數產生器會手機來自設備驅動器和其它源的環境噪聲數據,並放入熵池中。產生器會評估熵池中的噪聲數據的數量。當熵池為空時,這個噪聲數據的收集是比較花時間的。這就意味着,Tomcat在生產環境中使用熵池時,會被阻塞較長的時間。

 

解決 

有兩種解決辦法:

 

1)在Tomcat環境中解決

 

可以通過配置JRE使用非阻塞的Entropy Source。

 

在catalina.sh中加入這么一行:-Djava.security.egd=file:/dev/./urandom 即可。

 

加入后再啟動Tomcat,整個啟動耗時下降到Server startup in 2912 ms。

 

2)在JVM環境中解決

 

打開$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內容:

 

securerandom.source=file:/dev/urandom 

替換成

securerandom.source=file:/dev/./urandom

 

本次使用第一種方式解決:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM