[轉] tomcat 7/8 啓動很是慢的解決方法

在日誌中發現啓動慢的地方:java

2016-11-14 09:31:30.522 [localhost-startStop-1] INFO  o.s.c.s.DefaultLifecycleProcessor - Starting beans in phase 2147483647
2016-11-14 09:31:30.556 [localhost-startStop-1] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 12902 ms
2016-11-14 09:32:33.146 [localhost-startStop-1] INFO  o.a.c.util.SessionIdGeneratorBase - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [62,587] milliseconds.
2016-11-14 09:32:33.214 [localhost-startStop-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'DispatcherServlet': initialization started

緣由:

Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例做爲會話ID,這裏花去了62秒,也即接近1分鐘,固然有時花費時間更長,達到5-10分鐘。web

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

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

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)方法進行初始化。session

這就是爲何咱們設置值爲」file:///dev/urandom」或者值爲」file:/./dev/random」都會起做用的緣由。dom

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

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

那麼什麼是環境噪聲?spa

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

解決:

有兩種解決辦法:

1)在Tomcat環境中解決

能夠經過配置JRE使用非阻塞的Entropy Source。

在catalina.sh中加入這麼一行:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

便可。

加入後再啓動Tomcat,整個啓動耗時迅速降低。

2)在JVM環境中解決

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

securerandom.source=file:/dev/urandom

替換成

securerandom.source=file:/dev/./urandom
相關文章
相關標籤/搜索