springbootのtomcat起動が遅い問題分析

2410 ワード

今日はサーバー上のspringbootプログラムの起動がとても遅くて、完全に起動して何分間もかかりました。最初はコードが書いてあると思いましたが、カードが死んでしまいました。このロゴを見るまでは:
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を使用しましょう。