公司服務器剛換CentOS7,在內部的刀片機上一直跑的很溜,遷移到阿里雲上後Tomcat啓動居然要六、7分鐘!這還了得。java
且日誌上無任何錯誤,在日誌中查看到以下信息:算法
Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 - Loading properties file from class path resource [resources/jdbc.properties] Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 - Loading properties file from class path resource [resources/common.properties] 29-Oct-2015 15:52:53.587 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [342,445] milliseconds.
通過在網上搜索,找到了緣由:apache
Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例做爲會話ID,這裏花去了342秒,也即接近6分鐘。安全
SHA1PRNG算法是基於SHA-1算法實現且保密性較強的僞隨機數生成器。服務器
在SHA1PRNG中,有一個種子產生器,它根據配置執行各類操做。session
1)若是Java.security.egd屬性或securerandom.source屬性指定的是」file:/dev/random」或」file:/dev/urandom」,那麼JVM會使用本地種子產生器NativeSeedGenerator,它會調用super()方法,即調用SeedGenerator.URLSeedGenerator(/dev/random)方法進行初始化。dom
2)若是java.security.egd屬性或securerandom.source屬性指定的是其它已存在的URL,那麼會調用SeedGenerator.URLSeedGenerator(url)方法進行初始化。ui
這就是爲何咱們設置值爲」file:///dev/urandom」或者值爲」file:/./dev/random」都會起做用的緣由。阿里雲
在這個實現中,產生器會評估熵池(entropy pool)中的噪聲數量。隨機數是從熵池中進行建立的。當讀操做時,/dev/random設備會只返回熵池中噪聲的隨機字節。/dev/random很是適合那些須要很是高質量隨機性的場景,好比一次性的支付或生成密鑰的場景。加密
當熵池爲空時,來自/dev/random的讀操做將被阻塞,直到熵池收集到足夠的環境噪聲數據。這麼作的目的是成爲一個密碼安全的僞隨機數發生器,熵池要有儘量大的輸出。對於生成高質量的加密密鑰或者是須要長期保護的場景,必定要這麼作。
那麼什麼是環境噪聲?
隨機數產生器會手機來自設備驅動器和其它源的環境噪聲數據,並放入熵池中。產生器會評估熵池中的噪聲數據的數量。當熵池爲空時,這個噪聲數據的收集是比較花時間的。這就意味着,Tomcat在生產環境中使用熵池時,會被阻塞較長的時間。
基本上就是這樣,這裏講的更詳細!
下面說解決方式:
網上說:
經過修改Tomcat啓動文件-Djava.security.egd=file:/dev/urandom
經過修改JRE中的java.security文件securerandom.source=file:/dev/urandom
這兩種方式在我這都失敗,不起做用,不知道是個人問題,仍是其餘問題。
最終解決方式:
yum install rng-tools
安裝rngd服務(熵服務)
systemctl start rngd
啓動服務
若是你的CPU不支持DRNG特性或者像我同樣使用虛擬機,可使用/dev/unrandom來模擬。
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
編輯/etc/systemd/system/rngd.service
service小結,ExecStart=/sbin/rngd -f -r /dev/urandom
systemctl daemon-reload
從新載入服務
systemctl restart rngd
重啓服務
這樣安裝了熵服務後問題就解決了,Tomcat啓動又回到了以往的速度。
後來我在公司刀片機上看了一下,是有裝熵服務器,而阿里雲沒有,好坑!