CPU は多くの場合、システム パフォーマンスのボトルネックになります。次のような原因が考えられます。
CPU使用率が高すぎると言う場合、比較のためのベンチマーク値を意味します。例えば、
JVM プロセスは複数の Java スレッドで構成されます。
最も重要なことは、どのスレッドが CPU を消費しているかを調べ、スレッド スタックを通じて問題のあるコードを見つけることです。個々のスレッドの CPU 使用率が特に高くない場合は、スレッド コンテキストの切り替えが CPU 使用率の高さの原因になっているかどうかを検討します。 場合プログラムは高いCPU使用率をシミュレートします - スレッドプールに4096個のスレッドを作成します Linux環境でプログラムを起動します。 java -Xss256k -jar デモ-0.0.1-SNAPSHOT.jar スレッド スタック サイズは 256 KB に指定されています。テスト プログラムの場合、4096 個のスレッドを作成する必要があるため、オペレーティング システムのデフォルト値 8192 KB は大きすぎます。 top コマンドを使用すると、Java プロセスが CPU の 961.6% を使用しており、プロセス ID が 55790 であることがわかります。 より洗練された top コマンドを使用して、この Java プロセス内の各スレッドの CPU 使用率を表示します。 #トップ -H -p 55790 「scheduling-1」というスレッドがCPUを大量に占有しており、42.5%に達していることがわかります。したがって、次のステップは、このスレッドが何をしているのかを調べることです。 スレッドが何をしているかを調べるには、jstack を使用してスレッド スナップショットを生成します。 jstack 55790 > 55790.log 55790.log を開き、手順 4 で見つかったscheduling-1という名前のスレッドを見つけます。そのスレッド スタックは次のとおりです。 AbstractExecutorService#submit の関数呼び出しを見ると、これは Spring Boot によって開始される定期的なタスク スレッドであり、スレッド プールにタスクを送信して CPU を大量に消費していることがわかります。 コンテキスト切り替えのオーバーヘッド?上記のプロセスを実行すると、CPU を大量に消費するスレッドや、デッド ループなどのバグ コードを見つけることができる場合が多くあります。しかし、このケースでは、Java プロセスが CPU の 961.6% を占有しているのに対し、「scheduling-1」スレッドは CPU の 42.5% しか占有していません。では、残りの CPU は誰が占有しているのでしょうか? ステップ 4 では、top -H -p pid コマンドで表示されるスレッド リストに「pool-1-thread-x」という名前のスレッドが多数あります。個々の CPU 使用率は高くありませんが、数は比較的多いようです。ご想像のとおり、これらはスレッド プール内で作業を実行するスレッドです。残りの CPU はこれらのスレッドによって消費されますか? また、主にこれらのスレッド プール内のスレッドが実際に動作しているのか、それとも「休止」しているのかを確認するために、jstack の出力結果を確認する必要もあります。 これらの「pool-1-thread-x」スレッドは基本的に WAITING 状態にあることがわかります。
「pool-1-thread-x」スレッドに戻ると、これらのスレッドは「待機中」状態です。スレッド スタックから、これらのスレッドが getTask メソッド呼び出しを「待機中」であることがわかります。スレッドはスレッド プールのキューからタスクを取得しようとしますが、キューが空であるため、LockSupport.park 呼び出しによって「待機中」状態になります。 「pool-1-thread-x」スレッドはいくつありますか?次のコマンドはスレッドの数をカウントするために使用され、結果は 4096 となり、これはスレッド プール内のスレッドの数とまったく同じです。 grep -o 'pool-2-thread' 55790.log | wc -l 残りの CPU を消費するのは誰ですか? vmstat コマンドを使用して、オペレーティング システム レベルでのスレッド コンテキスト切り替えアクティビティを表示してみましょう。 cs 列はスレッド コンテキスト スイッチの数を示し、in は CPU 割り込みの数を示します。これら 2 つの数値は非常に高いことがわかりました。これは基本的に、スレッド コンテキスト スイッチが大量の CPU を消費するという私たちの推測を裏付けています。 Spring Boot プログラムを停止し、vmstat コマンドを再度実行します。in と cs の両方が大幅に低下していることがわかります。これにより、スレッド コンテキスト切り替えのオーバーヘッドの原因となる Java プロセスが 55790 であることが確認できます。 要約するCPU 使用率が高すぎる場合は、まず原因となっているプロセスを特定します。次に、top -H -p pid コマンドを使用して特定のスレッドを特定します。 Tomcat プロセスが CPU を過剰に占有する問題を解決する方法についての記事はこれで終わりです。Tomcat プロセスが CPU を過剰に占有する問題の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: シンプルなウェブデザインコンセプトのカラーマッチング
>>: MySQL query_cache_type パラメータと使用方法の詳細
MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...
たとえば、現在のパスが /var/log で、/usr ディレクトリに移動する場合は、次のコマンドを...
目次1.entires() メソッドの詳細な構文2.entires() メソッドの一般的な使用法と注...
目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...
目次1. マスタースレーブレプリケーションマスタースレーブレプリケーション3スレッドマスタースレーブ...
目次1. ツールの紹介2. ワークフロー3. 操作インターフェースとパラメータ設定(1)監視と再起動...
Python 3.4でMySQLデータベースを使用する詳細なプロセスは次のとおりです。 Window...
目次1. toStringメソッドの3つの機能2. オブジェクトを表す文字列を返す3. カスタム t...
目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...
CSS3 の 3D 効果を使用して立方体を作成する方法を学ぶと、3D シーンの回転と変位のプロパティ...
1. setUp関数の最初のパラメータpropsセットアップ(プロパティ、コンテキスト){}最初のパ...
rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...
リストは、類似または関連する一連の項目をリストするために使用されます。順序なしリスト(箇条書きリスト...
Bashで配列を定義するbash スクリプトで新しい配列を作成する方法は 2 つあります。 1 つ目...
序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...