Site icon Mr. 沙先生

Tomcat 7+ 用 SecureRandom 導致啟動服務緩慢

今天在安裝 Tomcat,跑的是 8.5,在測試的過程中發現 Tomcat 啟動的速度異常的緩慢,第一時間先看 catalina.out:

16-Jul-2017 11:52:30.698 WARNING [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [499,796] milliseconds.

 

環境:

 

哭,在 Create Session ID 的這個階段就跑了 8 分多鐘 …,爬文找到 Apache Wiki 裡面提到 Entropy Source 從 Tomcat 7+ 之後會使用 SecureRandom 來產生 Session-ID

Tomcat 7+ heavily relies on SecureRandom class to provide random values for its session ids and in other places. Depending on your JRE it can cause delays during startup if entropy source that is used to initialize SecureRandom is short of entropy.

 

裡面有講到解法可以不使用 non-blocking entropy source,但有提到安全問題,Random Data 會太少,如果每次 Deploy 都這麼慢,那 CI / CD 在 Tomcat 每次 Deploy 的時間會讓你想哭,雖然 Tomcat 提供了有 Autodeploy,但時間真的太久了。

 

裡面還提到在 Java 8 有改善 SecureRandom,根本還是慢 …

It is known that implementation of SecureRandom was improved in Java 8 onwards.

 

最後我用的解法是在 Tomcat 的啟動參數加上 -Djava.security.egd=file:/dev/./urandom

$ echo "CATALINA_OPTS="-Djava.security.egd=file:/dev/./urandom" > ${catalina_home}/bin/setenv.sh

${catalina_home} 是你安裝 Tomcat 的 prefix

 

加上後再 start 就會發現不跑 SecureRandom 了,啟動只要 899ms

16-Jul-2017 13:12:38.540 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 899 ms

 

 

後記:

除了用 urandom 以外,同事也提到能用 haveged 產生 random entropy 是虛擬機比較底層的解法,這個在「Slow startup on Tomcat 7.0.57 because of SecureRandom」也有提到「How to install haveged

 

在 Java 還真是容易採坑 …

 

 

 

Exit mobile version