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)提供隨機種子。
JVM 啟動參數 java.security.egd 或 securerandom.source 指定熵源。若配置為 file:/dev/random,在熵池匱乏的生產環境(尤其是虛擬機/容器)中,Tomcat 會長時間卡在「收集環境噪聲」階段。
編輯 catalina.sh(Windows 為 catalina.bat),在 JAVA_OPTS 中新增:
-Djava.security.egd=file:/dev/./urandom
關鍵細節:路徑中加入 /./ 可繞過 JDK 的路徑檢查邏輯,確保確實使用 /dev/urandom。修改後啟動時間可從 6 分鐘降至 3 秒左右。
編輯 $JAVA_HOME/jre/lib/security/java.security,將:
securerandom.source=file:/dev/urandom
改為:
securerandom.source=file:/dev/./urandom
此法影響該 JRE 下所有 Java 應用,適合統一管理的環境。
haveged 或 rng-tools 服務,持續向熵池補充噪聲,從根本上緩解熵不足問題。SecureRandom 初始化邏輯,升級 JDK 版本亦可部分改善。採用上述任一方案,即可徹底解決 Tomcat 啟動因熵池阻塞而緩慢的問題,提升部署效率與系統可用性。