Comments
Description
Transcript
問題判別 WASV6 Workshop による基幹システム設計
WASV6による基幹システム設計Workshop 問題判別 Agent WebSphere Application Server問題判別 Edge Component問題判別 Rational Developer問題判別 WAS (WebSphere Application Server) 問題判別の基本手順 問題発生 • プロセスの生存確認 • 各コンポーネントの応答調査 • ログメッセージの確認 等 問題の種類 / 発生箇所の特定 対応 ・パッチの適用 ・設定の変更 ・アプリの修正 … 問題原因の究明 採集資料(ログやトレース)の分析 既知の問題 再現手順の調査 さらなる資料の採集・分析 質問・採集した資料の送付 サポートセンターに連絡 既知情報の 収集 情報の保存 修正の適用の必要性 WASの瑕疵が原因のトラブルでは, 最終的な解決方法は「Fixの適用」となるケースが大部分 「運用による」回避は非現実的な場合が多い WASのFixについて,必ずしも単独のFixが提供されるとは限らない 「Fix Packの一部として提供」となるケースや, 「最新のFix Pack+単独Fixとして提供」となるケースも多い 特定のRefresh Pack/Fix Packレベルでの運用の継続は難しい 重要なシステムについては, サーバー構築時にFix適用の計画についても策定しておくことが望ましい 全体のサービスを継続したままFix適用ができるトポロジー テスト環境 + 本番環境 Fix適用時に実施するテストの自動化の検討 参考:WAS 6.0で提供される修正について Refresh Pack New Function追加や対応プラットフォーム追加など V.R.M.Fのバージョン表記のMが増加する WAS 5.0/5.1の「Fix Pack」に相当 Fix Pack Defect対応の修正のみが含まれる V.R.M.Fのバージョン表記のFが増加する Fが奇数のものはOpen系用,偶数のものはzOS用 WindowsやLinux系などでは6.0.2.1の次は6.0.2.3 WAS 5.0/5.1の「Cumulative Fix」に相当 WASのログ Node単位のログ IBM保守ログ(activity.log) JVMログに詳細な情報を追加したログ。 ログ・アナライザーを用いて読み取る。 プロセス単位のログ JVMログ (SystemOut.log / SystemErr.log) ネイティブ・コードやJVM自身の出力が書き込む情報の出力先 JVMのverboseGC出力はnative_stderr.logに記録される。 FFDCログ (<process_name>_<timestamps>.log) JavaのSystem.outおよびSystem.errへの出力を独立したログファイルに転送したもの WAS自身のメッセージの対部分が記録される,ログ解析の基本 循環ログの指定により,時間・サイズによる世代管理が可能 プロセスログ (native_stdout.log / native_stderr.log) WAS 5.0/5.1から ログの種類・内容は 変更なし First Failure Data Captureとはエラー情報を発生時に自動記録する機能。 サポートセンター、開発部門が障害対応時に見るログ。 ユーザーによる構成はできない。 HTTPトランスポートログ (http_access.log / http_error.log) ASのWebコンテナのHTTPトランスポートに対するアクセスを記録するログ。 管理ポートに対しても記録が可能。 デフォルトでは取得されない。 HTTPトランスポート・ログの有効化 ログの格納ディレクトリ WAS 5.0/5.1から 一部のログファイルが プロファイルディレクトリの下に移動 導入ディレクトリの/logs •インストール・Fix適用のログ • プロファイル管理コマンドのログ プロファイルディレクトリの/logs •activity.log 等 logsの下の/ffdc •FFDCログ logsの下のサーバー名ディレクトリ •JVMログ •プロセスログ •HTTPトランスポートログ 等 ログの考慮点 JVMログのログ回転 足りない! デフォルトがサイズ1M × 1世代バックアップ サイズで回転 ディスク容量の見積もりが事前に可能 出力量が多すぎる場合には,必要なログが残らないことも 要件に 応じて判断 時間で回転 少なくとも10M × 10世代バックアップを バックアップの世代数は20が最大 一定時間のログが確実に残る ログディレクトリのディスク使用量の事前の見積もりが難しい 「startServer.sh <server名> -script」で作成したスクリプトで WASを起動した場合はプロセスログが残らない 生成されたスクリプトを手動で修正して 「Launch Command」の行の最後にリダイレクトを追加する必要がある “ >> $LOGDIR/native_stdout.log 2>> $LOGDIR/native_stderr.log “のような内容を追加 サーバーの「Java仮想マシン」の構成を変更した場合には スクリプトの再作製と再編集が必要 Verbose GC (冗長ガーベッジコレクション) 全てのテスト環境・本番環境で 有効に設定することを推奨 サーバーのヘルスチェックに有用な情報を取得できる Verbose GCの出力が,解析に必須の問題がある ログの出力量や出力負荷も常時有効で問題ない 「サーバー名」→「プロセス定義」→「Java仮想マシン」で 「冗長ガーベッジ・コレクション」で有効にする プロセスログにGCの情報を記録 Allocation Failure(ヒープ割り当て失敗)の情報 GCの開始時刻,実行内容,メモリ開放結果,経過時間 ヒープ,内部バッファのサイズ調整 出力例 <AF[9]: <AF[9]: Allocation Allocation Failure. Failure. need need 528 528 bytes, bytes, 969 969 ms ms since since last last AF> AF> <AF[9]: managing allocation failure, action=2 (0/52427264)> <AF[9]: managing allocation failure, action=2 (0/52427264)> <GC(9): <GC(9): GC GC cycle cycle started started Tue Tue Nov Nov 22 22 16:53:08 16:53:08 2005 2005 <GC(9): freed 11104048 bytes, 21% free <GC(9): freed 11104048 bytes, 21% free (11104048/52427264), (11104048/52427264), in in 166 166 ms> ms> <GC(9): mark: 150 ms, sweep: 16 ms, compact: 0 ms> <GC(9): mark: 150 ms, sweep: 16 ms, compact: 0 ms> <GC(9): <GC(9): refs: refs: soft soft 00 (age (age >= >= 32), 32), weak weak 0, 0, final final 62, 62, phantom phantom 0> 0> <AF[9]: managing allocation failure, action=3 (11104048/52427264)> <AF[9]: managing allocation failure, action=3 (11104048/52427264)> <GC(9): <GC(9): need need to to expand expand mark mark bits bits for for 61602304-byte 61602304-byte heap> heap> <GC(9): expanded mark bits by 143360 to <GC(9): expanded mark bits by 143360 to 962560 962560 bytes> bytes> <GC(9): <GC(9): need need to to expand expand alloc alloc bits bits for for 61602304-byte 61602304-byte heap> heap> <GC(9): expanded alloc bits by 143360 to <GC(9): expanded alloc bits by 143360 to 962560 962560 bytes> bytes> <GC(9): <GC(9): need need to to expand expand FR FR bits bits for for 61602304-byte 61602304-byte heap> heap> <GC(9): expanded FR bits by 286720 to <GC(9): expanded FR bits by 286720 to 1925120 1925120 bytes> bytes> <GC(9): <GC(9): expanded expanded heap heap by by 9175040 9175040 to to 61602304 61602304 bytes, bytes, 32% 32% free> free> <AF[9]: completed in 201 ms> <AF[9]: completed in 201 ms> <GC[9]: <GC[9]: Expanded Expanded System System Heap Heap by by 65536 65536 bytes bytes GC Collector IBM JDKのverbose:gcをグラフ化するGUIベースの問題判別ツール alphaWorksからダウンロード可能 http://www.alphaworks.ibm.com/tech/gcdiag 以下のような情報をグラフ化可能 GCの所要時間 GCの間隔 フェーズ別時間 (mark/sweep/Compaction) JavaHeapの推移状況 AllocationFailureのサイズ ログ詳細レベルの変更(旧トレース仕様の指定) トレース仕様の指定方法・ログレベルの指定がWAS 5.0/5.1から変更に 例: com.ibm.ws.webcontiner.*=EntryExit=enabled V6では,12段階のトレース仕様のレベルから選択。トレースとログレベルを同時に指定可能。 例: com.ibm.ws.webcontiner.*=finer V5までは,Event/EntryExit/Debugごとに有効無効を指定。またトレースとログレベルの指定は別。 fatalからdetailまではメッセージ出力の制御のために使用 offに指定するとJVMログにはWASのメッセージが一切でなくなる! offからdetailまでの指定によりログに出力されるメッセージのレベルを制御できる fine/finer/finestがログ出力のために使用 fine以上のトレース仕様に指定されたコンポーネントがあるときにのみトレースの出力が行われる トレース仕様 off fatal severe warning audit info config detail fine finer finest all 日本語 オフ 致命的 重大 警告 監査 情報 構成 詳細 - 低 詳細 - 中 詳細 - 高 詳細 - 最高 すべて WAS V5までのレベル off fatal error warning audit info Event Event + EntryExit Event + EntryExit + Debug all ログ・フォーマット 基本フォーマット(デフォルト) [05/11/23 [05/11/23 18:36:13:266 18:36:13:266 JST] JST] 0000000a 0000000a AdminInitiali AdminInitiali AA タイムスタンプ スレッドID コンポーネント短縮名 ログ・メッセージタイプ F E W A I C D O R Z - ADMN0015I: ADMN0015I: 管理サービスが初期設定されます。 管理サービスが初期設定されます。 fatalメッセージ errorメッセージ warningメッセージ auditメッセージ infoメッセージ configメッセージ configメッセージ detailメッセージ detailメッセージ アプリケーションのSystem.outへの出力 アプリケーションのSystem.errへの出力 タイプ不明 タイプ不明 メッセージID メッセージ・テキスト トレース・タイプ > < 1 2 3 Z - methodの開始 methodの終了 fine/eventトレース fine finerトレース finerトレース finest/debug/dumpトレース finest タイプ不明 タイプ不明 トレース・テキスト HTTPサーバーおよびWAS Plug-inのログ HTTP Serverのログ(Apache/IBM HTTP Serverの場合) アクセスログ エラーログ LogFormat/CustomLogディレクティブによって詳細を指定可能 commonより情報の多いcombinedログ・フォーマットの指定を 経過時間なども追加で記録するようにすると問題発生時の解析の助けに ErrorLogディレクティブで場所を,LogLevelディレクティブ記録レベルを指定 WAS Plug-inのログ http_plugin.log plugin-cfg.xmlのLog要素で詳細を指定可能 Name属性でファイル名,LogLevel属性で記録レベルを指定 Plug-in内の動作が記録される HTTPサーバーからアプリケーションサーバーの呼び出しに失敗する場合に 最初に確認するログファイル LogLevel属性をTraceに指定することでPlug-in・WAS間の通信の詳細を取得可能 要求メトリックを使用するとPlug-inのログにサーブレット呼び出しの統計情報を載せることが可能 要求メトリックの出力例 [Fri [Fri Aug Aug 12 12 00:57:18 00:57:18 2005] 2005] 000012a0 000012a0 00000a28 00000a28 -- PLUGIN: PLUGIN: parent:ver=1,ip=10.7.71.52,time=1123773747200, parent:ver=1,ip=10.7.71.52,time=1123773747200, pid=4768,reqid=0,event=1 current:ver=1,ip=10.7.71.52,time=1123773747200,pid=4768,reqid=0,event=1 pid=4768,reqid=0,event=1 - current:ver=1,ip=10.7.71.52,time=1123773747200,pid=4768,reqid=0,event=1 type=HTTP type=HTTP detail=/servlet/perfservlet detail=/servlet/perfservlet elapsed=4318 elapsed=4318 bytesIn=0 bytesIn=0 bytesOut=1238 bytesOut=1238 パフォーマンスのモニタ PMI(Performance Monitoring Infrastructure) WASのパフォーマンス情報を取得するためのInfrastructure WAS V6.0からデフォルトで有効に Tivoli Performance Viewer(V6.0から管理コンソールに統合)が利用 要求メトリック リクエストが処理される各段階での応答時間を計測 SystemOut.logやhttp_plugin.logなどに記録させることが可能 標準技術であるApplication Response Measurement(ARM) APIでも取得可能 TPV TPV PMI Webサーバー ブラウザー Webコンテナ AS PMI要求メトリック PMI要求メトリック EJBコンテナ AS ARM ARM DB Tivoli Performance Viewer WAS V6.0より管理コンソールに統合 管理者が直にモニターする必要があるため 運用時の監視ツールとしては不適切 要求メトリックの使用方法 管理コンソールから指定 「要求メトリックを使用可能にする」をチェック 「要求メトリックのあて先」の 「使用可能にする」にチェック 計測が開始される アプリケーションサーバーではSystemOut.log HTTP Serverではhttp_plugin.logに記録される 全てのリクエストについて取得すると, 膨大な出力がたまるので注意 フィルターで適宜制限を行う 送信元 IP アドレス,リクエストURIで フィルター可能 要求メトリックのSystemOut.logへの出力例 [05/11/24 [05/11/24 7:15:48:094 7:15:48:094 JST] JST] 00000030 00000030 PmiRmArmWrapp PmiRmArmWrapp II PMRM0003I: PMRM0003I: parent:ver=1,i parent:ver=1,i p=10.7.17.104,time=1132784056891,pid=1436,reqid=1,event=1 current:ver=1,ip=10. p=10.7.17.104,time=1132784056891,pid=1436,reqid=1,event=1 - current:ver=1,ip=10. 7.17.104,time=1132784056891,pid=1436,reqid=1,event=1 7.17.104,time=1132784056891,pid=1436,reqid=1,event=1 type=URI type=URI detail=/ibm/consol detail=/ibm/consol e/secure/logon.do e/secure/logon.do elapsed=3953 elapsed=3953 JavaDump (Javacore) IBM JVMで出力される問題判別ためのファイル 記録されている内容 環境変数IBM_JAVACOREDIRで指定されたディレクトリ サーバーのカレントディレクトリ(デフォルトではインストールディレクトリ) /tmpディレクトリ(UNIX/Linux),%TEMP%ディレクトリ(Windows) JVMが異常終了したとき JVMがQUITシグナルを受け取ったとき ヒープエリアが使い尽くされたとき com.ibm.jvm.Dump.JavaDump()が実行されたとき 無効化する方法 等 出力されるトリガー 出力された瞬間のJVM内部に関する各種情報 OSの情報,Javaアプリケーションの環境情報, スレッドのJava stack/Native stack,モニターロック,メモリ 出力される場所(上のものほど優先) テキスト形式のファイルなのでエディタなどで直接参照可能 javacoreで始まるファイル名で出力(時刻やプロセスIDの情報がファイル名に付加される) 環境変数IBM_JAVACOREDIRに値を設定(すべての場合で無効化) 環境変数IBM_JAVADUMP_OUTOFMEMORYにFALSEを設定(ヒープ枯渇時) 環境変数JAVA_DUMP_OPTSでさらに詳細な制御が可能(詳しくは下記文書) 詳細な解説は以下の文書を参照 IBM developer kits: Diagnosis documentation http://www.ibm.com/developerworks/java/jdk/diagnosis/ JavaDumpの取得方法 サーバーハングや 極端なスローダウンの際には 強制取得した JavaDumpが解析に有効 UNIX/Linux系のOSでは, Javaのプロセスに QUITシグナルを送る kill –QUIT <PID> Windowsでは,左のような スクリプトを用意して, wsadminコマンドで取得する プロファイルのbinの下の wsadminコマンドを使用する ## getThreadDump.jacl getThreadDump.jacl ## ## Author: Author: Bill Bill Wigger Wigger ## ## Usage: Usage: wsadmin wsadmin -f-f getThreadDump.jacl getThreadDump.jacl <server <server name> name> ## Where: Where: ## server server name name -- application application server server name name ## ifif {[llength {[llength $argv] $argv] << 1}1} {{ puts "" puts "" puts puts "Usage: "Usage: wsadmin wsadmin -f-f getThreadDump.jacl getThreadDump.jacl <server <server name>" name>" puts puts "" server server name: name: the the server server where where the the listener listener ports ports will will bebe added" added" exit exit }} ## Passed Passed inin variables variables set [lindex set serverName serverName [lindex $argv $argv 0]0] set set oStringQuery oStringQuery "*:type=JVM,process=" "*:type=JVM,process=" append append oStringQuery oStringQuery $serverName $serverName append append oStringQuery oStringQuery ",*" ",*" set set oStringObjectName oStringObjectName [[ $AdminControl $AdminControl completeObjectName completeObjectName $oStringQuery $oStringQuery ]] set oDumpThreads [ $AdminControl invoke $oStringObjectName set oDumpThreads [ $AdminControl invoke $oStringObjectName dumpThreads dumpThreads ]] puts puts "Results "Results ofof dumpThreads dumpThreads forfor server: server: $serverName" $serverName" puts puts "" $oDumpThreads" $oDumpThreads" JavaDumpの例:異常終了 アプリケーションサーバーのJVMが異常終了した場合には,OS の生 成するcoreやダンプと並んでJavacoreが基本的な資料になる 基本的にはIBMサポート部門に送付して解析を依頼することになるが, 内容を確認することにより,障害の原因となっているコンポーネントを 推定することが可能なこともある JIT Compilerコンポーネントによる異常終了の例 0SECTION XHPI 0SECTION XHPI subcomponent subcomponent dump dump routine routine NULL ============================== NULL ============================== 1XHTIME Fri 1XHTIME Fri Jul Jul 16 16 09:28:32 09:28:32 2005 2005 1XHSIGRECV SIGSEGV received at 0xd3364a58 1XHSIGRECV SIGSEGV received at 0xd3364a58 in in /usr/WebSphere/AppServer/java/jre/bin/libjitc jitc.a. Processing jitc /usr/WebSphere/AppServer/java/jre/bin/libjitc jitc.a. Processing terminated. terminated. jitc (中略) (中略) 1XHCURRENTTHD 1XHCURRENTTHD Current Current Thread Thread Details Details NULL ---------------------NULL ---------------------2XHCURRSYSTHD "Servlet.Engine.Transports 2XHCURRSYSTHD "Servlet.Engine.Transports :: 4" 4" sys_thread_t:0x55A49DF0 sys_thread_t:0x55A49DF0 3XHNATIVESTACK Native 3XHNATIVESTACK Native Stack Stack NULL -----------NULL -----------3XHSTACKLINE at 3XHSTACKLINE at 0xD33FD110 0xD33FD110 in in rnn rnn 3XHSTACKLINE at 3XHSTACKLINE at 0xD3364A58 0xD3364A58 in in quadruple_optimization quadruple_optimization 3XHSTACKLINE at 0xD3259374 in JITGenNativeCode JIT 3XHSTACKLINE at 0xD3259374 in JITGenNativeCode JIT 3XHSTACKLINE at jit_compile 3XHSTACKLINE at 0xD327F774 0xD327F774 in in jit_compile_a_method_locked jit_compile_a_method_locked jit_compile 3XHSTACKLINE at jit_compiler 3XHSTACKLINE at 0xD3280D24 0xD3280D24 in in jit_compiler_entry jit_compiler_entry jit_compiler 3XHSTACKLINE at 0xD3281284 in _jit jit_fast_compile jit 3XHSTACKLINE at 0xD3281284 in _jit jit_fast_compile jit JIT Compilerの処理中にSIGSEGVが発生している → JITの無効化により,一時的な回避が可能かもしれない JavaDumpの例:サーバーハング サーブレットの実行スレッドがどのような状態で停止しているかによりハングの原 因が判断できる可能性が高い DBへのSQL実行の応答待ちで止まっている モニターのデッドロックが発生している 無限ループに陥っている 等 モニターのデッドロックはJavaDump出力ルーチンによって検出され記録される デッドロックが検出された場合の例 1LKDEADLOCK Deadlock 1LKDEADLOCK Deadlock detected detected !!! !!! NULL --------------------NULL --------------------NULL NULL 2LKDEADLOCKTHR 2LKDEADLOCKTHR Thread Thread "Thread-16" "Thread-16" (0x5A378898) (0x5A378898) 3LKDEADLOCKWTR is waiting 3LKDEADLOCKWTR is waiting for: for: 4LKDEADLOCKMON sys_mon_t:0x5A378BB8 4LKDEADLOCKMON sys_mon_t:0x5A378BB8 infl_mon_t: infl_mon_t: 0x00000000: 0x00000000: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@2CCA71E8/2CCA71F0: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@2CCA71E8/2CCA71F0: 3LKDEADLOCKOWN which 3LKDEADLOCKOWN which is is owned owned by: by: 2LKDEADLOCKTHR Thread "Servlet.Engine.Transports 2LKDEADLOCKTHR Thread "Servlet.Engine.Transports :: 9" 9" (0x5A360920) (0x5A360920) 3LKDEADLOCKWTR which is waiting for: 3LKDEADLOCKWTR which is waiting for: 4LKDEADLOCKMON sys_mon_t:0x5A3A6FB8 4LKDEADLOCKMON sys_mon_t:0x5A3A6FB8 infl_mon_t: infl_mon_t: 0x00000000: 0x00000000: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@2CD073C8/2CD073D0: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@2CD073C8/2CD073D0: 3LKDEADLOCKOWN which 3LKDEADLOCKOWN which is is owned owned by: by: 2LKDEADLOCKTHR Thread "Servlet.Engine.Transports 2LKDEADLOCKTHR Thread "Servlet.Engine.Transports :: 19" 19" (0x5A362630) (0x5A362630) 3LKDEADLOCKWTR which is waiting for: 3LKDEADLOCKWTR which is waiting for: 4LKDEADLOCKMON sys_mon_t:0x5A3A70D0 4LKDEADLOCKMON sys_mon_t:0x5A3A70D0 infl_mon_t: infl_mon_t: 0x00000000: 0x00000000: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@3084D560/3084D568: 4LKDEADLOCKOBJ com.decp.cmct.core.CmctSession@3084D560/3084D568: 3LKDEADLOCKOWN which 3LKDEADLOCKOWN which is is owned owned by: by: HeapDump Javaヒープ中にある全てのオブジェクトに関する情報をダンプしたもの OutOfMemoryErrorの問題判別における強力な解析資料 OutOfMemoryErrorが発生した場合に自動的に出力される オブジェクトのアドレス・サイズ・種類・参照関係など 出力ディレクトリはJavaDumpと同じディレクトリ heapdumpで始まるファイル名(時刻やプロセスIDの情報がファイル名に付 加される) ヒープサイズが大きい場合には巨大なダンプが生成されることも phd形式でファイルサイズが100Mを超える場合もある (テキスト形式だと1Gに達することもある) Disk I/Oのオーバーヘッドもあり,出力にある程度の時間がかかる OutOfMemoryError発生時に,問題判別の資料収集よりJVM再起動を優先させる場合には, HeapDumpの出力を無効化しておく必要がある。 Dumpを解析する環境にも,かなりのH/W資源が要求される 無効化する方法 環境変数IBM_HEAPDUMP_OUTOFMEMORYにFALSEを設定する 逆にIBM_HEAPDUMPにTRUEを指定するとQUITシグナルでもHeapDumpが 出力されるようになる HeapDumpの形式 HeapDumpのフォーマットが, JDK 1.4.2 SR1以降では バイナリ形式(Portable Heap Dump Format)に変更に JDK 1.4.2以前 テキスト形式 JDK 1.4.2 SR1 (WAS 6.0 GAレベル) phd v4 format JDK 1.4.2 SR2以降 (WAS 6.0.2以降) phd v5 format v4フォーマットには,情報が正しく出力されない問題が報告されているので HeapDumpを使用した問題判別を行う場合にはSR2以上にあげておく 従来のテキストファイル方式に比べ,多くの利点 サイズの減少(1/8程度) 出力時間の短縮 追加情報の記録 compactionで移動した全てのオブジェクトのトラッキング情報 全てのglobal reference情報 等 従来のテキスト形式で出力するには,環境変数を指定する IBM_JAVA_HEAPDUMP_TEXT=true テキスト形式で出力される IBM_JAVA_HEAPDUMP_TEST=true テキスト形式とphd形式の両方で出力される HeapDumpの分析ツール HeapRoots Jheap memdumpdiag heapanalyzer 使い方 難しい 簡単 簡単 簡単 PAテクニカルサポート経由入手可 テクニカルサポート経由入手可 入手方法 Webから Webから Webから から入手可 Webから入手可 から入手可 PAテクニカルサポート Webから入手可 から入手可 Web から入手可 (有効な 有効なサポート契約 サポート契約が 契約が必要) 必要) 自動解析 無し 有り(既存APAR リークオブジェクト指摘 無し 既存APARを APARを指摘) 指摘) リークオブジェクト指摘 heapdump,HPROF Dump,SVC dump 解析対象 heapdump heapdump heapdump heapdump比較 無し 無し 有り 無し heapdump比較 連続領域判定 有り 有り 無し 有り プラットフォーム Java2環境 C(AIX/Windows/Linux版提供 Java2環境 環境( Java2環境 C(AIX/Windows/Linux版提供) 版提供) Java2 環境(現在Win/Linux 現在Win/Linux版 Win/Linux版のみ) のみ) Java2環境 Java2環境 GUI 無し 無し 有り 有り 推奨K 推奨Kクラスタ 無し 有り 無し 無し サイズの サイズの指摘 PHD対応 PHD対応 未(206からの 206からの予定 済み 済み 済み(1.3.4以降 1.3.4以降) からの予定) 予定) 以降) HeapRoots Heap Dumpの調査で使う最も強力なツール 以下のURLから誰でもダウンロード可能(要登録) http://www.alphaworks.ibm.com/tech/heaproots CUIベースのツールで,各種コマンドを駆使して解析。使用方法は難解。 豊富な機能 最大連続空きサイズの確認 個数や合計サイズが大きいオブジェクトの検索 リークオブジェクトの参照元を推定 オブジェクトから参照されているオブジェクトのツリーを生成 Javaヒープの連続空き領域をサイズ順にリストしフラグメンテーションを確認 実際のリーク箇所の特定 オブジェクトの被参照経路を追跡 Enter: Enter: o{a,s,t,d,m,n}, o{a,s,t,d,m,n}, g{c,s}, g{c,s}, t{c,s,n}, t{c,s,n}, i, i, p, p, d{t,d,m} d{t,d,m} or or help help for for more more info info >> tc tc Enter Enter name name to to filter filter on on or or '-' '-' for for no no filtering filtering [-] [-] >>[[ Enter Enter ]] Enter Enter range range of of lines lines to to print print in in format format 'M','L-U','-U' 'M','L-U','-U' or or 'L-' 'L-' [1-25] [1-25] >>[[ Enter Enter ]] Constructing Constructing types types table table ... ... ...................................................................... ...................................................................... done. done. Organising Organising types types data data (8214 (8214 types) types) ... ... ...................................................................... ...................................................................... done. done. Sorting Sorting by by count count ... ... .. done. done. Tabulating all objects, sorted by count Tabulating all objects, sorted by count Count Total-size Count Total-size Type Type Name Name ------------------------------------------------------------------------------------------------------------------------------------------------------------1,480,244 1,480,244 47,367,808 47,367,808 java/lang/String java/lang/String 1,479,953 1,479,953 422,453,776 422,453,776 primitive primitive array array 250,157 250,157 8,005,024 8,005,024 java/util/Hashtable$Entry java/util/Hashtable$Entry 128,441 128,441 5,137,640 5,137,640 jp/co/mycompany/blue/javakit/frame/GVariant jp/co/mycompany/blue/javakit/frame/GVariant 63,001 3,528,056 63,001 3,528,056 com/ibm/ejs/cm/proxy/PreparedStatementProxy com/ibm/ejs/cm/proxy/PreparedStatementProxy 62,945 3,021,360 62,945 3,021,360 com/ibm/ejs/cm/proxy/ResultSetProxy com/ibm/ejs/cm/proxy/ResultSetProxy Jheap 入手方法 PAサポートセンターから入手(IBMサポート契約のお持ちのお客様のみ) ユーザーの操作はほとんど不要で,基本的に全自動で解析を行う #./jheap heapdumpFile > jheap.out (Linux/AIXの例) さまざまな自動分析 フラグメンテーション事前調査 クラスごとの参照先・参照元クラスによる参照内訳表示(各パス共通) クラスごとの統計情報表示(各パス共通) 配列やストリングやハッシュなどの圧縮整理(パス2),全圧縮可能オブジェクトの大規模な圧縮整理(パス3選択) 木構造に変換後累積オブジェクトサイズ表示(パス3選択) アンファイナライズド・オブジェクトの表示(累積選択時),アンリーチャブル・オブジェクトの表示(累積選択時) 既存APARや不審パターンとの照合も行う 分析結果のダイジェストをコンソールに表示 *** *** CHECK CHECK *** *** initial initial class class cluster cluster too too small small (Java2 (Java2 defect defect 67018) 67018) please specify -Xk8576 or more under latest service refresh please specify -Xk8576 or more under latest service refresh *** *** ERROR ERROR *** *** probable probable XALAN XALAN XMLReaderManager XMLReaderManager leak leak (APAR (APAR PQ95238) PQ95238) objcount objbytes (exclusive noaccess leafobj) objcount objbytes (exclusive noaccess leafobj) refs-out refs-out refs-in refs-in sorted sorted by by objbytes objbytes (out (out of of 266119680) 266119680) 2170 954328832358.6% ( 2170 0 0) 46718 2170 | org/apache/xalan/templates/ElemForEach 2170 954328832358.6% ( 2170 0 0) 46718 2170 | org/apache/xalan/templates/ElemForEach || 403 403 00 0) 5056 403 403 216919448 216919448 81.5% 81.5% (( 403 0) 5056 403 || org/apache/xml/dtm/ref/sax2dtm/SAX2DTM org/apache/xml/dtm/ref/sax2dtm/SAX2DTM || 112 209386000 78.7% ( 112 0 0) 555 112 | org/apache/xerces/parsers/SAXParser 112 209386000 78.7% ( 112 0 0) 555 112 | org/apache/xerces/parsers/SAXParser || HeapDump中に問題があれば*** CHECK ***,または*** ERROR *** で始まる行でAPARの指摘や ユーザへのサジェスチョンが出る MemDumpDiag GUIベースの視覚的なHeap調査用ツール 以下のURLからダウンロード可能(要登録) http://www.ibm.com/developerworks/websphere/downloads/memory_dump.html HeapDumpだけでなく,Sun JDKの出力するHPROF Dumpなども解析可能 メモリーリークをおこしたオブジェクトの自動推測機能 複数回取得したHeapDumpを比較し,差分を検出することが可能 HeapAnalyzer GUIベースのHeapDump用調査ツール 以下のURLからダウンロード可能(要登録) http://www.alphaworks.ibm.com/tech/heapanalyzer さまざまな分析機能 サイズ別・出現数別 objects/classes/arrays のリスト Childサイズ・オブジェクト数別objects/classes/arrays のリスト アルファベット順 objects/classes/arrays のリスト サイズ別、利用可能heapスペースのリスト 利用可能heapスペースのチャート HeapDumpのツリービュー Heapリークの可能性のあるエリアの特定 Edge Component Load Balancerのログ Load Balancerのログは循環ログ サイズがオーバーしたら古いログから上書き ログ・サイズは変更可能 ログの種類 server.log manager.log SNMP subagentに関する情報 hamon.log 使用するadvisorに関する情報 subagent.log managerの活動記録等 使用advisor名_ポート.log dsserverの活動の記録、発行したコマンド等の情報 high availabilityに関する情報(Primary, Backupの両方) reach.log reach advisorがとばしたping情報等 dsserver/cbrserverが起動しない ポートの競合が発生しているケースが多い dsserverが使用するポート ポート 設定ファイル 変数名 用途 10099 dsserver LB_RMIPORT dsserverとdscontrolコマンドの通信 10199 dsserver LB_RMISERVERPORT dsserver自身の使用するポート 10004 metricserver LB_RMIPORT メトリック・サーバーとの通信 競合するアプリケーションの停止を行う 各設定ファイルの変数値を変更することでも対応可能 AIXやLinux、Solarisの場合 :/usr/binディレクトリに存在 Windowsの場合 :C:¥WINDOWS¥system32に存在 「エラー: サーバーが応答していません。」 dsserverとdscontrolコマンドの通信ができていない場合に表 示されるメッセージです dsserverプロセスは起動していますか? Javaプロセスが起動しているか確認してください。 Dispatcherの場合 ps –ef | grep java | grep SRV_KNDConfigServer dscontrolコマンドの通信に使われるカギが壊れていませんか? 「lbkeys create force」コマンドで鍵を生成し直してみてください 生成された鍵は/opt/ibm/edge/lb/admin/keysディレクトリにあります それでも直らない場合は、鍵ファイル名に付加されるIPアドレスをご確認下さい 例)dispatcher-<NFAアドレス>-10099.key、cbr-<NFAアドレス>-11099.key IPアドレスがNFAアドレスではない場合は、/etc/hostsファイルなどの設定を確認して 下さい Manager Report dscontrol manager report コマンド managerが持っている情報を表示する 問題判別では 問題判別では、 では、このPORT このPORT値 PORT値をまず確 をまず確かめます PORT値 PORT値は,advisorを使用してサーバの状態を監視した時の、割り振り先サーバに対するリク エストのレスポンス時間に依存した値を表しております。レスポンス レスポンスがない レスポンスがない場合 がない場合は 場合は、PORT値 PORT値 は-1となります。 となります manager report 表示例 ------------------------------------------------------------------| 9.170.19.100 | WEIGHT | ACTV | NEWC | PORT | SYS | | PORT: 80 |NOW NEW| 49% | 50% | 1% | 0% | ------------------------------------------------------------------| 9.170.19.10 | 9 9 | 13 | 1 | 32 | 0 | | 9.170.19.20 | 0 0 | 0 | 0 | -1 | 0 | ------------------------------------------------------------------- <参考> 参考> WEIGHT 更新 WEIGHT 更新 2秒 ACTV, NEWC 更新 WEIGHT 更新 WEIGHT 更新 2秒 2秒 ACTV, NEWC 更新 Manager Reportが全サーバー「-1」を返す クラスター・アドレスはDispatcherに設定しましたか [MAC]割振り先サーバー側の設定は行いましたか [Windows/AIX] [Linux] TCP/IPフィルタリングを設定していませんか? Broadcom社製Ethernet Adapterを使用している場合、 Ethernet@Wirespeed機能 を無効にする必要があります Task/ChecksumのOffload機能を使用していませんか? Advisorのリクエストは正しく届いていますか? 割振り先サーバーでiptablesの設定をして下さい [Windows] NICの設定を確認してください 割振り先サーバーのループバック・アダプターにクラスター・アドレスを設定して下さい。 割振り先サーバーのアクセスログを確認してください [拡張HTTPアドバイザー]監視リクエスト・監視文字列は正し く設定されていますか? dscontrol server status :: で確認 割振りが行われない① Dispatcherにパケットは届いていますか 誰がクラスター・アドレスに応答しているか確認する 同じネットワークのマシンからPingを発行し、ARPテーブルを確認 割振り先サーバー側の仮想ホストの設定は正しいですか 割振り先サーバー側で仮想ホストを設定したり、ListenするIPアドレ スを限定する場合、Dispatcherのパケットがどのように変換されてい るか考える必要があります。 [MAC]仮想ホストはクラスター・アドレスで設定 goActive / goStandbyスクリプトを確認してください。 ネットワークインターフェースに正しく登録されていますか [AIX] netstat –in [Windows] ipconfig /all [Linux] ifconfig -an 割振りが行われない② ネットワーク・トレースでどこまでパケットが届いているか 確認してください。 以下の2箇所にネットワーク・トレースを仕掛ける Dispatcherマシン 割振り先サーバー Dispatcher IHS どこでパケットが行方不明になっているのか切り分けて下さい 1. 2. 3. 4. 5. クラスター・アドレス宛にパケットが届いているか? 割振り先サーバーにパケットは送っているか? IHSにパケットは届いているか? IHSからレスポンスは正しく返っているか? Dispatcherからパケットは正しく返っているか? HA構成の問題 Takeoverが正常に完了しない goActive/goStandbyが正しく設定されているかご確認下さい 障害時にdsserverのjavaプロセスは存在しましたか? [Unix] 各スクリプトに実行権限があることを確認してください goActive/goStandby各スクリプトの呼出しはjavaプロセスによって行われるため、プロセスもダ ウンしていた場合はTakeoverが発生しません 意図しないTakeoverが発生する Dispatcherマシン上でNTPが動いていませんか? NTP(Network Time Protocol)により時間の調整が行われると、予期せぬTakeoverの原因となることがありま す。 『Network Time Protocol support with WebSphere Edge Components』 http://www.ibm.com/support/docview.wss?uid= swg21178386 NTPを停止しても問題が解消しない場合 Heartbeatを行っているポートのネットワークトレースを採取します 正しくHeartbeatが行われているか確認してください Heartbeatは0.5秒間隔で送られているGREというパケットです Heartbeat間隔を広げ、 Heartbeatの断絶の可能性を減らします 広げすぎると障害発生時の検知が遅くなりますので注意が必要です dscontrol executor set hatimeout <断絶を許容する秒数(デフォルト2)> よくある問題 セッションが維持できない IPStickyを使用している場合 携帯電話や一部プロバイダーからのリクエストはラウンド・ロビン・プロキシーを通 過するため、WASでセッションを維持する必要があります。 割振りが偏る [IPSticky]Load Balancerの前段にProxyServerが存在する場合など、 特定のIPからしかリクエストが来ない場合には、IPStickyは使用でき ません。 接続数が異常に多い 通常時と比べ、異常 な数ではないか? Manager Reportで表示される接続数が異常な値を示す 特定の時間のみ、突然に接続 数が急増したのであれば、 ------------------------------------------------------------------| clsuter.com | WEIGHT | ACTV | NEWC | PORT | SYS | | PORT: 80 |NOW NEW| 49% | 50% | 1% | 0% | 攻撃されている可能性も ------------------------------------------------------------------| server1 | 10 10 | 141 | 0 | -1 | 0 | あります。 | server2 | 10 10 | 283 | 0 | -1 | 0 | | sorryServer | 10 10 | 926 | 273 | -1 | 0 | ------------------------------------------------------------------SYNフラッド攻撃 DoS攻撃の手法の一つで、確立しないTCP接続を大量に試みる攻撃 接続の確立時の3ウェイ・ハンド・シェイクにおいて、SYNを大量に送りつけるが、 サーバー側からのSYN/ACKにはACKを返さず、サーバー側には不完全な接続 が滞留し、新たな接続が受けつけれない状況となる SYN SYN/ACK netstat –anで接続情報を表示 し、”SYNRCVD”のステータス が異常に多いようであれば、 DoS攻撃の可能性あり ACK Dispatcherでは攻撃を止めることはできないが、特定のIPからのみSYN攻撃を 受けているのであれば、IPルールでパケットをDropすることは可能 IPルールを設定し、ルールの割振り先サーバーに何も指定しない Rational Web Developer Rational Application Developer WebSphere Studio & Rational 開発ツール SOAによるサー ビス統合開発者 WebSphere Integration Developer • プロセス・フロー (BPEL) • WPS V6 WebSphere Studio Development Suite for HLL/WB • 日本語仕様書から 日本語仕様書からコード からコード生成 コード生成 • ソースから ソースから仕様書 から仕様書へ 仕様書へリバース • 用語辞書管理 WebSphere Developer for zSeries (WDz) iSeries App開発者 • COBOLと とPL/I: :ロー カルや カルやリモートで リモートで編集、 編集、 コンパイル、 コンパイル、デバッグ • EJB開発環境 開発環境 のXML活用 活用 • コンポーネント・ コンポーネント・テスト • COBOLの • EGL( (COBOL) ) • ランタイム ランタイム分析 分析 • HATS ToolKit • コードレビュー • CICS Windows • UML可視化 可視化 • CCアダプター アダプター • CCLTサーバー サーバー(同梱) 同梱) • Portalテスト テスト環境 テスト環境 z/OS Appl開発者 Rational Application Developer (RAD) WebSphere Development Rational Web Developer Studio Client • Webアプリケーション アプリケーション開発環境 アプリケーション開発環境 サーブレット) サーブレット Advanced Edition (HTML/JSP/サーブレット • Strutsビルダー ビルダー for iSeries • サイト・ サイト・デザイナー • RPGと とCOBOLの のリ モート編集 モート編集、 編集、コンパイ ル、デバッグ • Web Facing Tool • HATS Toolkit Web Appl開発者 • JSF/SDO • Webサービス サービス • XML開発環境 開発環境 • RDB開発環境 開発環境 • EGL (Java) • WebSphere テスト環境 テスト環境 • Java Visual Editor Rational Software Architect (同梱 同梱) 同梱 • J2EE Connector (オプションフィーチャー オプションフィーチャー) オプションフィーチャー • UML2.0開発 開発 • C/C++開発 開発 オープンソース、 編集, オープンソース、Java編集 編集 コンパイル, コンパイル デバッグ J2EE開発者 Appl設計者 IBM Rational Software Development Platform (RSDP) 開発チームを統合することが可能なソフトウェア開発の「プラットフォーム」 Eclipse 3.0ベース 各ツールのシナジーにより、コラボレーティブな開発を実現 個人とチーム全体の生産性を向上 http://www.ibm.com/jp/software/rational/products/release/sdp-2004/ 前頁の製品は「プラットフォーム」を共有することが出来ます。 共存、共存できない場合もありますので、ドキュメントをご確認ください。 この例では Rational Application Developer WebSphere Developer for zSeries がプラットフォーム上にあります。 Rational Application Developer ディレクトリー構造 RSDP製品のインストールやUpdate時のログ rad・・・RADのプラグイン rad_prod・・・RADのドキュメント各種 WASテスト環境(V5.x, V6) →次頁参照 Portalテスト環境 etc. wdz・・・WDzのプラグイン wdz_prod・・・WDzのドキュメント各種 RSDP製品のワークスペース 開発時のファイルはここに入ります *ワークスペースは複数作成できます WAS V6 テスト環境 ディレクトリー構造 新規プロファイルを作成することで、ワークスペース上で どのアプリケーションサーバープロファイルを使用するか 選択することが出来ます。 *新規プロファイル作成ウィザード {RAD_install}¥runtimes¥base_v6¥bin¥ProfileCreator¥pctWindows.exe profiles 導入時にdefaultプロファイル が自動作成されている profileごとのlogsディレクトリー 解析の際にはまずここを参照! 解析方法はWASと同様です ランタイム・WASテスト環境 RADには にはWASV5.0,V5.1,V6の のテスト環境 には テスト環境が 環境が付属 WASV5.xと とWASV6は は構造が 構造が変わりました。 わりました。 RAD WAS V6 サーバー WAS Express、Base、NDをテスト 可能 WAS Express、Baseは製品CDか らサイレント・インストール可能 WAS NDは別途購入が必要 SOAP port:8880 WAS V5.x テスト環境 ローカル・デバッグ ランタイム WAS 新リモート・デバッグ H/W WAS Baseをプラグイン WAS V5.x サーバー Rational Agent Controller 旧リモート・デバッグ Rational Agent Controllerを経由 してリモートのWAS Express、 Baseをテスト可能 RAC port:10002 テスト環境のサーバー設定の違い WASV6 テスト環境 テスト環境 WASV5.x テスト環境 テスト環境 管理コンソールを立ち上げる には、ここにチェック!! WASV6 は、管理コンソールを立ち上げ、 サーバーの設定をします。 (Enhanced EARで設定することもできます) WASV5.x は、サーバーの設定画面があり、タブを 切り替えて設定が出来ます。(管理コンソールを 立ち上げることもできます) 何かおかしいと思ったら・・・ どこで起こった問題か切り分ける!! 実は一番多い!! ツールの ツールの使い方が分からない WASコンソール WASコンソール上 コンソール上でエラーメッセージ WASの問題判別と同様、コンソールやログより解析を行う 解析の際はPAコールも活用 アプリケーションの障害の場合は、デバッグを行い、バグの発見・修正 ウィザード使用 ウィザード使用や 使用やコンパイル時 コンパイル時にエラー ヘルプ、チュートリアル、Webの記事(WebSphere/Rational Developer Domain etc.) を参照 まずはツールのFixを当ててみる(次項参照) org.eclipse.xxxx とトレースで出ていた場合は、ツールの障害である可能性も 再現を確認して、PAコール ツールの ツールのパフォーマンスが パフォーマンスが遅い IBM Rational Software Development Platform 製品群 パフォーマンスTips http://www.ibm.com/jp/developerworks/rational/mdd/performance/sdptips.html 上記以外では、 ディスクのデフラグ、ワークスペースの分割も有用 といっても、やはりPCのスペック(CPU/メモリ)を向上させることが一番!! Fix、オプション・フィーチャーの適用方法 オンライン、オフラインで適用可能 http://www.ibm.com/jp/software/rational/download/ifix/index.html Rational Product Updaterは便利 ネットワークにつないでいる場合、自動検出可能 V6.0.1より、クリーンアップ機能搭載(以前の累積Fixを削除し、Disk容量の空きを増やす) 最新のFixが表示されるので、以前のものを適用したい場合は、別途ダウンロード http://www.ibm.com/software/awdtools/developer/application/support/index.html