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 のシングルトン デザイン パターン

推薦する

Linuxはjoin -a1を使用して2つのファイルを結合します

次の2つのファイルを結合するには、それらを結合して1.txtに結合します。 # 1.txt ジェリー...

英語のシングルクォーテーション「''」を含むSQLの記述の失敗について徹底解説

問題が発生しました。情報の編集をテストする際、編集した内容に一重引用符 (') が含まれてい...

react+antd.3x は IP 入力ボックスを実装します

この記事では、IP入力ボックスを実装するための react+antd.3x の具体的なコードを参考ま...

MySQLは間違ったパスワードを入力する試行回数を制御します

1. 本番環境でMySQLのデッドロックを監視し、デッドロックの可能性を減らす方法まず、デッドロック...

Vue プロジェクトで Baidu Map API を使用する方法

目次1. Baidu Map Open Platformにアカウントを登録してログインする2. 必要...

Dockerでコンテナを作成するときにコンテナIPを指定する実装例

Docker はコンテナを作成するときに、デフォルトでブリッジ ネットワークを使用し、IP アドレス...

HTMLでアンカーの位置を設定するためのいくつかの一般的な方法

HTML でアンカーの位置を設定する方法はいくつかあるので、ここで紹介します。 1. ID ポジショ...

Vueプロジェクトでlessを使用するためのヒント

目次序文1. スタイルの浸透1. パターン浸透とは何ですか? 2. 使い方は? 2. ミキシング1....

Vue のループフォーム項目例の詳細な説明

場合によっては、ユーザーがボタンをクリックして同様のフォームを追加し、クリックごとに 1 回追加でき...

ZabbixはLinuxシステムサービスのプロセスを監視

Zabbix は Linux システムのサービス ユニットを監視するためのルールを自動的に検出します...

フィールドを結合するSQL関数

最近、関連テーブル内のすべてのフィールドをクエリし、それらを 1 つのフィールドに再グループ化する必...

適応幅(パーセンテージ)に応じて Div の高さを調整する純粋な CSS

今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...

HTML ページ スタイルの !-- -- の機能は何ですか?

主に低バージョンのブラウザ向け<!-- --> は HTML コメント タグです。上位バ...

Vue で ToDo アプリケーションを実装する例

背景まず最初に、私はフロントエンド開発の専門家ではないことを述べておきたいと思います。私の以前のコン...