Java

Java – スレッドダンプの取り方 その4 / WebLogic Server とスレッドダンプ

その1 / スレッドダンプの取り方
その2 / Linux だと java プロセスがいっぱい!?
その3 / Windows サービスとして登録している場合は?
→その4 / WebLogic Server とスレッドダンプ
スレッドダンプの読み方 その1 – VM 内部スレッドと main スレッド

WebLogic Server を Windows サービスで使う場合のスレッドダンプの取り方について説明します。
WebLogic Server はその実績、パフォーマンス、堅牢性から基幹系のシステムで使われることが多いです。
Windows プラットフォームで運用する場合は Windows サービスとして起動するのが基本と言って良いでしょう。

・WebLogic Server と Windows サービス
まずおさらいとして、WebLogic Server の Windows サービスへの登録の仕方を説明します。

Windows サービスとして登録するにはドメインディレクトリ直下に配置されている installService.cmd を使います。
ただし、デフォルトのままでは標準/標準エラー出力はファイルにリダイレクトされません。
このままでは万が一サーブレットや EJB がスタックしたとき等、スレッドダンプが確認できず困ったことになってしまいます。
installService.cmd は内部的に beasvc.exe を呼び出しているのですが、-log:[ファイル名] オプションで標準/標準エラー出力の書き出し先を指定できます

直接 installService.cmd を編集してしっかり書き出されるようにしておきましょう。

rem *** Install the service
“%WL_HOME%\server\bin\beasvc” -install -log:C:\stdout.txt
-svcname:”beasvc %DOMAIN_NAME%_%SERVER_NAME%”
-javahome:”%JAVA_HOME%” -execdir:”%USERDOMAIN_HOME%”
-extrapath:”%EXTRAPATH%” -password:”%WLS_PW%”
-cmdline:%CMDLINE%

ちなみに -log オプションは古い beasvc.exe では利用できません。確実を期すためにも beasvc.exe は最新版を使いましょう。
beasvc.exe は WebLogic Server のバージョン/サービスパックと関係なく最新版を組み合わせて使えます。
現在最新の WLS8.1SP6、WLS9.2 に付属のバージョンを使えば安心でしょう。

installService.cmd を変更したらサービスのインストールは簡単。
> installService.cmd [管理ユーザ] [管理ユーザパスワード]
でOk。

C:\bea81sp6\user_projects\domains\mydomain>installService.cmd weblogic weblogic
<省略>
C:\bea81sp6\user_projects\domains\mydomain>”C:\bea81sp6\WEBLOG~1
\server\bin\beasvc” -install -log:C:\stdout.txt -svcname:”beasvc
mydomain_myserver” -javahome:”C:\bea81sp6\jdk142_11″ -execdir:”C:
\bea81sp6\user_projects\domains\mydomain” -extrapath:”C:\bea81sp6
\WEBLOG~1\server\bin;C:\bea81sp6\jdk142_11\jre\bin;C:\bea81sp6
\jdk142_11\bin;C:\bea81sp6\WEBLOG~1\server\bin\oci920_8″ –
password:”weblogic” -cmdline:”-client -Xms32m -Xmx200m –
XX:MaxPermSize=128m -classpath \”C:\bea81sp6\jdk142_11\lib
\tools.jar;C:\bea81sp6\WEBLOG~1\server\lib\weblogic_sp.jar;C:\bea81sp6
\WEBLOG~1\server\lib\weblogic.jar;\” -Dweblogic.Name=myserver –
Dweblogic.management.username=weblogic
-Dweblogic.ProductionModeEnabled= -Djava.security.policy=\”C:\bea81sp6
\WEBLOG~1\server\lib\weblogic.policy\” weblogic.Server” beasvc
mydomain_myserver installed.

登録したら net start|stop “サービス名” で起動/停止。もちろんサービスコントロールパネルからも操作できます。

C:\bea81sp6\weblogic81\server\bin>net start “beasvc mydomain_myserver”
beasvc mydomain_myserver サービスを開始します.
beasvc mydomain_myserver

C:\bea81sp6\weblogic81\server\bin>net stop “beasvc mydomain_myserver”
beasvc mydomain_myserver サービスを停止中です.
beasvc mydomain_myserver サービスは正常に停止されました。

・WebLogic Server as Windows サービス とスレッドダンプ
WebLogic といえど中身はいわゆる Java アプリケーションなので、スレッドダンプの取り方 その3 / Windows サービスとして登録している場合は?で紹介した SendSignalStackTrace は同様に使えます。

問題なのは WebLogic が使われるような基幹中の基幹システムでは「どこの馬の骨が作ったか分からないフリーウェアは使えない!」と天の声が聞こえてくる場合があることです。

WebLogic Server はそんな場合でもちゃんとスレッドダンプがとれる方法が用意されています。
状況に合わせて方法は2つあります。

– beasvc.exe を使う方法
beasvc.exe は %WL_HOME%\server\bin に配置されている Windows サービス関連の作業を担当するプログラムですが、自身にスレッドダンプをキックする機能が備わっています。
使い方は簡単で、
%WL_HOME%\bin\beasvc -dump -svcname:[サービス名]
とするだけです。
サービス名では伝統的なデフォルト設定では “beasvc [ドメイン名]_[サーバ名]” となっているので、何も考えずにドメインを作っていれば
%WL_HOME%\bin\beasvc -dump -svcname:”beasvc mydomain_myservice”
でOk。サービス名にスペースが入っているのでダブルクオーテーションで囲むことだけ気をつけましょう。

– weblogic.Admin を使う方法
weblogic.Admin はコマンドラインベースの管理ツールで、WebLogic Server の管理コンソールに替わってあらゆる管理操作を行うことができます。
そのうちの一つとしてスレッドダンプをキックするコマンドもあります。
使い方は簡単でサーバが動作してる URL、管理ユーザID/パスワードとコマンド名 – この場合は THREAD_DUMP – を指定するだけです。

> setEnv.cmd
> weblogic.Admin -url t3://localhost:7001 -username
weblogic -password weblogic THREAD_DUMP

ただし、weblogic.Admin コマンドは通常の http や t3 のリクエストと同じように WebLogic 内部の処理を通って実行されます。
よってネットワークレベルの問題があったり、WebLogic Server 自身に何か問題があってフリーズしてしまっているような場合には効かない場合があることに注意してください。
リモートからスレッドダンプをキックできるという点では便利ですが、通常は SendSignal や beasvc.exe を使うのが無難です。

スレッドダンプの取り方だけで4回に渡ってしまうほど記事が膨らんでしまいました。さて、いよいよ次回はスレッドダンプの読み方編に入ります。