問題
- スループットの問題が発生した場合、Liferay サポート サービスは通常、Liferay サーバーから Java スレッド ダンプを 1 ~ 2 秒間隔で取得するよう求めます。
- いくつかのスレッド ダンプを取得することで、Java スレッドがスタックしているか、完了するのに時間がかかりすぎているかを検出できます。
- これらのスレッド ダンプ ファイルを効率的な方法で 1 ~ 2 秒間隔で簡単に生成するにはどうすればよいですか?
Environment
- すべての Liferay バージョン
解決策
複数の Java スレッド ダンプを取得する最も簡単な方法は、定期的にダンプを生成するオペレーティング システム スクリプトを使用することです。
また、サーバー管理スクリプト タブから Groovy スクリプトを実行することもできます。
1. オペレーティング システム スクリプトの使用
この記事には、Linux/MacOS と Windows オペレーティング システムの両方に添付された 2 つのスクリプトが含まれています。 それらを使用して、スレッド ダンプを生成できます。
スレッド ダンプを生成する手順:
-
プロセス PID を取得します。 最初のステップは、アプリケーション サーバーの PID を取得することです。
- これは通常、 java
jps -l
コマンドライン ツールまたはオペレーティング システム コマンド (たとえばps
またはnetstat
) を使用して取得されます。 - 記事 JVM からスレッド ダンプを取得する は、アプリケーション サーバーの PID を取得する方法に関する詳細情報が含まれています。
- これは通常、 java
-
スクリプトを実行します。 PID を取得したら、オペレーティング システムに一致する添付のスクリプトを実行します。
- Linux/MacOS:
threaddumps.sh [pid]
=> ダウンロードはこちら threaddumps.sh スクリプト - Windows:
threaddumps.cmd [pid]
=> ここからダウンロード threaddumps.cmd スクリプト
- Linux/MacOS:
これらのスクリプトは、java jstack コマンドを使用して、2 秒間隔で 30 個のスレッド ダンプを生成します。
2. Groovy スクリプトの使用
この記事には、[サーバー管理] スクリプト タブから実行できる Groovy スクリプトが含まれています。
スレッド ダンプを生成する手順:
- コントロール パネル => サーバー管理 => スクリプト タブに移動します。
- threaddumps.groovy スクリプト をスクリプト タブにコピーします。
- フォルダー 変数を出力フォルダーで更新します。デフォルト値は tomcat temp フォルダーです。
- 実行すると、以下のメッセージが表示されます。
-
Generating threaddumps in a background thread Threaddumps will be generated in the folder: /liferay/tomcat-9.0.56/temp
-
3. 生成されたファイル
生成されたファイルの名前は次のとおりです: threaddump-<pid>-<time>-<number>.txt
例:
threaddump-23065-151811-1.txt
threaddump-23065-151813-2.txt
threaddump-23065-151816-3.txt
threaddump-23065-151818-4.txt
threaddump-23065-151820-5.txt
threaddump-23065-151823-6.txt
4. トラブルシューティング
オペレーティング システムのスクリプトに問題がある場合:
- PID のエラー:
999 そのようなプロセスはありません
または999 プロセスは実行されていません
- 原因: 間違った PID を指定しました。 解決策: 再確認して正しいものを指定する
- アクセス許可エラー:
9999: 操作は許可されていません
またはソケット ファイルを開けません: ターゲット プロセスが応答していないか、HotSpot VM がロードされていません
- 原因: アプリケーションサーバーを実行しているユーザーとは異なるユーザーでスクリプトを実行しました
- 解決策: Liferay を実行している同じユーザーでスクリプトを実行します
- または、root ユーザーでこれを実行します。
-
sudo -u [user] ./threaddumps.sh [pid]
-
- jstack の実行中にエラーが発生しました:
jstack: コマンドが見つかりません
または「jstack」は内部コマンドまたは外部コマンドとして認識されません
- 原因: 現在のユーザー PATH で jstack コマンドを使用できません
-
解決策: のことを行う必要があります。
- オプション 1: ユーザーの PATH 構成を変更します
- オプション 2: threaddumps.sh / threaddumps.cmd スクリプトを編集し、「jstack」をフル パスに置き換えます (例: /usr/lib/jvm/java-11-openjdk-amd64/bin/ jstack)
- オプション 3: Groovy スクリプトの代替手段を使用する
追加情報
- 単一のスレッド ダンプを取得する方法の詳細: JVM からスレッド ダンプを取得する
- 外部の Oracle ドキュメント:
会員限定記事
Liferay エンタープライズ サブスクリプションをお持ちのお客様は1500件を超えるベストプラクティス、トラブルシューティング、その他のソリューション記事を閲覧できます。ログインすると、記事全体をお読みいただけます。
ログイン