首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Tomcat 8 啟動緩慢:熵池阻塞問題深度解析與解決方案

     編輯:Java 綜合教學

問題現象

Tomcat 8 啟動異常緩慢,日誌中並無報錯信息,但記錄了關鍵提示:

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.

顯然,創建 SecureRandom 實例耗時 342 秒(近 6 分鐘),導致啟動嚴重延遲。

根本原因:熵池耗盡導致阻塞

Tomcat 7/8 使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 生成會話 ID 所需的安全隨機數。預設採用 SHA1PRNG 算法,該算法依賴系統熵池(entropy pool)提供隨機種子。

熵池運作機制

  • /dev/random:阻塞式設備。當熵池噪聲數據不足時,讀取操作會阻塞,直到收集到足夠環境噪聲(鍵盤、滑鼠、磁碟 I/O 等硬體中斷產生)。適合生成長期密鑰等高安全場景。
  • /dev/urandom:非阻塞式設備。熵池不足時會重用現有熵值,雖然理論安全性略低,但足以應付會話 ID 生成等大多數應用場景。

JVM 啟動參數 java.security.egd 或 securerandom.source 指定熵源。若配置為 file:/dev/random,在熵池匱乏的生產環境(尤其是虛擬機/容器)中,Tomcat 會長時間卡在「收集環境噪聲」階段。

解決方案

方案一:修改 Tomcat 啟動腳本(推薦)

編輯 catalina.sh(Windows 為 catalina.bat),在 JAVA_OPTS 中新增:

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

關鍵細節:路徑中加入 /./ 可繞過 JDK 的路徑檢查邏輯,確保確實使用 /dev/urandom。修改後啟動時間可從 6 分鐘降至 3 秒左右。

方案二:修改 JRE 安全策略文件

編輯 $JAVA_HOME/jre/lib/security/java.security,將:

securerandom.source=file:/dev/urandom

改為:

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

此法影響該 JRE 下所有 Java 應用,適合統一管理的環境。

最佳實踐建議

  1. 生產環境優先使用方案一,範圍可控,不影響其他應用。
  2. 若運行在虛擬機/容器,建議安裝 haveged 或 rng-tools 服務,持續向熵池補充噪聲,從根本上緩解熵不足問題。
  3. Java 8u121+ 已優化 SecureRandom 初始化邏輯,升級 JDK 版本亦可部分改善。

採用上述任一方案,即可徹底解決 Tomcat 啟動因熵池阻塞而緩慢的問題,提升部署效率與系統可用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved