閱讀673 返回首頁    go 阿裏雲 go 技術社區[雲棲]


阿裏雲服務器CentOS7啟動tomcat7巨慢

自己再阿裏雲申請了一台1G1核的機器,每次重啟自己的服務tomcat都需要卡住很長時間
經過在網上搜索,找到了原因:

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在生產環境中使用熵池時,會被阻塞較長的時間。

基本上就是這樣,這裏講的更詳細!

下麵說解決方式:

網上說:

通過修改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啟動又回到了以往的速度。

最後更新:2017-05-08 17:31:00

  上一篇:go 家用檢測是醫療領域的另一個出路,市場需求廣闊
  下一篇:go PostgreSQL 使用advisory lock實現行級讀寫堵塞