JVMからのスレッドダンプの取得
スレッドダンプは、Java Virtual Machine (JVM)で現在アクティブなすべてのJava スレッドのリストです。 ここでは、Adobe Experience Manager内のJVMからスレッドダンプを取得する複数の方法について説明します。
説明 description
環境
Adobe Experience Manager
問題/症状
Linux、UNIX、またはWindows上のJVMからスレッドダンプを取得するにはどうすればよいですか?
スレッドダンプは、Java Virtual Machine (JVM)で現在アクティブなすべてのJava スレッドのリストです。
JVMからスレッドダンプを取得する方法はいくつかあります。 1つ以上のスレッドダンプを使用することを強くお勧めします。 適切な方法は、一定の間隔で10個のスレッドダンプを取得することです(例えば、10秒ごとに1個のスレッドダンプ)。
解決策 resolution
手順1:Java プロセスのPIDを取得する
スレッドダンプを取得するために必要な最初の情報は、Java プロセスのPIDです。
Java JDKには、すべてのJava プロセス IDを一覧表示するjps コマンドが付属しています。 次のようにコマンドを実行できます。
jps -l 70660 sun.tools.jps.Jps 70305
注: LinuxおよびUNIXでは、このコマンドをsudo -u user jps -lとして実行する必要がある場合があります。ここで、「user」とは、Java プロセスが実行されているユーザーのユーザー名です。
これで問題が解決しない場合、またはJava プロセスが見つからない場合(パスが設定されていない、JDKがインストールされていない、または古いJava バージョン)、を使用します
- UNIX、Linux、およびMac OS X:
ps -el | grep java - Windows: Ctrl + Shift + Esc キーを押してタスクマネージャーを開き、Java プロセスのPIDを見つけます
ステップ 2: JVMからスレッドダンプをリクエストする
jstack
インストールまたは使用可能な場合は、jstack ツールを使用することをお勧めします。 コマンドラインコンソールにスレッドダンプを出力します。
jstackを使用してスレッドダンプを取得するには、次のコマンドを実行します。jstack -l <pid>
コンソール出力のリダイレクト/追加ディレクティブを使用して、連続したスレッドダンプをファイルに出力できます。jstack -l <pid> >> threaddumps.log
注意:
-
jstack ツールはJDK 1.5以降で使用できます(Windows上のJVMの場合は、JDK 1.5およびJDK 1.6の一部のバージョンでのみ使用できます)。
-
-Xrsjvm パラメーターが有効になっている場合でも、jstackは機能します -
JDK 1.6のjstack ツールを使用して、JDK 1.5で実行されているプロセスからスレッドダンプを取得することはできません。
-
LinuxおよびUNIXでは、Java プロセスを所有するユーザーとしてコマンドを実行する必要があります。
sudo -u java-user jstack -l <pid>(
<java-user>は、Java プロセスが実行中のユーザーのIDに置き換える必要があります) -
Windowsでjstackを実行し、「このコマンドを処理するのに十分なストレージがありません」というエラーが発生した場合は、Windows SYSTEM ユーザーまたはJava プロセスを所有するユーザーとしてjstackを実行する必要があります。 psexecを使用すると、この操作を実行できます。psexecをダウンロードするには、こちらをダウンロードしてください。 システムユーザーとしてjstackを実行するには、次のようなコマンドを使用します。
psexec -s jstack <pid> >> threaddumps.logpsexecをサーバーにインストールできない場合は、コマンドを含む.bat ファイルを作成し、(別のユーザーとして) 🔗Windows タスク スケジューラーを使用して実行できます。
-
Java プロセスが応答しない場合は、オプション -J-d64 (64 ビットシステム上)を使用すると、次のような場合に役立つ場合があります。
jstack -J-d64 -l <pid> >> threaddumps.log -
jstack コマンド (
jstack -l <pid> >> threaddumps.log)が以下のエラー[1]をスローした場合は、Java プロセスを所有するユーザーとしてコマンドを実行します。 次に例を示します。sudo -u sling jstack -l <pid> >> threaddumps.log
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted
...
sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)
JSTACK スクリプト
これは、 スクリプト (eclipse.orgのスクリプトから適応)で、jstackを使用して一連のスレッドダンプを受け取ります。 また、top コマンドを使用してスレッドレベルのcpuの使用状況も取得します。
次のように実行します。
sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>
例:sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3
- 1234はJava プロセスのpidです
- cq5serveruserは、Java プロセスが実行されるLinuxまたはUNIX ユーザーです
- 10は、取るべきスレッドダンプの数です
- 3は、各ダンプ間の遅延です
注意:最上位の出力はネイティブスレッド IDを10進数形式で使用し、jstack出力はnidを16進数で使用します。 スレッド IDを16進数に変換することで、上位の出力からjstack出力に高いcpu スレッドを一致させることができます。
上記のスクリプトに加えて、同様のWindows Powershell スクリプトと、Adobe AEM固有のスクリプトもgithubに含まれています。
スレッドダンプを取得する代替方法
jstack ツールが利用できない場合は、次のようにスレッドダンプを取得できます。
メモ:一部のツールでは、コマンドラインパラメーター-Xrsが有効になっている場合、JVMからスレッドダンプを取得できません。 スレッドダンプの取得に問題がある場合は、このオプションが有効になっているかどうかを確認してください。
UNIX、Mac OS X、およびLinux (JDK 1.4以前)
UNIX、Mac OS X、およびLinuxでは、QUIT シグナルをJava プロセスに送り、スレッドダンプを標準出力に出力するように指示できます。
-
次のコマンドを実行します。
kill -QUIT <pid>このコマンドを
sudo -u user kill -QUIT <pid>として実行する必要がある場合があります。ここで、「user」は、Java プロセスが実行されているユーザーです。 -
crx-quickstart/server/startスクリプトを使用してCQSEを開始する場合、スレッドダンプはcrx-quickstart/server/logs/startup.logに出力されます。 JBoss、WebSphere、Tomcatなどのサードパーティ製アプリケーションサーバーを使用している場合は、サーバーのドキュメントを参照して、標準出力が送信されるファイルを確認してください。
Windows:
JDK 1.X
- javadump.exeをダウンロードします(以下に添付)。
- 次の3つの引数を使用してJVMを起動します(これらは正しい順序である必要があります)。
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log - Ctrl + Shift + Esc キーを押して、タスクマネージャーを開きます。
- Java プロセスのPIDを検索します。
- コマンドラインから、次を実行します:
javadump.exe <pid> - スレッドダンプは、手順2で説明した
jvmoutput.logファイルに表示されます。
JDK 1.6
プラグイン [ 0]を使用して、jconsole ツールからスレッドダンプを取得します
スレッドダンプをリクエストする方法は次のとおりです。
- Communiqueを実行するjvmに次のパラメーターを追加します。
Dcom.sun.management.jmxremote - JDK 1.6をダウンロードしてインストールします(まだ実行していない場合)。
- スレッドダンプアナライザーユーティリティ をダウンロードして抽出します。
[1] - JDK 1.6の
jconsole.exeを実行:jconsole.exe -pluginpath /path/to/file/tda.jar - 「 スレッドダンプ 」タブをクリックします。
- 「 スレッドダンプをリクエスト 」リンクをクリックします。
メモ: AEM 6.xを実行中で、実行中のスレッドを監視する場合は、http://<host>:<port>/system/console/status-Threadsにスレッドリストの取得を依頼できます。 ただし、これらのスレッドダンプは、samuraiやtdaなどのスレッドダンプ分析ツールでは機能しません。
適用先:
JVMで動作しているすべてのAdobe製品
スレッドダンプ分析ツール
Microsoft ドキュメントのSysinternalsの[ 0] PsExec v2.42。
[ 1] TDA - スレッド ダンプ アナライザー (irockel/tda、Github.com)
FastThreadの[ 2] Java スレッドダンプアナライザー。
[ 3] IBM スレッドおよびモニターダンプ アナライザー for Java on IBM サポートアシスタントドキュメント。