スレッド ダンプの外部での生成
Confluence が応答を停止し、Confluence 内でスレッド ダンプを作成できない場合、アプリケーション外でスレッド ダンプを生成できます。外部スレッドは、ロックが保留になっている情報や、スレッドで待機中の情報が必要な場合にも便利です。
スレッドダンプを複数取得する
通常、約 10 秒間隔でダンプを取得します。その場合、複数のダンプや出力されたスタックトレースを以下のように1つのファイルに生成することができます。
On this page:
Performance Data Collector を使用したスレッド ダンプの生成
Linux でスレッド ダンプを生成する
Linux (または Solaris やその他の Unix) でスレッド ダンプを精製するには:
Confluence を実行している java プロセスを識別します。これは以下の様なコマンドで実現できます。
ps -ef | grep java.
上記からプロセス ID を使用してスレッド ダンプを生成します。
kill -3 <pid>
このコマンドではサーバーは終了しません (スペース間に入れずに "-3" オプションを使用している限り)。
ウィンドウでスレッド ダンプを生成する
コンソールからスレッド ダンプを生成する
サービスとして Confluence を実行していない場合は、コンソールで直接スレッド ダンプを作成することができます。
コンソール ウィンドウをクリックし、<CTRL>+BREAK (または一部のキーボードでは SHIFT+CTRL+PAUSE) を押します。スレッド ダンプは、直接コンソールに表示されます。
jstack を使用したスレッド ダンプの生成
JDK (Java 開発キット) には、スレッド ダンプを生成するために使用される jstack が含まれています。
注: Confluence インストーラーにバンドルされている JRE (Java Runtime Environment) には、jstack は含まれません。JDK 一式をインストールしておく必要があります。
jstack を使用してスレッド ダンプを生成するには:
- プロセスを特定します。
Ctrl + Shift + Esc
キーを押してタスク マネージャーを立ち上げ、Java (Confluence) プロセスの、プロセス ID を検索します (PID 列が表示されない場合は、タスク マネージャの列の見出しを右クリックして PID を選択します)。 jstack <pid> を実行して、 単一のスレッドダンプを取得します。このコマンドで、プロセス ID <pid> の1個のスレッドダンプが取得出来ます。この場合のプロセス ID は22668です。
adam@track:~$ jstack 22668 > threaddump.txt
このコマンドにより、現在のディレクトリに threaddump.txt というファイルが出力されます。
jstack のよくある問題
- jstack は Confluence を起動しているユーザーと同じユーザーで起動する必要があります。
- 実行が可能な jstack が $PATH にない場合、<JDK_HOME>/bin ディレクトリで探します。
java.lang.NoClassDefFoundError: sun/tools/jstack/JStack
が発生したら、JDK の lib ディレクトリ tools.jar があるかどうかを確認します。tools.jar がない場合、JDK のフル バージョンをダウンロードします。- 「このコマンドを実行するのに十分な記憶域がありません」というメッセージが表示された場合は、この記事を参照してください。
- エラー メッセージ "Not enough storage is available to process this command" が表示された場合、ここから "psexec" ユーティリティをダウンロードして、以下のコマンドを実行します。
psexec -s jstack <pid> >> threaddumps.txt
出力
スレッド ダンプは、アプリケーション ログ フォルダーの catalina.out ファイル内に表示されます。ログ ファイルで「thread dump」を検索して、ダンプの出発点を探します。
各ダンプに何が含まれているかを比較し、パフォーマンスの問題の原因となった可能性のある、長期間実行中のスレッドを探すことができるよう、サポートから、短期間、スレッド ダンプのシーケンスを生成するよう求められることがよくあります。
コマンドを繰り返し実行することで複数のスレッド ダンプを手動生成できますが、多くの場合、プロセスを自動化する小さなスクリプトを使用する方が簡単です。お使いの Linux サーバーで実行できるスクリプトの例をいかに示します。
for i in `seq 1 10` ; do
echo ${i}
your/path/to/jstack `ps aux | grep java | grep confluence | grep -v grep | awk '{print $2}'` >> threaddump.log
sleep 10
done