Linux および Windows で複数の Java スレッド ダンプを生成する方法

問題

  • スループットの問題が発生した場合、Liferay サポート サービスは通常、Liferay サーバーから Java スレッド ダンプを 1 ~ 2 秒間隔で取得するよう求めます。
  • いくつかのスレッド ダンプを取得することで、Java スレッドがスタックしているか、完了するのに時間がかかりすぎているかを検出できます。
  • これらのスレッド ダンプ ファイルを効率的な方法で 1 ~ 2 秒間隔で簡単に生成するにはどうすればよいですか?

Environment

  • すべての Liferay バージョン

解決策

複数の Java スレッド ダンプを取得する最も簡単な方法は、定期的にダンプを生成するオペレーティング システム スクリプトを使用することです。

また、サーバー管理スクリプト タブから Groovy スクリプトを実行することもできます。

1. オペレーティング システム スクリプトの使用

この記事には、Linux/MacOS と Windows オペレーティング システムの両方に添付された 2 つのスクリプトが含まれています。 それらを使用して、スレッド ダンプを生成できます。

スレッド ダンプを生成する手順:

  1. プロセス PID を取得します。 最初のステップは、アプリケーション サーバーの PID を取得することです。
    • これは通常、 java jps -l コマンドライン ツールまたはオペレーティング システム コマンド (たとえば ps または netstat) を使用して取得されます。
    • 記事 JVM からスレッド ダンプを取得する は、アプリケーション サーバーの PID を取得する方法に関する詳細情報が含まれています。
  2. スクリプトを実行します。 PID を取得したら、オペレーティング システムに一致する添付のスクリプトを実行します。

これらのスクリプトは、java jstack コマンドを使用して、2 秒間隔で 30 個のスレッド ダンプを生成します。

2. Groovy スクリプトの使用

この記事には、[サーバー管理] スクリプト タブから実行できる Groovy スクリプトが含まれています。

スレッド ダンプを生成する手順:

  1. コントロール パネル => サーバー管理 => スクリプト タブに移動します。
  2. threaddumps.groovy スクリプト をスクリプト タブにコピーします。
  3. フォルダー 変数を出力フォルダーで更新します。デフォルト値は tomcat temp フォルダーです。
  4. 実行すると、以下のメッセージが表示されます。
    • 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 スクリプトの代替手段を使用する

追加情報

この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています