1.3. Java VMのスレッドダンプ取得

WebOTXが起動中にストール状態になる、または、コマンドからの応答がなく停止できない状態など、WebOTXが無応答状態に陥った場合には以下の手順でJava VMのスレッドダンプを取得します。
多くの場合、スレッドダンプの内容を解析することで、障害の原因を突き止めることができます。

スレッドダンプの取得方法には以下のようなものがあります。システムの動作環境や障害の状況に応じて適切な方法を選択してください。

以上の取得方法について説明します。

1.3.1. 統計レポート出力コマンドを利用した取得方法

以下の手順でスレッドダンプを採取します。
無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

  1. 次のコマンドを実行します。コンソール上にスレッドダンプが出力されます。
    otxadmin> generate-jvm-report --type thread <サーバ名>
    

<サーバ名>には、情報取得の対象となるサーバ(Javaプロセス)の名前を指定します。 サーバ名は次のようになります。

* ドメインのエージェントプロセス : server

* プロセスグループのアプリケーションプロセス : <アプリケーショングループ名>-<プロセスグループ名>

なお、<サーバ名>が省略された場合は "server" がデフォルトとして指定されます。

詳しい取得方法については、 [ ドメイン > Javaプロセスの監視・管理 > 統計レポート出力 ] の「スレッド情報の表示」を参照してください。

1.3.2. 診断サービスを利用した取得方法

以下の手順でスレッドダンプを採取します。

運用管理コマンド
  1. 次のコマンドにてスレッドダンプ取得のための属性値をtrueに設定します。

    ・ドメインのエージェントプロセスを対象とする場合

    otxadmin> set server.diagnostic-service.jvm-thread-dump=true
    

    ・プロセスグループのアプリケーションプロセスを対象とする場合

    otxadmin> set server.diagnostic-service.jvm-pg-stack=true
    
  2. 次のコマンドで診断サービスを実行します。

    ・ドメインのエージェントプロセスが起動している場合

    otxadmin> generate-diagnostic-report <対象ドメイン名>
    

    ・ドメインのエージェントプロセスが起動していない場合

    otxadmin> generate-diagnostic-report --local=true <対象ドメイン名>
    

    (注) 本方法では、プロセスグループのアプリケーションプロセスに対する採取はできません。

統合運用管理ツール
  1. 次のスレッドダンプ取得の設定項目にチェックを入れます。

    ・エージェントプロセスを対象とする場合

    <ドメイン名>」-「アプリケーションサーバ」-「診断サービス」
    「JVM」タブ内の「JVMスレッドダンプ」

    ・プロセスグループのアプリケーションプロセスを対象とする場合

    <ドメイン名>」-「アプリケーションサーバ」-「診断サービス」
    「JVM」タブ内の「プロセスグループのスタックトレース」

  2. 「診断サービス」を右クリックして表示される「ドメインの情報採取」を実行してください。

診断サービスを実行すると、テキストファイルにスレッドダンプが出力されます。

詳しい取得方法については、 [ 診断サービス > 診断サービスの実行 ] を参照してください。

1.3.3. スレッドダンプ採取オペレーションを利用した取得方法

1.3.3.1. ユーザドメインからオペレーションを実行

ユーザドメインに接続して、スレッドダンプ採取オペレーションを実行する方法です。

以下の手順でスレッドダンプを採取します。
無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

運用管理コマンド

次のコマンドを実行します。

・エージェントプロセスを対象とする場合

otxadmin> invoke domain.generateThreadDump

・プロセスグループのアプリケーションプロセスを対象とする場合

otxadmin> invoke tpsystem.applicationGroups.<アプリケーショングループ名>.processGroups.<プロセスグループ名>.stackTrace
または、従来より提供しているプロセスグループ向けの専用コマンド(wostack)を使用することでも採取できます。詳しくは、[ コマンド > TPシステム > wostack ] を参照してください。 統合運用管理ツール ・エージェントプロセスを対象とする場合

対象ドメインのオペレーションから「スレッドダンプの採取」を選択します。

運用管理ツールからのスレッドダンプ採取方法1

「実行」を押下します。

運用管理ツールからのスレッドダンプ採取方法2

スレッドダンプの出力先は以下の通りです。

Windows: ${INSTANCE_ROOT}\logs\diagnostics\jvminfo\threaddump.txt
UNIX:      ${INSTANCE_ROOT}/logs/server.log

・プロセスグループのアプリケーションプロセスを対象とする場合

対象ドメインの該当するプロセスグループのオペレーションから「スタックトレースの採取」を選択します。
スレッドダンプの出力先はアプリケーションログおよびシステムトレースです。

1.3.3.2. 管理ドメインからオペレーションを実行

ユーザドメインがストールに陥ってしまった等で運用管理ツールからユーザドメインに接続できない場合には、管理ドメインからユーザドメインのスレッドダンプを採取することができます。
なお、このオペレーションを実行するためには、管理ドメインが起動している必要があります。

(注) 本方法では、プロセスグループのアプリケーションプロセスに対する採取はできません。

以下の手順でスレッドダンプを採取します。
無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

運用管理コマンド

次のコマンドを実行します。

otxadmin> invoke --port <管理ドメインの管理ポート> domain.generateThreadDump <ドメイン名>
統合運用管理ツール

管理ドメインのオペレーションから「スレッドダンプの採取」を選択します。

運用管理ツールからのスレッドダンプ採取方法3

スレッドダンプを採取するドメイン名を選択し、「実行」を押下します。

運用管理ツールからのスレッドダンプ採取方法4

スレッドダンプの出力先は以下の通りです。

Windows: ${INSTANCE_ROOT}\logs\diagnostics\jvminfo\threaddump.txt
UNIX:      ${INSTANCE_ROOT}/logs/server.log

(注) 管理ドメインからスレッドダンプ採取オペレーションを実行した場合、${INSTANCE_ROOT}は採取対象ドメインのドメインルートディレクトリを表します。

1.3.4. 各OS固有の取得方法

UNIXとWindowsについて、それぞれのスレッドダンプ採取の手順を示します。

1.3.4.1. UNIXのスレッドダンプ

以下の手順でスレッドダンプを採取します。

取得方法
  1. ドメインのJava VMを特定します。

    psコマンドによりドメインのJava VMを特定します。

    ・ドメインのエージェントプロセスを対象とする場合

    psコマンドの結果では、他のjavaプロセスとの区別がつきにくいため、Java VMに指定された-Xオプションを手がかりにプロセスを特定します。

    ps -exf |grep java |grep <ドメイン名> |grep ' -X'
    

    ドメインのエージェントプロセスのJava VMにはデフォルトで以下のオプションが引数に指定されています。-Dwebotx.funcid=agent がエージェントプロセスを表します。

    -server -Dwebotx.funcid=agent -Ddomain.name=domain1 -Xms64m -Xmx512m -XX:NewRatio=2

    ・プロセスグループのアプリケーションプロセスを対象とする場合

    次のpsコマンドの結果を手がかりにプロセスを特定します。

    ps -exf |grep THTPPJAVA2 |grep <アプリケーショングループ名>-<プロセスグループ名>
    
  2. 特定したプロセス番号に対して kill -QUIT を実行します。

    無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

    kill -QUIT <プロセス番号>
    

ドメインのエージェントプロセスの場合、スレッドダンプは ${INSTANCE_ROOT}/logs/server.log に出力されます。 プロセスグループのアプリケーションプロセスの場合、アプリケーションログおよびシステムトレースに出力されます。

1.3.4.2. Windowsのスレッドダンプ

Windowsでは、jstack という JDK 付属のツールを利用します。また、WebOTX AS <バージョン番号> Agent Serviceサービスからドメインを起動している場合は、jstack ツールに加えてMicrosoft社が提供する純正のフリーツールである PsExec というツールを利用します。詳細は、[ jstackツール ] を参照してください。

1.3.5. JDK付属のツールを利用した取得方法

JDKに付属の監視ツールであるjstack、jvisualvmの各ツールを用いてスレッドダンプを取得する方法について説明します。

1.3.5.1. jstackツール
取得方法
  1. 取得対象のドメインが出力する次のファイルに記載されている、取得対象のJavaプロセスに対するプロセスIDを調べます。
  2. <ドメインディレクトリ>\config\appserv_pid

  3. jstackツールを、次のように実行します。
  4. Windows: <JDKインストールディレクトリ>\bin\jstack.exe <プロセスID> >> <任意ファイル名>
    UNIX:      <JDKインストールディレクトリ>/bin/jstack <プロセスID> >> <任意ファイル名>

    無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

WebOTX AS <バージョン番号> Agent Serviceサービスでドメインを起動している場合の取得方法 (Windowsのみ)

WebOTX AS <バージョン番号> Agent Serviceサービスからドメインを起動している場合は、jstack に加えてMicrosoft社が提供する純正のフリーツールである PsExec というツールを利用します。

(注)タスクスケジューラからWebOTXを起動する運用の場合、Windowsの仕様によりコンソールが表示されないことがあります。 その場合は、Windows標準の「AT」コマンド(「interactive」オプション指定が必要)での代用を検討してください。

事前作業

PsExec を予め次に示す URL のページよりダウンロードしておきます。

[URL] http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

  1. 上記サイトのページに表示される「Download PsTools」のリンクより、PSTools.zip ファイルをダウンロードします。
  2. スレッドダンプ取得対象のマシン上の任意のディレクトリに、ダウンロードしたPSTools.zip ファイルを展開します。
  3. コマンドプロンプトを開き、展開した PSTools.zip 中に含まれるPsExec.exe を実行します。

なお、最初の実行時には、ライセンスの確認のためのダイアログが表示されます。表示される内容を確認の上、承諾します。

取得方法

  1. 取得対象のドメインが出力する次のファイルに記載されている、取得対象のJavaプロセスに対するプロセスIDを調べます。
  2. <ドメインディレクトリ>\config\appserv_pid

  3. jstackツールを、PsExecツールを介して、次のように実行します。
  4. PsExec.exe -s <JDKインストールディレクトリ>\bin\jstack.exe <プロセスID> >> <任意ファイル名>
    

    無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

1.3.5.2. jvisualvmツール
取得方法
  1. jvisualvmツールを次のように起動します。
  2. Windows: <JDKインストールディレクトリ>\bin\jvisualvm.exe
    UNIX:      <JDKインストールディレクトリ>/bin/jvisualvm

  3. 「リモート」のツリーノードを選択後、「ファイル(F)」メニューを選択し、表示される操作一覧から「JMX接続を追加(J)」を選択します。
  4. 「接続(C)」項目に <ホスト名>:<管理ポート番号> の形式で値を入力します。
    また、ドメインのエージェントプロセスをスレッドダンプの取得対象とする場合、「セキュリティー保証書を使用(E)」にチェックを入れ、「ユーザー名(U)」には管理ユーザ名を、「パスワード(P)」に管理ユーザのパスワードを入力します。
    その後、「了解」ボタンを押下します。
  5. 「リモート」のツリーノード配下に表示された <ユーザ名>@<ホスト名>:<管理ポート番号> の名前を持つノードを選択し、右クリックするか、「アプリケーション(A)」メニューを選択し、表示される操作一覧から「スレッドダンプ(T)」を選択します。
  6. 無限ループによる障害を検出するために、数秒間隔で複数回実行するようにしてください。

  7. スレッドダンプ採取のタイミングで作成された "[threaddump]日時" の名前を持つツリーノードを選択後、右クリックするか、「アプリケーション(A)」メニューを選択し、表示される操作一覧から「別名保存(S)」を選択して任意のファイルに保存します。