Tomcatの起動が遅い問題を素早く解決、超簡単

Tomcatの起動が遅い問題を素早く解決、超簡単

今日、私はクラスメートが問題を解決するのを手伝いました - Tomcat の起動が非常に遅く、約 5 ~ 6 分でした。それが解決されると、起動にはわずか 3 秒しかかかりません。

問題を解決するにはどうすればいいでしょうか?

Tomcat の bin ディレクトリで catalina.sh を見つけて開き、次の場所にコード行を追加します。

-Djava.security.egd=ファイル:/dev/urandom

2019年2月12日追記:原理を知りたいという友人が多いので簡単に説明します。

Tomcat 7 および Tomcat 8 は、起動時に org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom を呼び出して、安全な乱数の文字列を生成します。

Linux (CentOS) 環境では、/dev/urandom と /dev/random の 2 つの特殊ファイルから乱数を生成できます。

乱数を生成する原理は、現在のシステムのエントロピー プールを使用して固定数のランダム ビットを計算し、これらのビットをバイト ストリームとして返すことです。エントロピー プールは、現在のシステムの環境ノイズです。エントロピーは、システム内のカオスの度合いを表します。システム ノイズは、メモリ使用量、ファイル使用量、さまざまな種類のプロセスの数など、多くのパラメータによって評価できます。

/dev/random は、新しい乱数を生成できない場合にプログラムをブロックし、エントロピー プールに従って新しいランダム バイトが生成されるまで戻りません。一方、/dev/urandom はブロックしません (ublock)。もちろん、生成される乱数の品質はあまり高くありません。

したがって、Tomcat に /dev/random ではなく /dev/urandom を使用して乱数を生成するように強制すると、速度が数分から数秒に大幅に向上します。

追加情報: Tomcat の起動が非常に遅く、ログにエラーが記録されていない場合の解決策

1. 問題

かつて Alibaba Cloud にプロジェクトをデプロイしたとき、プロジェクトに問題はありませんでした。しかし、Tomcat を起動すると、応答して Tomcat の起動プロセスが完了するまでに半日かかりました。

Tomcat の起動が非常に遅く、ログにエラーはありません。ログには次の情報が記録されています。

Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 - クラスパスリソース [resources/jdbc.properties] からプロパティファイルをロードしています

Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 - クラスパスリソース [resources/common.properties] からプロパティファイルをロードしています

2015 年 10 月 29 日 15:52:53.587 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom sessionIdGeneratorBase.createSecureRandom の SecureRandom インスタンスの作成

2. 理由

Tomcat 7/8 はどちらも、org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom クラスを使用して、セッション ID としてセキュア ランダム クラス SecureRandom のインスタンスを生成します。これには 342 秒、つまり約 6 分かかります。 SHA1PRNG アルゴリズムは、強力な機密性を備えた SHA-1 アルゴリズムに基づく疑似乱数ジェネレータです。 SHA1PRNG には、設定に応じてさまざまな操作を実行するシード ジェネレーターがあります。

1) java.security.egd プロパティまたは securerandom.source プロパティで "file:/dev/random" または "file:/dev/urandom" が指定されている場合、JVM はネイティブ シード ジェネレータ NativeSeedGenerator を使用します。これは、初期化のために super() メソッド、つまり SeedGenerator.URLSeedGenerator(/dev/random) メソッドを呼び出します。

2) java.security.egd プロパティまたは securerandom.source プロパティが別の既存の URL を指定する場合、初期化のために SeedGenerator.URLSeedGenerator(url) メソッドが呼び出されます。

このため、値を「file:///dev/urandom」または「file:/./dev/random」に設定すると機能します。

この実装では、ジェネレーターはエントロピー プール内のノイズの量を評価します。乱数はエントロピー プールから生成されます。読み取られると、/dev/random デバイスはエントロピー プール内のノイズからランダムなバイトを返すだけです。 /dev/random は、1 回限りの支払いやキー生成など、非常に高品質のランダム性を必要とするシナリオに適しています。

エントロピー プールが空の場合、エントロピー プールが十分な周囲のノイズ データを収集するまで、/dev/random からの読み取り操作はブロックされます。この目的は、暗号的に安全な疑似乱数ジェネレーターを実現することであり、エントロピー プールの出力は可能な限り大きくする必要があります。これは、高品質の暗号化キーを生成する場合や、長期的な保護が必要なシナリオの場合に重要です。

3. 解決策

解決策は2つあります。

1) TOMCAT環境で解決

JRE を構成することで、非ブロッキング エントロピー ソースを使用できます。

catalina.sh に次の行を追加します。

-Djava.security.egd=ファイル:/dev/./urandom

それでおしまい。

これを追加した後、Tomcat を起動すると、全体の起動時間が 2912 ミリ秒でサーバーが起動するまでに短縮されました。

2) JVM環境で解決する

ファイル $JAVA_PATH/jre/lib/security/java.security を開きます。

vi コマンドで検索できます:

?セキュアランダムソース

次のコンテンツを見つけます。

securerandom.source=ファイル:/dev/random

次に、次のように置き換えます。

securerandom.source=ファイル:/dev/./urandom

上記の記事は、Tomcat の起動が遅い問題を素早く解決する方法について説明しています。これは非常にシンプルで、編集者が皆さんと共有した内容はこれだけです。皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Spring Boot 組み込み Tomcat が起動しない問題を解決する
  • Tomcatはメソッドタイミングタスク(Spring)操作の実行を開始し完了します。
  • Idea で Tomcat のソースコードデバッグを開始し、デバッグのために Tomcat に入る方法
  • LinuxシステムにTomcatをインストールし、サービスの起動とシャットダウンを構成する
  • Idea は、Web プロジェクトを開始するように Tomcat を設定します。グラフィック チュートリアル

<<:  JavaScript メッセージ ボックスの例

>>:  SQL の左結合と右結合の原理と例の分析

推薦する

MySQLの起動と接続方法の例分析

目次mysqldの起動方法方法 1: mysqld方法 2: mysqld_safe方法3: mys...

MySQL ビューの原則と使用例の概要

この記事では、MySQL ビューの原理と使用法についてまとめます。ご参考までに、詳細は以下の通りです...

Alibaba Cloud Server に MySQL データベースをインストールする詳細なチュートリアル

目次序文1. MySQLをアンインストールする2. MySQLをインストールする要約する序文学習中に...

MySQL公式パフォーマンステストツールmysqlslapの使い方の紹介

目次導入説明書実際の経験まとめ導入MySQL は最も人気のあるオープンソース データベースとして、さ...

Windows に MySQL 8.0.16 をインストールする手順とエラーの解決方法

1. はじめに: mysql8以降は、これまでよく使われていたバージョンと比べてかなり変更点が大きい...

Web面接でよくある質問:リフローとリペイントの原理と違い

目次ブラウザのレンダリングメカニズムリフローと再塗装リフロー逆流を引き起こす行為:再描画再描画を引き...

ウェブフロントエンドウェブ開発の一般的なプロセスの簡単な紹介

フロントエンド開発を行っている初心者の学生を多く見かけますが、彼らの効率は比較的遅いです。常にコード...

モバイル端末の水平および垂直画面ビューポート検出を決定するための js のいくつかの方法

目次1. 異なるビューポートを取得する方法2. 水平画面と垂直画面のJavaScript検出3. 水...

HTMLはマーキーを使用してテキストを左右にスクロールします

コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...

重複したMySQLテーブルをマージして削除する簡単な方法

シナリオ:クロールされたデータは、別のメインテーブルと同じ構造を持つデータテーブルを生成するため、マ...

Tomcat 7.0 で仮想ディレクトリを設定し、仮想パスを構成する方法

Tomcat7.0は仮想ディレクトリを設定します(1)現在、当社のウェブサイトはデフォルトのディレク...

MySQL データベースの制約とデータ テーブルの設計原則

目次1. データベースの制約1.1 はじめに1.2 制約の種類1.3 ヌルでない1.4 ユニーク1....

Vueモバイル端末の適応化問題の詳細説明

1. vue uiでプロジェクトを作成する 2. 基本設定項目を選択する 3. プロジェクトを実行す...