Tomcat サーバーの応答が遅い場合の解決策

Tomcat サーバーの応答が遅い場合の解決策

1. 分析的思考

1. 機械自身の理由を排除する

2. サーバーパフォーマンス分析

3. プロジェクト自体の分析(詳細ではない)

4. 仮想マシン分析

5. データベース分析

2. 詳細な分析方法

1. 機械自身の理由を排除する

ウェブマスター ツールを使用して、Web サイトの速度をテストできます。

2. サーバーパフォーマンス分析

top コマンドを使用して、サーバーのリソース使用状況を表示します。主に CPU とメモリの使用状況を分析します (top コマンドは Linux でよく使用されるパフォーマンス分析ツールで、システム内の各プロセスのリソース使用状況をリアルタイムで表示できます。プロセス リストはデフォルトで 5 秒ごとに更新されるため、Windows タスク マネージャーに似ています)。

3 行目は CPU 使用率を示しており、詳細な意味は次のとおりです。

us---ユーザー空間が占有する CPU の割合、sy---カーネル空間が占有する CPU の割合、ni---優先順位が変更されたプロセスが占有する CPU の割合、id---アイドル CPU の割合、wa---IO 待機が占有する CPU の割合、hi---ハード割り込み (ハードウェア IRQ) が占有する CPU の割合、si---ソフト割り込み (ソフトウェア割り込み) が占有する CPU の割合、st---スチール時間、ホスト上の他の仮想マシンで実行されているタスクに割り当てられた実際の CPU 時間 (通常は仮想マシン OS のみ)。

4行目は現在のメモリ状況を示しています。サーバーメモリの合計は8054352kで、2879468kが使用済み、5174884kが残り、265728kがバッファリングされています。

私の個人的な理解では、us パーセンテージが 50% 未満の場合は、サーバー構成の問題を考慮する必要はありません。サーバーの us パーセンテージが長期間にわたって 70% を超える場合は、サーバーのハードウェア構成を強化することを検討できます。また、サーバーのネットワーク状態も確認する必要があります。基本的には、大きなファイルをダウンロードすることでネットワーク状態を判断できます。

3. プロジェクト自体の分析

JDBC 接続プールを使用する場合は、接続プールの構成を分析する必要があります (スレッド プールの最大数、解放時間などを分析します)。

ここで、C3P0 を例に挙げると、私がかつて取り組んだプロジェクトの構成は次のようになります。

これはもともとローカルテスト用の設定計画に過ぎませんでした。不注意で、オンラインになった後に修正するのを忘れてしまいました。複数人がアクセスすると、待機接続タイムアウトが発生します。プロジェクトの実際の状況に応じて、適切な設定データを設定する必要があります。

応答が遅い原因は、無理なプロジェクト設計にある可能性もありますが、ここでは詳しく説明しません。

checkoutTimeout---接続プールが使い果たされると、クライアントは getConnection() を呼び出した後に新しい接続を待機します。タイムアウト後、SQLException がスローされます。0 に設定すると、無期限に待機します。単位はミリ秒です。デフォルト: 0
minPoolSize --- 接続プールに保持される接続の最小数。デフォルトは 3 です。
maxPoolSize---接続プールに保持される接続の最大数。デフォルト値: 15
maxIdleTime---最大アイドル時間。設定された時間内に接続が使用されない場合は、接続は破棄されます。 0 の場合は破棄されません。デフォルト値: 0
maxIdleTimeExcessConnections---デフォルト: 0 単位 この設定は、主に接続プールの負荷を軽減するために使用されます。たとえば、接続プール内の接続数は、データ アクセスのピークにより大量のデータ接続を作成する可能性がありますが、その後の期間に必要なデータベース接続の数は非常に少ないです。このとき、接続プールはそれほど多くの接続を維持する必要はありません。したがって、負荷を軽減するために、一部の接続を切断して破棄する必要があります。maxIdleTime 未満である必要があります。設定が 0 でない場合、接続プール内の接続数は minPoolSize に維持されます。 0 の場合、acquireIncrement は処理されません。これは、接続プールが使い果たされたときに c3p0 が一度に取得する接続の数です。デフォルト値: 3

4. 仮想マシン分析

top コマンドを使用して、仮想マシンのメモリ使用量を表示します。仮想マシンが占有するメモリの割合は大きくないにもかかわらず、明らかな上限があることがわかる場合があります。仮想マシンの構成を確認する必要があります。

解決策(Tomcat を例に挙げます):

具体的な値は実際の状況によって異なります。

5. データベース分析 (MySql)

データベースを分析する際には、考慮すべき点が数多くあります。私が遭遇した状況をいくつか挙げてみます。

a. 最大接続数

'%max_connections%' のような変数を表示します。最大接続数を表示します。'Threads%' のようなステータスを表示します。現在の接続使用状況を表示します。

Threads_connected --- 開いている接続の数

Threads_running---この値はアクティブな接続の数を示し、通常は接続値よりもはるかに低くなります。

最大接続数の値が小さすぎる場合は、実際の状況に応じて変更できます。通常は 1000 に変更できます。設定方法は 2 つあります。

1. 一時的な設定であり、サービスを再起動すると無効になります

2. データベース構成ファイルを変更する

/etc/my.cnf ファイルの [mysqld] の下に次の行を追加または削除します: max_connections = 1000

b. タイムアウト制御

MySQL には「wait_timeout」というプロパティがあり、デフォルト値は 28800 秒 (8 時間) です。wait_timeout の値は設定できますが、最大値は 2147483 までで、それより大きい値にはなりません。これは約 24.85 日であり、show global variables like 'wait_timeout'; コマンドを通じて確認できます。

wait_timeout の意味は、接続が 8 時間以上アイドル状態の場合、Mysql は自動的に接続を切断します。簡単に言えば、接続が 8 時間非アクティブの場合、自動的に切断されます。 dbcp は接続が有効かどうかをチェックしないため、データ操作を実行するために使用すると例外が発生します。

問題がタイムアウト制御によって発生した場合、wait_timeout 値を変更することは推奨されません。データベース接続 URL の後に「&autoReconnect=true&failOverReadOnly=false」を追加することで、問題を解決できます。

c. DNS逆引き解決

MySQL データベースは、ネットワーク接続を受信すると、まず相手の IP アドレスを取得し、次に IP アドレスに対して逆 DNS 解決を実行して、IP アドレスに対応するホスト名を取得します。ホスト名を使用して、権限システムで権限を決定します。逆 DNS 解決には時間がかかり、ユーザーにとっては遅いように見える場合があります。場合によっては、逆解析によって解決されたホスト名がこの IP アドレスを指しておらず、接続が成功しないことがあります。 構成ファイルで、my.cnf の [mysqld] セクションに次の行を追加することで、MySQL による逆 DNS 解決を無効にすることができます。

skip-name-resolve (Windows と Linux で同じ)

d. テーブルキャッシュ

'open%tables%' のようなグローバル ステータスを表示します。開いているテーブルの数を表示します。

open_tables: 現在キャッシュ内にある開いているテーブルの数です。

opened_tables: MySQL の起動後に開かれたテーブルの数です。

Opened_tables 値が非常に大きい場合、キャッシュが小さすぎるため、テーブルが頻繁に開かれることを意味します。現在の table_open_cache 設定を確認できます。

'table_open_cache'のような変数を表示し、キャッシュの上限を表示します。

table_open_cache の値を設定する方法は 2 つあります (サーバーのメモリが約 4G の場合は、2048 に設定することをお勧めします)。

1. 一時的な設定であり、サービスを再起動すると無効になります

グローバル table_open_cache=2048 を設定します。

2. データベース構成ファイルを変更する

/etc/my.cnf ファイルの [mysqld] の下に次の行を追加または削除します: table_open_cache = 2048

e. スロークエリログ

スロークエリログを記録する目的は、サーバーの応答が遅い原因が特定のステートメントの実行が遅いことにあるかどうかを確認することです。

遅いクエリについては詳しく説明しません。オンラインでたくさん見つけることができます。

しかし、結局のところ、実際のプロジェクト分析によると、これらに問題はありません。直接満杯になるのは MongoDb の CPU です。コメントアウトするだけです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル
  • Alibaba Cloud Server Tomcatにアクセスできません
  • IDEA 2020 で Tomcat サーバーを構成するための詳細な手順
  • Linux クラウド サーバーに JDK と Tomcat をインストールするための詳細な手順 (推奨)
  • Tomcat サーバー入門の超詳細なチュートリアル

<<:  一般的なSQL削除ステートメントの原則の違いを理解するだけです

>>:  JavaScript のシングルトン デザイン パターン

推薦する

antd+reactプロジェクトをviteに移行するためのソリューションの詳細な説明

Antd+react+webpackは、多くの場合、Reactテクノロジースタックに基づくフロントエ...

同じドメイン名を持つ Nginx プロキシのフロントエンドとバックエンドの分離プロジェクトの完全な手順

フロントエンド プロジェクトとバックエンド プロジェクトは分離されており、フロントエンドとバックエン...

「@INC で ExtUtils/MakeMaker.pm が見つかりません」というエラーを解決する

mha4mysql をインストールする場合の手順は、おおよそ次のようになります: unzip、per...

CSSプリコンパイル言語とその違いの詳細な説明

1. 何ですか マークアップ言語として、CSSは比較的シンプルな構文とユーザーに対する要件が低いが、...

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

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

MySQL 最適化戦略 (推奨)

要約すれば: 1. データベースの設計とテーブルの作成時にパフォーマンスを考慮する2. SQLの記述...

MySQL の完全バックアップ中に特定のライブラリを除外する方法

MySQLの完全バックアップを実行するときは、--all-databaseパラメータを使用します。例...

MySQL トリガーの追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL トリガーの追加、削除、変更、およびクエリ操作について説明しま...

CentOS に Docker をインストールし、Springboot で Docker をリモート公開する方法

目次1. CentOS7.0へのJDK1.8のインストール2. Dockerのインストール3.Doc...

VMware ESXi CLI の一般的なコマンドを調べる

目次【共通コマンド】 [一般的な esxi コマンドの概要] [esxcli コマンドの調査] ES...

jQueryは要素を追加した後に元のイベントが実行されない問題を解決します

まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...

MySQL インデックス使用状況監視スキル (収集する価値あり!)

概要リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値...

Reactコンポーネントをフルスクリーンにする方法

導入この記事は、 React + antdをベースにして、完全な全屏demoを紹介します。その理由は...

MySQL例外に対する一般的な解決策をいくつか分析する

目次序文1. コードによって設定されたデータベース名またはパスワードがローカルデータベースと一致して...