springbootのtomcat起動が遅い問題分析
2410 ワード
今日はサーバー上のspringbootプログラムの起動がとても遅くて、完全に起動して何分間もかかりました。最初はコードが書いてあると思いましたが、カードが死んでしまいました。このロゴを見るまでは:
実は、この問題は前から聞いていましたが、会ったことがないので、あまり気にしていません。今日はとうとう私を出会わせました。
tomcatの文書にEntropy Source(エントロピーソース)という概念があります。
Tomcat 7+heavily relies on Securelandom clast to provide randm values for its session ids and in others places.Depending on your JRE it can can cause delays during startup phy source Statch is.rant。e.g.org.apphe.cantalina.util.Session IdGenerator createSecureRandom INFO:Creation of Secureed instance for session ID generation using[SHA 1 PRNG]took[5172]miliconds.
tomcat 7以上のバージョンで、起動時に
jdkのプロファイルには、
解決策は、非ブロッキングエントロピーソース
2017-03-08 10:06:49.600 INFO 6439 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8888 (http)
2017-03-08 10:06:49.613 INFO 6439 --- [main] o.apache.catalina.core.StandardService : Starting service Tomcat
2017-03-08 10:06:49.614 INFO 6439 --- [main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.37
......
2017-03-08 10:09:10.167 INFO 6439 --- [ost-startStop-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [140,108] milliseconds.
元々はtomcatの起動に140秒以上かかりました。その元凶はSecureRandom
類です。実は、この問題は前から聞いていましたが、会ったことがないので、あまり気にしていません。今日はとうとう私を出会わせました。
tomcatの文書にEntropy Source(エントロピーソース)という概念があります。
Tomcat 7+heavily relies on Securelandom clast to provide randm values for its session ids and in others places.Depending on your JRE it can can cause delays during startup phy source Statch is.rant。e.g.org.apphe.cantalina.util.Session IdGenerator createSecureRandom INFO:Creation of Secureed instance for session ID generation using[SHA 1 PRNG]took[5172]miliconds.
tomcat 7以上のバージョンで、起動時に
クラスを呼び出して乱数を生成するという意味です。SecureRandom
を初期化するためのSecureRandom
が
であると(エントロピーが足りない)、記事の先頭にあるwarningが報告されます。jdkのプロファイルには、
を用いてエントロピーソースが設定されている。cat /usr/java/jdk1.8.0_121/jre/lib/security/java.security
securerandom.source=file:/dev/random
標準値は、securerandom.source
であることが見られます。したがって、プログラム起動後/dev/random
クラスは、ランダムシーケンスを取得するためにSecureRandom
を読み出し、同期動作である。/dev/random
に十分なエントロピーがない場合、読み取り (entropy pool)
は、十分なエントロピーが収集されるまで、プログラムが継続的に進行することができます。(/dev/random
とは何ですか?wikiの紹介を見てもいいです。)解決策は、非ブロッキングエントロピーソース
/dev/random
に修正されたものであり、/dev/urandom
ファイルのjava.security
値を変更することもでき、パラメータsecurerandom.source
を使用することもできる。java -jar app.jar -Djava.security.egd=file:/dev/./urandom
なぜjava.security.egd
なのかというと、/dev/./urandom
ではなく、javaのバグからきています。/dev/urandom
は、場合によっては最終的には/dev/urandom
を呼び出すように変換されるかもしれません。ですから、念のために、/dev/random
を使用しましょう。