Comments
Description
Transcript
問題判別 1 WASV6.1による基幹システム設計Workshop
WASV6.1による基幹システム設計Workshop 問題判別 1 Agenda 問題判別の心得 IHS / WebSphere Application Server問題判別 情報収集 症状別問題判別 通信データ問題判別 IHS/WAS情報収集・問題判別 JVM問題判別 症状別問題判別 Edge Component問題判別 問題が起こる前に 情報収集(既知情報) 通信データ情報収集 (参考)Rational Application Developer問題判別 症状別問題判別 Fix、オプション・フィーチャーの適用方法 2 2 問題判別の基本手順 問題発生 当セッションにて解説 問題の種類 / 発生箇所の特定 対応策 ・パッチの適用 ・設定の変更 ・アプリの修正 … 問題原因の究明 採集資料(ログやトレース)の分析 既知の問題 再現手順の調査 さらなる資料の採集・分析 既知情報の 収集 情報の保存 質問・採集した資料の送付 サポートセンターに連絡 3 上記は、WebSphere製品に関わらず、一般的なOS/ソフトウェア製品の問題判別の基本手順になります。 問題判別とは、発生した問題の原因を特定し、その問題を解決するための対応策を実施して、問題が解決し たことをテストで確認するための作業です。 問題が発生したら、その問題の種類や発生箇所の分析を行います。そして、取得したログやトレースを使用し て、その問題が起こっている原因を究明します。その原因に応じて、パッチの適用や設定の変更、アプリケー ションの修正などといった対応をします。原因が既知の問題である場合には既知情報を収集し、その問題に対 して適切な対応をします。 次に、その問題の再現性について調査します。再現性がある場合はその再現手順について調査します。そし て、さらに公開されている資料や既知情報をもとに問題の分析を行います。ここで調査した情報を、今後同じよ うな問題が起こったときのために残しておくことも大切になります。 最終的に問題への対応方法が分からず、解決されない場合は、サポートセンターに連絡し解析を依頼します。 その際、質問内容と一緒にログやトレースなどの採集した資料も送付します。 3 問題判別の心得 情報収集(既知情報) 問題が起こる前に 問題判別の基本手順 はじめに確認すべきサイト WASサポート・サイト / 重要障害情報 Defect・List / iFix・List(Edge) (参考)WAS修正について MustGather IBM Support Assistant(ISA) IBM Guided Activity Assistant(IGGA) 4 4 問題が起こる前に 障害情報や修正プログラム情報の収集 WASサポート・サイトから最新リリースをチェック ¾ 最新リリースの適用を推奨 障害情報の確認 問題の発生を想定した設計・構成 WASクラッシュ時にヒープダンプを出力させる OSのCoreファイル出力先のサイズに余裕を持たせる サービスを停止することなくFixpackを適用する 機能テスト、パフォーマンステストの実施 プロジェクト体制 障害発生時の役割分担、体制などの明確化 5 問題が発生する前に、それに備えておくべきこととしては、まず障害情報や修正プログラム情報の収集 が挙げられます。これらの情報は、WASのサポート・サイトから得ることが出来ます。WASサポート・サイトは、 最新リリースの情報や障害に関する情報が随時更新されており、これらを事前に調べておくことが望まし いです。また、WASの導入にあたっては最新リリースの適用が推奨されます。更に本番システムを導入す るにあたり、機能テスト、パフォーマンステストを事前に行っておくことや障害発生時の役割分担などプロ ジェクト体制を明確化することも重要です。 5 はじめに、確認すべきサイト InfoCenter(製品マニュアル) WASサポート・サイト 過去のQA情報などが検索できる http://www.ibm.com/support/jp/search Defect・List 日本語の技術情報や連載記事、Workshop資料を入手可能 http://www.ibm.com/jp/software/websphere/developer テクニカル・サポート検索 Technoteや既知の障害情報を検索可能 http://www.ibm.com/software/webservers/appserv/was/support/ Developer・Domain http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp? RefreshPack・FixPackによる機能追加・修正内容の一覧表示 http://www.ibm.com/support/docview.wss?rs=180&uid=swg27007951 iFix・List(Edge) iFixによる修正内容を日本語にて一覧表示 http://www.ibm.com/jp/software/websphere/download/ifix/was/edge/learnmore.html 6 上記は、問題判別の際に、”はじめに確認すべきサイト”として纏めさせて頂きました。WASサポート・サ イト、Defect・List、iFix・List(Edge)につきましては、次ページ以降で紹介させて頂きます。 6 WASサポート・サイト Technotesや既知の障害情報を検索可能 推奨される修正プログラム、 FixPackのダウンロード 情報の検索 Technotes、修正プログラムの情報 InfoCenter、RedBook IBM Support Assistant 7 <WASサポート・サイト> Technotesや既知の障害情報を検索する事が出来ます。 ・TechNotesや修正プログラム情報 ・情報の検索 ・推奨される修正プログラム、FixPackのダウンロード ・InfomationCenter、RedBook 7 Defect・List(WAS) / iFix ・List(Edge) Defect・List(WAS) RefreshPack・FixPackによる機 能追加・修正内容の一覧表示 FixPackに対する、Defect Listを一覧表示 iFix・List(Edge) iFixによる修正内容の一 覧表示 バージョン毎に修正/不具合の 概要、APAR番号が表示 8 Defect・Listでは、RefreshPack・FixPackによりどのような機能追加や修正が行われたのかを確認する事 が出来ます。iFix・List(Edge)では、EdgeのFix情報を日本語で確認する事が出来ます。FixPack適用の際 は、是非、ご参考にして下さい。 8 MustGather WebSphere Application Serverの問題判別のサポートサイト 発生した問題に対する情報収集の作業方法などを掲載 MustGather: Read first for all WebSphere Application Server products http://www.ibm.com/support/docview.wss?rs=180&uid=swg21145599 問題の種類、発生コンポーネントの リストから選択 問題の種類ごとに 取得すべき情報と作業方法を記載 9 その他、問題が発生した際に参考にするサポートサイトとして、MustGathe:Read first for all WebSphere Application Serverがあります。このページでは、問題の種類や問題が発生したコンポーネントがリストに なっており、問題の種類に応じて取得すべき情報収集の作業方法などが示されております。問題判別を 行う際には参考にして下さい。 (例)問題の種類、発生コンポーネント ・100% CPU Usage ・Classloader ・DB Connections/Connection Pooling ・EJB 9 IBM Support Assistant(ISA) (1/2) 製品に関する課題を解決するために役立つワークベンチ 製品導入CD もしくは、下記サイトより導入 問題判別に役立つ情報を検索 Googleも検索対象 製品情報を検索 http://www.ibm.com/software/support/isa/ Support Link developerWorks 推奨Fix 等 問題を診断する MDD4J PMAT ThreadAnalyzer IGAA 等 10 IBM Support Assistant(ISA)とは、製品に関する課題を解決するために役立つワークベンチになります。 WAS 製品導入CDもしくは、次のリンク先(http://www.ibm.com/software/support/isa/)より導入することが出来ます。 コンポーネント毎の使用方法・目的は以下になります。 <アップデーター>・・・ IBM Support Assistant (ISA) を更新する 製品・ツールをISAに追加、アップグレードする。当コンポーネントにて、必要となる製品やツール等を登録しま す。 <検索>・・・製品に関する課題の解決に役立つ情報を検索する。 複数ロケーションを並行アクセスし、次を対象とし検索。(WebSphere製品だけではなく、その他の製品(Tivoli、 IMS等)も検索可能) IBM ソフトウェア・サポート文書、IBM developerWorks、IBM ニュースグループおよびフォーラム、IBM 製品の インフォメーション・センター、GoogleTM。 <製品情報>・・・製品課題の解決に役立たせることができる次の製品情報をアクセスする。 ホーム・ページ、サポート・ページ、ニュースグループおよびフォーラム、スキル、トラブルシューティング。 <サービス>・・・問題報告書を提出して、製品の課題を解決する。 問題報告書の作成および提出、診断データの自動収集、既存問題報告書の表示と更新、問題判別ファイル の送信。 <ツール>・・・専門化されたソフトウェア・ツールを使用して製品の問題を診断する。 IBM分析ツールを使用した問題判別作業の支援、特定の製品問題に対してのツールの選択、新規ツールの ダイナミックな追加。 <IBM Workplace for Customer Support>・・・IBM Workplace for Customer Supportへのリンク。 IBMソフトウェアのプレミアムサポートをご契約いただいているお客様のための個別カスタマイズ可能なポータ ルページを表示。 10 IBM Support Assistant(ISA) (2/2) 検索 検索条件入力 検索対象を選択 製品枠を超えた、複数リソースの検索が可能 製品情報 製品毎に、各種重要情報を提示 11 上記は、IBM Support Assistant(ISA)にて、検索と製品情報を選択した場合の画面キャプチャーになります。 11 IHS / WebSphere Application Server問題判別 IHS/WAS情報収集・問題判別 各コンポーネントで取得できるログ IHSの情報収集・取得されるログ IHSアクセスログのカスタマイズ IHSエラーログのログレベル プラグインで取得されるログ プラグインログのログレベル プラグインログのトレース WASの情報収集・取得されるログ JVMログ JVMログに出力されるメッセージ プロセスログ FFDCログ HTTPトランスポートログ IBM保守ログ WASのトレース ログ詳細レベルの変更 ロギングレベル ログレベルの変更 ロギングレベルの変更 WASのトレースの取得例 JDBCトレースログ JDBCトレースログの設定方法 12 12 各コンポーネントで取得できるログ・トレース IHS プラグイン WAS HTTP(S) WebServer WebServer (IHS) (IHS) Plug-in Module access.log、error.log http_plugin.log HTTP(S) Plug-in Config XML file Application Application Server Server (WAS) (WAS) 連携 DB JDBCトレースログ SystemOut.log、SystemErr.log、 native_stdout.log、native_stderr.log、 http_access.log、http_error.log、 activity.log、<process>_<time>.log 13 ログは問題判別の基本となるものであり、出力する製品や階層に応じてさまざまなログが出力されます。この章 では、IHSからWASに至るまでのログについて紹介します。 ブラウザから実行されるリクエストはまずIHSに届き、そのリクエストがWASに処理を委ねるものとプラグインが判 断した場合、プラグインはそのリクエストをWASに渡します。WAS内で処理されたリクエストはプラグイン、IHSを 通ってブラウザに戻されます。つまり、ブラウザから実行されるリクエストはIHSのログ、プラグインのログ、WASの ログ(HTTPトランスポートのログ、JVMログ.etc)という順に記載されていきます。 問題判別をされる際には、クライアントに近い方から順番に問題の切り分けを実施して下さい。 13 IHSの情報収集 バージョン [Unix] <IHS_ROOT>/bin/apachectl –v [WINDOWS] <IHS_ROOT>/bin/Apache.exe –v # <IHS_ROOT>/bin/apachectl –v Server version: IBM_HTTP_Server/6.1.0.7 Apache/2.0.47 Server built: Jan 10 2007 17:45:55 <IHS_ROOT>/bin/versionInfo.bat(sh) # <IHS_ROOT>/bin/versionInfo.bat インストール済み製品 -------------------------------------------------------------------------------名前 IBM HTTP Server バージョン 6.1.0.0 ID IHS ビルド・レベル b0620.14 設定ファイル <IHS_ROOT>/conf/httpd.conf 14 IHSで問題判別の際に収集すべき情報には、バージョン、ログ、設定ファイルがあります。バージョンは、Unix 環境では<IHS_ROOT>/apachectl –vコマンドにて、Windows環境では<IHS_ROOT>/bin/Apache.exe –vコマンド を実行することで、IHSのバージョンと対応するApacheのバージョンが表示されます。また、IHSのバージョン情報 は、<IHS_ROOT>/bin/versionInfo.bat(sh)コマンドでも確認できます。ログファイルは<IHS_ROOT>/logs以下に 存在し、設定ファイルは<IHS_ROOT>/conf/httpd.confに存在します。 14 IHSで取得されるログ ログファイル access.log デフォルトは、<IHS_ROOT>/logs IHSに届いたリクエストの処理記録 LogFormatディレクティブで、記録項目はカスタマイズ可能(→後述) 出力先はディレクティブで指定(管理コンソールからも可能) error.log IHSのリクエスト、もしくは処理中に発生したエラーやwarningを記録 LogLevelディレクティブで、ログレベルは変更可能(→後述) 出力先はディレクティブで指定(管理コンソールからも可能) 15 IHSで取得されるログは、access.logとerror.logの2つになります。 access.logは、クライアントからIHSに届いたリクエストに対するリプライの記録であり、アクセス数の集計によく用 いられるログです。access.logに記述される内容は、LogFormatディレクティブでカスタマイズが可能です。 error.logは、リクエストもしくはIHSがリクエストを処理する中で発生したエラーやWarningを記録するログです。 出力される内容はLogLevelディレクティブで変更することが可能です。 これら2つのログはデフォルトでは<IHS_ROOT>/logsに出力されますが、CustomLogやErrorLogディレクティブ で出力先やログ名を変更することも可能です。またV6からはデプロイメントマネージャの管理下にあれば、管理 コンソールから出力先を変更することも可能です。 問題判別をされる際には、access_logでのリクエストのHTTPステータスやレスポンスタイム、error_logにエラー メッセージが出力されていないか等を確認して下さい。 15 IHSアクセスログのカスタマイズ LogFormatディレクティブ 指示子でもってログに記述する内容を定義 各々のフォーマットに識別のための名前をつけ、そのフォーマット名で ログに結びつける httpd.conf LogFormat "%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥"" combined LogFormat "%h %l %u %t ¥"%r¥" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent フォーマット名commonを CustomLog logs/access.log common ログのフォーマットに指定。 ログの出力ディレクトリ、ファイル名を指定。 IHSのレスポンスタイムはデフォルトでは記載がないので注意 ¾ %D(マイクロ秒表示)もしくは%T(秒表示)をLogFormatに追加 手動でレスポンスタイムをログに記録させる設定が必要。 httpd.conf LogFormat “%h %l %u %t ¥”%r¥“ %>s %b %D ” common 16 アクセスログのカスタマイズは、LogFormatディレクティブで行います。デフォルトでは以上4パターンの LogFormatが指定されており、それぞれに名前が付けられています。LogFormatディレクティブの最後に指定さ れている内容(上記のcombined、common、referer、agent)がそれぞれのフォーマット名になります。アクセスログ の出力先はCustomLogで指定しますが、その際、最後にフォーマット名を記述します。そうすることで、指定され たフォーマットでアクセスログに出力されます。 LogFormatでは、ログに記述する内容を指示子と呼ばれる特殊記号で表現します。デフォルトで指定されてい るLogFormatではIHSのレスポンスタイムは記録されません。IHSのレスポンスタイムを記録するには、LogFormat ディレクティブに%Dもしくは%Tを追加する必要があります。%Dはマイクロ秒単位、%Tは秒単位でIHSがリクエス トを受け取ってレスポンスを返すまでにかかる時間をアクセスログに記録します。また、リクエストがIHSに入って 来た時ではなく、IHSから出て行った時にaccess_logにログが書き込まれます。従いまして、access_logでは、リク エスト順にログが書き込まれるわけでは無い事をご注意下さい。 問題判別の観点からは、このレスポンスタイム出力を設定される事をお勧め致します。 ・IHSのLogFormatディレクティブ http://httpd.apache.org/docs/2.1/mod/mod_log_config.html#formats 16 IHSエラーログのログレベル LogLevelディレクティブ エラーログに記録される内容のレベルを指定 デフォルト:Warn debug,info,notice,warn,error,crit,alert,emergの8種類 httpd.conf LogLevel debug error.log LogLevelをWarnからdebugに変更してIHSを起動したときの例 デフォルトのWarnでは記録されない、子プロセスの情報などが記録される [Thu Sep 15 15:32:23 2005] [notice] IBM_HTTP_Server/6.0.2 Apache/2.0.47 (Win32) configured -- resuming normal operations 親プロセスが子プロセス(ID 3644)を [Thu Sep 15 15:32:23 2005] [notice] Server built: May 11 2005 17:32:46 立ち上げる [Thu Sep 15 15:32:23 2005] [notice] Parent: Created child process 3644 [Thu Sep 15 15:32:23 2005] [debug] mpm_winnt.c(521): Parent: Sent the scoreboard to the child [Thu Sep 15 15:32:24 2005] [notice] Child 3644: Child process is running [Thu Sep 15 15:32:24 2005] [info] Parent: Duplicating socket 204 and sending it to child process 3644 [Thu Sep 15 15:32:24 2005] [debug] mpm_winnt.c(442): Child 3644: Retrieved our scoreboard from the parent. [Thu Sep 15 15:32:24 2005] [debug] mpm_winnt.c(639): Parent: Sent 1 listeners to child 3644 [Thu Sep 15 15:32:24 2005] [debug] mpm_winnt.c(598): Child 3644: retrieved 1 listeners from parent [Thu Sep 15 15:32:24 2005] [notice] Child 3644: Acquired the start mutex. [Thu Sep 15 15:32:24 2005] [notice] Child 3644: Starting 250 worker threads. 子プロセス(ID 3644)が 17 250個のスレッドを起動 IHSのエラーログに記録される内容は、LogLevelディレクティブで指定することが出来ます。ログレベルには debug、info、notice、warn、error、crit、alert、emergの7種類がありdebugからemargになるにつれ重要度が高くな ります。ログレベルはデフォルトではWarnに設定されているため、Warnより上の重要度の情報が記載されます。 さらにdebugやinfoといった詳細な情報をログに記録させたい場合には、LogLevelディレクティブの指定をdebug に変更すると、全ての情報がエラーログに記載されるようになります。問題判別を行う際には、このログレベルを 上げて下さい。 17 各コンポーネントで取得できるログ・トレース IHS プラグイン WAS HTTP(S) WebServer WebServer (IHS) (IHS) Plug-in Module access.log、error.log http_plugin.log HTTP(S) Plug-in Config XML file Application Application Server Server (WAS) (WAS) 連携 DB JDBCトレースログ SystemOut.log、SystemErr.log、 native_stdout.log、native_stderr.log、 http_access.log、http_error.log、 activity.log、<process>_<time>.log 18 ログは問題判別の基本となるものであり、出力する製品や階層に応じてさまざまなログが出力されます。この章 では、IHSからWASに至るまでのログについて紹介します。 ブラウザから実行されるリクエストはまずIHSに届き、そのリクエストがWASに処理を委ねるものとプラグインが判 断した場合、プラグインはそのリクエストをWASに渡します。WAS内で処理されたリクエストはプラグイン、IHSを 通ってブラウザに戻されます。つまり、ブラウザから実行されるリクエストはIHSのログ、プラグインのログ、WASの ログ(HTTPトランスポートのログ、JVMログ.etc)という順に記載されていきます。 問題判別をされる際には、クライアントに近い方から順番に問題の切り分けを実施して下さい。 18 プラグインで取得されるログ http_plugin.log プラグインの処理内容を記録 WebサーバーとWAS間の通信に問題があるときに参照 plugin-cfg.xmlファイル内でログに関する設定を行う (→後述) ¾ 設定は管理コンソールからも実施可能 plugin-cfg.xml <Config ASDisableNagle="false" AcceptAllContent="false" AppServerPortPreference="HostHeader" ChunkedResponse="false" FIPSEnable="false" IISDisableNagle="false" IISPluginPriority="High" IgnoreDNSFailures="false" RefreshInterval="60" ResponseChunkSize="64" VHostMatchingCompat="false"> <Log LogLevel="Error" Name="C:¥IBM¥WebSphere¥Plugins6/logs/webserver1/http_plugin.log"/> ログレベル ログの出力先 管理コンソール 「サーバー」→「Webサーバー」→ <WebServer name>→「プラグイン・プロパティー」 19 プラグインが出力するログがhttp_plugin.logになります。http_plugin.logはプラグインの処理内容が記録されて おり、WebサーバーとWASとの通信に問題があると思われたときに参照して問題解析を行ってください。 プラグインログに関するログレベルや出力先の設定はplugin_cfg.xmlで記載されており、plugin_cfg.xml内の LogLevel、Nameといった設定箇所を編集することで変更することが可能です。またV6からは管理コンソールから の「プラグイン・プロパティー」からも設定が可能です。管理コンソールから設定を行うためには、Webサーバー がデプロイメントマネージャの管理下である必要があります。またplugin-cfg.xmlの位置は、IHSの設定ファイルで あるhttpd.confで指定します。 19 プラグインログのログレベル Error(デフォルト) Warn リクエストおよびリプライに関する情報を記録 Debug リクエストに対し選択されたサーバー、ロードバランシング情報を記録 Detail プラグインの処理中に発生したエラーとWarningを記録 Stats プラグインの処理中に発生したエラーを記録 リクエストの処理中に実行された重大なステップが記録 Trace (→後述) リクエストを受けた際にプラグインが行った全過程を記録 http_plugin.log [Wed Sep 14 15:20:09 2005] 0000049c 00000e18 - STATS: ws_server_group: serverGroupCheckServerStatus: Checking status of mercuryNode01_server1, ignoreWeights 0, markedDown 0, retryNow 0, wlbAllows 1 reachedMaxConnectionsLimit 0 20 [Wed Sep 14 15:20:09 2005] 0000049c 00000e18 - STATS: ws_server: serverSetFailoverStatus: Server mercuryNode01_server1 : pendingConnections 0 failedConnections 0 affinityConnections 0 totalConnections 1. プラグインログの出力レベルは、デフォルトではErrorになっています。つまり、エラーが発生しない限り、プラグ インがリクエストを正しく割り振ってもその記録は残りません。より詳細な記録をプラグインログに記載させるため にはログレベルを変更する必要があります。 ログレベルにはError以外にも、Debug、Detail、Warn、Stats、Traceがあり、Traceがもっとも詳細に処理内容が 記載されます。Statsではプラグインの割り振り先やロードバランシング情報が記載されます。IHSとWASが1対N 構成時に、IHSのプラグインが割り振ったサーバーを確認したい場合にはStatsを設定されると良いかと思います。 20 プラグインログのトレース ログレベルを「Trace」に設定 リクエストを受けた際にプラグインが行った全過程を記録 以下は、http://localhost/JVM/input.htmlのリクエストを処理した過程の抜粋 http_plugin.log [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_common: websphereShouldHandleRequest: trying to match a route for: 仮想ホスト、URIを比較し、 vhost='localhost'; uri='/JVM/input.html' [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_common: websphereVhostMatch: Found a match '*:80' to 'localhost:80' in WASに処理を渡すことを判断 VhostGroup: default_host with score 1 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_common: websphereUriMatch: Found a match '/JVM/*' to '/JVM/input.html' in UriGroup: default_host_server1_mercuryNode01_Cluster_URIs with score 5 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: mod_was_ap20_http: as_translate_name: WebSphere will handle: /JVM/input.html・・・・・ [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: lib_htrequest: htrequestSetMethod: Setting the method |GET| WASに送るリクエストのヘッダ作成 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: lib_htrequest: htrequestSetURL: Setting the url |/JVM/input.html| ・・・・・ [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - STATS: ws_server_group: serverGroupCheckServerStatus: Checking status of mercuryNode01_server1, ignoreWeights 0, markedDown 0, retryNow 0, wlbAllows 1 reachedMaxConnectionsLimit 0 リクエストを処理するサーバーの情報を取得。 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_server_group: lockedServerGroupUseServer: Server mercuryNode01_server1 サーバーにアクセスし、Weightを1減らす picked, weight 0. [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_server_group: serverGroupIncrementConnectionCount: Server mercuryNode01_server1 picked, pendingConnectionCount 1 totalConnectionsCount 1. [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: lib_htrequest: htrequestWrite: Writing the request: WASにリクエストを送信し、レスポンスを受信する [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: GET /JVM/input.html HTTP/1.1 ・・・・ [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: lib_htrequest: htrequestWrite: Writing the request content (その際のヘッダの情報を取得) [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: lib_htresponse: htresponseRead: Reading the response: 5b9874 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: HTTP/1.1 200 OK ・・・・・ [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_common: websphereExecute: Done with Request to app server processing クライアントに返すレスポンスのヘッダ作成し、 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: mod_was_ap20_http: cb_write_headers: In the write headers callback プラグインは処理を終了 [Wed Sep 14 15:30:08 2005] 00000e00 00000ef4 - TRACE: ws_common: websphereEndRequest: Ending the request 21 プラグインログのレベルをTraceに設定すると、プラグインが処理した詳細な内容がログに記載されますので、 問題判別時には非常に有用です。以上のログは、プラグインログのレベルをトレースにしたときのログを抜粋し て見やすくした例です。リクエストがプラグインに来てから、仮想ホストやURIを比較しWASに処理を渡すことを判 断したことを示す記述や、リクエストヘッダの生成、リクエストを処理するサーバーの選択、リクエストの送信とレス ポンスの受信、さらにクライアントに返すレスポンスのヘッダを作成してクライアントに処理を返すまでの内容を確 認することが出来ます。 21 各コンポーネントで取得できるログ・トレース IHS プラグイン WAS HTTP(S) WebServer WebServer (IHS) (IHS) Plug-in Module access.log、error.log http_plugin.log HTTP(S) Plug-in Config XML file Application Application Server Server (WAS) (WAS) 連携 DB JDBCトレースログ SystemOut.log、SystemErr.log、 native_stdout.log、native_stderr.log、 http_access.log、http_error.log、 activity.log、<process>_<time>.log 22 ログは問題判別の基本となるものであり、出力する製品や階層に応じてさまざまなログが出力されます。この章 では、IHSからWASに至るまでのログについて紹介します。 ブラウザから実行されるリクエストはまずIHSに届き、そのリクエストがWASに処理を委ねるものとプラグインが判 断した場合、プラグインはそのリクエストをWASに渡します。WAS内で処理されたリクエストはプラグイン、IHSを 通ってブラウザに戻されます。つまり、ブラウザから実行されるリクエストはIHSのログ、プラグインのログ、WASの ログ(HTTPトランスポートのログ、JVMログ.etc)という順に記載されていきます。 問題判別をされる際には、クライアントに近い方から順番に問題の切り分けを実施して下さい。 22 WASの情報収集 情報収集ツール <WAS_PROFILE_ROOT>/bin/collector.sh(.bat) <Hostname>-<Cellname>-<Nodename>-<Profilename>-WASenv.jarファイル にて出力 ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ -summaryオプションで、一つのテキストファイルで出力 ¾ ¾ ¾ ¾ ¾ コレクターツールのログ <WAS_ROOT>と<WAS_PROFILE_ROOT>以下のbin、config、logs、profiles、propertiesディレク トリ以下のファイルのコピー OS情報 Java 情報 WAS情報 (<WAS_ROOT>以下のディレクトリ構造とファイルが記載) コレクターツールが実行したシェルスクリプト (バッチファイル) の実行情報 MQ情報(WebSphereMQまたは組み込みメッセージングフィーチャーをインストールした場合) JAR ファイルのマニフェスト ホスト、ノード名 インストールディレクトリ WASのバージョン Javaのフルバージョン OSのバージョン Collectorコマンドはプロファイル単位で実行 バージョン versionInfoコマンド 23 WASで問題発生時に情報を収集するツールとしてcollectorコマンドがあります。実行すると以上の情報を一つ の<Host name>-<Cell name>-<Node name>-<Profile name>-WASenv.jarというJARファイルにアーカイブします。 また、このコマンドはWASのインストールディレクトリ以外で実行する必要があり、適切なディレクトリから <WAS_PROFILE_ROOT>/bin/collector.sh(.bat)を実行します。また、collectorコマンドに-summaryオプションを つけて実行させると、以上の情報をCollector_Summary.txtという名前のテキストファイルで出力します。このファ イルでは、WASやJavaのバージョンを確認することも出来ます。なお、collectorコマンドは自分のプロファイル以 下の内容しか取得しませんので、プロファイルが複数ある場合は、それぞれのプロファイル毎にcollectorコマン ドを実行して下さい。 バージョンの確認は、<WAS_PROFILE_ROOT>/bin/versionInfo.sh(.bat) コマンドで確認することが出来ます。 その他、WASで問題判別の際に収集すべき情報には、ログ、設定ファイルがございますが、次ページ以降で ご説明させて頂きます。 23 WASで取得されるログ JVMログ(SystemOut.log / SystemErr.log) プロセスログ(native_stdout.log / native_stderr.log) エラー情報を発生時に自動で記録される サポートセンター、開発部門が障害対応時に見るログ HTTPトランスポートログ(http_access.log / http_error.log) ネイティブコードやJVM自身の出力が書き込む情報 FFDCログ(<process_name>_<timestamp>.txt) JVMの標準出力、標準エラー出力 アプリケーションの挙動やプロセスの稼動状況 WebコンテナーのHTTPトランスポートに対するアクセスを記録するロ グ IHSを介さないアクセスに対するアクセスログ、エラーログ IBM保守ログ(activity.log) JVMに詳細な情報を記録したログ showlogコマンドを使用 24 WASで取得できるログは、以上になりますので、ご確認下さい。 ・JVMログ SystemOut.log、SystemErr.logという名前で出力され、アプリケーションの挙動やプロセスの稼動状況を記載さ れます。 ・プロセスログ native_stdout.log、native_stderr.logという名前で出力され、ネイティブコードやJVM自身の出力が記載されます。 ・FFDC(First Failure Data Capture)ログ 全てのシステムエラーを発生時点で自動的に記録されるもので、サポートセンターや開発部門が障害対応時 に確認するログです。 ・HTTPトランスポートログ WebコンテナーのHTTPトランスポートに対するアクセスを記録するログで、IHSを介さないアクセスに対するア クセスログとエラーログです。 ・IBM保守ログ JVMログにさらに詳細な情報を記録したログで、バイナリファイルのためエディターで開くことはできません。確 認するためにはshowlog.bat(sh)というコマンド実行が必要になります。 24 JVMログ SystemOut.log / SystemErr.log 問題判別を行う上で、最も重要なログ アプリケーションの挙動やプロセスの稼動状況が記載されているログ アプリケーションサーバー、ノードエージェント、デプロイメントマネージャなど各プロセ ス単位で存在 「サーバー」→「アプリケーションサーバー」→<server_name> →「ロギングおよびトレース」→「JVMログ」 出力先ファイル名 ファイルのフォーマット(基本or拡張) <ログファイルの循環> ファイルサイズ(指定サイズが来たとき)や 時間(指定時間に達したとき)で新規ファイルを 作成可能 アプリケーション内のprint文をログに書き込むか、 また、その文を指定したフォーマットに従って 25 フォーマットするか(デフォルト両方ON) JVMログは、アプリケーションの挙動やプロセスの稼動状況が記載されているログで、問題判別を行う上でもっ とも重要なログの一つです。JVMログは各アプリケーションサーバー、ノードエージェント、デプロイメントマネー ジャなど、各プロセス単位で<WAS_PROFILE_ROOT>/logs/<process_name>ディレクトリ以下に出力されます。 JVMログに関する設定は管理コンソールから行います。 25 JVMログに出力されるメッセージ メッセージID メッセージを発行したコンポーネントやその重要度を示す エラーメッセージが出た際、メッセージIDでInfocenterを検索して下さい SystemOut.log [05/07/07 14:17:57:965 JST] 0000000a WsServerImpl A WSVR0001I: e-business の ためにサーバー server1 がオープンされました メッセージID 最初の4文字(もしくは5文字)がコンポーネントを示す 続く数字がそのコンポーネントでメッセージを識別するための番号 最後の1文字が重要度(I=情報、W=警告、E=エラー)を示す Infocenterから 「参照」→「メッセージ」より、 メッセージIDとその内容と対応を見ることができる 26 JVMログに出力されるメッセージにはメッセージIDと呼ばれるIDが付けられており、メッセージが分類できるよう になっています。メッセージIDは最初の4文字(もしくは5文字)がコンポーネントを示しており、続く数字がそれら のメッセージを識別するための番号、最後の一文字が重要度を示しています。重要度は、Iが情報、Wが警告、 Eがエラーを示しており、一番重要度が重いのはエラーです。 WAS V6.1のInfoCenterではメッセージIDごとにその内容と対応を確認することが出来ます。出力されたメッ セージに関して情報が知りたい場合は、InfoCenterでメッセージIDをもとに検索して下さい。 ・WebSphere V6.1 InfoCenter http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp 26 プロセスログ native_stdout.log / native_stderr.log ネイティブコードやJVM自身の出力が書き込まれるログ SystemOut.logへの出力は、プロセスログへは出力されない(WAS V5より) JVMのverbose:gcを設定した場合、その出力はnative_stderr.logに記録。 循環はしないが、JVMログに比べファイルの増加率は小さい。 「ロギングおよびトレース」→「プロセスログ」 出力先ファイル名 冗長ガーベッジコレクションをONにすると、 GCの詳細な情報がnative_stderr.logに出力される 27 プロセスログはネイティブコードやJVM自身の出力が書き込まれるログであり、WASV5からはSystemOut.logの 出力はプロセスログには出力されなくなりました。JVMログと違い、プロセスログには循環させるための仕組みは 組み込まれていませんが、JVMログに比べ、ファイルの増加率は非常に小さいです。また、JVMのverbose:gcの 設定をした場合、GCの結果の出力はデフォルトではnative_stderr.logに記載されます。ガーベッジコレクション の状況を確認されたい場合には、当ログを確認して下さい。 27 FFDCログ(<process_name>_<timestamp>.txt) First Failure Data Capture 全てのシステムエラー情報を発生時点で自動的に記録するツール サポートセンターや開発部門が障害時に見て分析 <WAS_PROFILE_ROOT>/logs/ffdcディレクトリに出力 <process name>_exception.log サーバー起動中に発生した例外情報の統計を管理する ffdcディレクトリに作成 28 FFDCとはFirst Failure Data Captureの略で、全てのシステムエラー情報を発生時点で自動的に記録する ツールになります。このツールによって作成されたFFDCログは、サポートセンターや開発部門が障害時に確認 して分析を行うためのものです。ログはプロセス単位のディレクトリではなく、 <WAS_PROFILE_ROOT>/logs/ffdc というディレクトリに出力されます。ファイル名は<process_name>_<timestamp>.txt(例えば、 server1_5c655712_04.11.18.2327.48_0.txt)となります。また、サーバー起動中に発生した例外情報の統計を管 理する<process name>_exception.logというログファイルもffdcディレクトリに作成されます。 28 HTTPトランスポートログ http_access.log / http_error.log WebコンテナーのHTTPトランスポートに対するアクセスの記録 デフォルトでは取得されない ¾ Webサーバーを介さない場合に有用なアクセスログ 「Webコンテナトランスポートチェーン」→<Transport_name>→ 「HTTPインバウンドチャネル」 「サーバー」→「アプリケーションサーバー」→ <Server_name>→「HTTPエラーおよびNCSAアクセスロギング」 サーバーの起動時に ロギングのサービスを使用可能にする 指定したトランスポートに対して ロギングを使用可能にする 29 HTTPトランスポート・ログはアプリケーションサーバーのWebコンテナーのHTTPトランスポートに対するアクセ スを記録するログで、Webサーバーのアクセスログと同等のものになります。これはWebサーバーを介さないアク セスに対して、Webサーバーのアクセスログの代わりとなるログです。ファイル名はhttp_access.logおよび http_error.logで、JVMログと同じディレクトリに出力されます。 HTTPトランスポートのログはデフォルトでは取得されないので、取得するためには設定を変更する必要がありま す。 管理コンソールの「サーバー」→「アプリケーション・サーバー」からアプリケーションサーバーを選択し、「HTTP エラーおよびNCSAアクセス・ロギング」を選択します。 設定画面では、アクセスロギングやエラーロギングを使用 可能にする、といった項目にはチェックが付いていますが、「サーバー始動時にサービスを使用可能にする」に チェックが付いていませんので、チェックを入れます。他にもファイルの最大サイズやフォーマット(共通 (Common)or結合(Combined))、ファイル名などはここで指定します。 実際にどのHTTPトランスポートのリクエストおよびエラーをロギングするかの定義は、チャネルに対して行いま す。アプリケーションサーバーのページより、 「Webコンテナー・トランスポート・チェーン」で該当トランスポート・ チェーンを選択し、「HTTPインバウンド・チャネル」をクリックします。設定画面の一般プロパティーの下の「アク セス・ロギングおよびエラーロギングを使用可能にする」にチェックを付けると、このチャネルに対してリクエストさ れたアクセスログとエラーログが出力されます。 29 IBM保守ログ activity.log JVMログに詳細情報を追加したログ showlog(.bat)を使用して読み取る。 # <WAS_PROFILE_ROOT>/bin/showlog <WAS_PROFILE_ROOT>/log/activity.log ComponentId: Application Server (省略) TimeStamp: 2007-06-08 17:58:30.968000000 UnitOfWork: 重大度: 3 カテゴリー: INFO PrimaryMessage: CWPKI0002I: SSL サービスの初期化が正常に完了しました。 ExtendedMessage: 30 IBM保守ログのファイル名はactivity.logという名前でノード単位に作成されます。これは <WAS_PROFILE_ROOT>/logsディレクトリに出力されます。このIBM保守ログはJVMログに詳細情報を追加した ログで、showlog.bat(sh)コマンドにてactivity.logの内容を確認する事が出来ます。 30 WASのトレース trace.log WASコンポーネントの実行時の詳細な記録 障害発生箇所特定の大きな手がかり 稼動中のサーバーでも設定が可能 稼動中のサーバーでトレースの設定を行うには ランタイムタブを開き、 「ランタイム変更も構成に保管する」をチェックし、 適用する 「サーバー」→「アプリケーションサーバー」→ <Server_name>→「診断トレースサービス」 トレースに書き出すコンポーネントの指定 (詳細は次ページ) トレース機能を使用可能にする (デフォルトON) トレースの出力ファイル名、 最大ファイルサイズとヒストリーファイルの最大数 (最大サイズに達したとき、トレースファイルが新規に作成され、 ヒストリーファイル最大数の数だけ残される) ファイルのフォーマット (基本or拡張orログアナライザー) 31 トレースを用いると、アプリケーションサーバーや環境内の他のプロセスなど、WASコンポーネントの実行に関 する、より詳細情報を取得することが出来ます。トレースを使用することにより、障害発生箇所特定の大きな手が かりとなります。トレースの収集は、多くの場合テクニカルサポート担当者の依頼の元で行います。トレースは JVMログ同様にプロセス単位でディレクトリにtrace.logという名前で取得されます。また稼動中のサーバーでもト レースの取得を設定することが可能ですので、アプリケーションサーバーを止めることなくトレースを出力させる ことが出来ます。 トレースの設定画面は、管理コンソール左メニューから「サーバー」→「アプリケーションサーバー」でサーバー を選択し、「診断トレースサービス」をクリックすると表示されます。この画面からは、トレースの出力先やバッ ファーサイズ、最大ファイルサイズやフォーマットを指定することが出来ます。トレースの使用はデフォルトでも ONになっています。 31 ログ詳細レベルの変更 コンポーネント単位でトレースに出力させるものを指定 下のGUIから選択orログ詳細レベル仕様を直接入力 ログ詳細レベル仕様 <component>=<level>を 直接書き込んでも構わない ConfigErrorに対し、 レベルfine(詳細-中)を指定 *=info:ConfigError=fine: com.ibm.ws.http.*=finest 他全てのログレベルはinfo(情報) com.ibm.ws.http.*に対し、 レベルfinest(詳細-最高)を指定 32 トレース設定画面右の追加プロパティの「ログ詳細レベル仕様」をクリックすると、どのコンポーネントに対しログ またはトレースをどのレベルで取得するかを設定することが出来ます。画面下からコンポーネントを選択しクリッ クすると、レベルを選択するポップアップが現れますので、レベルを選択すると、それらが上記画面に反映され る仕組みになっています。上記例では、ConfigErrorコンポーネントのレベルを詳細-中(fine)、com.ibm.ws.http.* に対しレベルを詳細-最高(finest)を指定しています。それらの設定は上記画面に以上のように反映されます。な お、デフォルトでは全てのレベルが情報(info)になっています。 また、上記画面からコンポーネントとレベルを<component>=<level>という形で直接書き込んでも構いません。 複数のコンポーネントに対しレベルを指定したい場合は「:」で区切ります。 32 ロギングレベル OffからAllまでの12段階 trace.logに書き込まれるのは詳細-中(fine)以降 SystemOut.logログに 書き込まれる情報量が変化 トレースとしてtrace.logに 書き込まれる v6のロギングレベル 管理コンソール上の呼び方 Off オフ Fatal 致命的 Severe 重大 Warning 警告 Audit 監査 Info 状況 Config 構成 v5.1.xのトレースレベル Detail 詳細-低 Fine 詳細-中 Event Finer 詳細-高 EntryExit Finest 詳細-最高 Debug All すべて All 33 コンポーネントに対するログレベルは「オフ」から「すべて」までの12段階です。オフに設定するとログには何も 書き込まれません。レベルはオフがもっとも低く、致命的(fatal)、重大(severe)、警告(warning)、監査(audit)、情報 (info)、構成(config)、詳細-低(detail)、詳細-中(fine)、詳細-高(finer)、詳細-最高(finest)の順に高くなり、すべて (all)がもっとも高くなります。管理コンソール上の呼び名とV6でのロギングレベル、またV5のトレースレベルであ るevent、entryexit、debug、allとの対応は以上の表のようになります。 このうち詳細-低(detail)まではtrace.logには出力しません。SystemOut.logやIBM保守ログに書き込まれるレベ ルが変わります。レベルを詳細-中(fine)以上にすると、そのコンポーネントの内容がtrace.logに出力されます。 デフォルトでトレースは取得可能になっていますが、レベルが情報(info)になっているために、デフォルトでは trace.logは出力されません。 33 ロギングレベルの変更 SystemOut.log (ログレベルInfo) [05/09/16 16:12:54:781 JST] 0000000a ManagerAdmin I TRAS0017I: 開始トレース状態は *=info: com.ibm.ws.webcontainer.httpsession.SMSessionContextParameters=config:com.ibm.ws.w ebcontainer.httpsession.SessionContext=config:com.ibm.ws.webcontainer.httpsession.Sess ionMgrComponentImpl=config です。 [05/09/16 16:12:56:312 JST] 0000000a AdminInitiali A ADMN0015I: 管理サービスが初期設定されます。 [05/09/16 16:12:58:828 JST] 0000000a SystemOut O PLGC0057I: プラグイン構成サービスは正常に開始されました。 [05/09/16 16:13:18:297 JST] 0000001f VirtualHost E SRVE0164E: Web アプリケーション jvm は、 コンテキスト・ルート /JVM/* を使用しますが、これは Web アプリケーション {2} によってすでに使用中です。 Web アプリケーション {3} はロードされません。 [05/09/16 16:13:18:391 JST] 00000020 ResourceMgrIm I WSVR0049I: Default を jdbc/Default としてバインドしています [05/09/16 16:13:18:516 JST] 0000001f ApplicationMg W WSVR0101W: JvmHandsOn を開始中にエラーが発生しました SystemOut.log (ログレベルWarning) Warning以下のレベル(AuditやInfo)の情報は 書き込まれなくなる [05/09/16 16:00:02:219 JST] 0000000b SystemOut O PLGC0057I: プラグイン構成サービスは正常に開始されました。 [05/09/16 16:00:20:781 JST] 0000001b VirtualHost E SRVE0164E: Web アプリケーション jvm は、 コンテキスト・ルート /JVM/* を使用しますが、これは Web アプリケーション {2} によってすでに使用中です。 Web アプリケーション {3} はロードされません。 [05/09/16 16:00:21:266 JST] 0000001b ApplicationMg W WSVR0101W: JvmHandsOn を開始中にエラーが発生しました Fine以上にすると、SystemOut.logに加え、 trace.logが取られ、詳細な情報がTrace.logに記載される trace.log (ログレベルFine) [05/09/16 14:41:48:656 JST] 0000000a ManagerAdmin I TRAS0017I: 開始トレース状態は *=fine: com.ibm.ws.webcontainer.httpsession.SMSessionContextParameters=config:com.ibm.ws.web container.httpsession.SessionContext=config:com.ibm.ws.webcontainer.httpsession.Session SystemOut.log (Fineの内容はない) MgrComponentImpl=config です。 [05/09/16 14:41:48:656 JST] 0000000a [05/09/16 14:41:49:750 JST] 0000000a TraceNLS 1 No message text associated with com.ibm.ws.webcontainer.httpsession. key Next.clean.up.set.for.Fri.Sep.16.18:20:00.JST.2005 in bundle com.ibm.ws.ffdc.res .webcontainer.httpsession.SessionCon ources.FFDCMessages [05/09/16 14:41:50:125 JST] 0000000a [05/09/16 14:41:49:734 JST] 0000000a FFDCJanitor 1 com.ibm.ws.ffdc.FFDCJanitor setNextCle anupTime Next clean up set for Fri Sep 16 18:20:00 JST 2005 34 [05/09/16 14:41:49:750 JST] 0000000a TraceNLS 1 No m 上記例がそれぞれのレベルでのSystemOut.logとtrace.logです。警告(warning)レベルに設定すると、それ以下 のレベルの情報は書き込まれなくなりますので、監査(Audit)、情報(Info)レベルの情報はSystemOut.logには書 き込まれません。また、詳細-中(fine)の場合は、SystemOut.logに加え、さらにtrace.logがログレベルfineで書き 込まれます。 34 WASのトレースの取得例(1/2) 例:データベース接続の状況を確認する際のトレース *=info:WAS.j2c=all:RRA=all:WAS.database=all:Transaction=all WAS-DB間での問題判別に有用 ¾ ¾ ¾ 接続プールの使用状況 リソース参照の情報(アイソレーションレベル・共用接続の有無、など) トランザクションの開始・終了 trace.log コネクションオブジェクトは 接続プール内で1つはInUse。 4つはFree。 その接続は共用接続 [06/05/24 14:55:38:484 JST] 00000038 PoolManager 3 reserve() PoolManager name:jdbc/testDS PoolManager object:1590132124 Total number of connections: 5 (max/min 10/1, reap/unused/aged 180/1800/0, connectiontimeout/purge 180/EntirePool) (testConnection/inteval false/0, stuck timer/time/threshold 0/0/0, surge time/connections 0/-1) Shared Connection information (shared partitions 200) com.ibm.ws.LocalTransaction.LocalTranCoordImpl@7f957d83;RUNNING; MCWrapper id 20fb3d86 Managed connection WSRdbManagedConnectionImpl@2ec3fd81 State:STATE_ACTIVE_INUSE Total number of connection in shared pool: 1 Free Connection information (free distribution table/partitions 5/1) (2)(0)MCWrapper id 7828fd84 Managed connection WSRdbManagedConnectionImpl@750bfd86 State:STATE_ACTIVE_FREE (2)(0)MCWrapper id 423e7d89 Managed connection WSRdbManagedConnectionImpl@41f7fd89 State:STATE_ACTIVE_FREE (2)(0)MCWrapper id 78c57d87 Managed connection WSRdbManagedConnectionImpl@4b82bd87 State:STATE_ACTIVE_FREE (2)(0)MCWrapper id 2839bd84 Managed connection WSRdbManagedConnectionImpl@5e253d86 State:STATE_ACTIVE_FREE Total number of connection in free pool: 4 UnShared Connection information No unshared connections 35 ここでは実際にトレースを取得した際のサンプルを紹介します。 発生した問題に対してどのようなトレースを取得するかは、サポートセンターの指示や、先述した MustGatherのサポートサイトなどを参考にして取得を行います。上記はデータベース接続の状況を確認 する際に有用な、j2cに関するトレースを取得した例になります。このトレース結果から、接続プールの使用 状況や、アイソレーションレベルや共用接続の有無といったリソース参照の情報、トランザクションに関す る情報などがわかりますので、WASとデータベースとの間で問題が発生した際には、問題判別のために 非常に有用です。 以下は、ログレベルの設定が可能なコンポーネントとその中のサブコンポーネントの一覧になります。 ・WebSphere V6.x Trace Groups and Components trace specification strings http://www1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=Trace&q2=v6&uid=swg21199169&loc=en _US&cs=utf-8&lang=en 以下は、MustGatherのページになります。 ・MustGather:Read first for all WebSphere Application Server products http://www-1.ibm.com/support/docview.wss?rs=180&uid=swg21145599 35 WASのトレースの取得例(2/2) 例:重要なアプリケーション・アクティビティーのロギング/トレース *=info:WAS.clientinfopluslogging=all アプリケーションの問題判別に有用 ¾ ¾ trace.log ¾ 実行された SQL ストリング(下記例) トランザクションの開始、コミット、およびロールバック。 EJB 呼び出し (Create、Remove、findByPrimaryKey など) [08/06/16 20:37:39:484 JST] 00000040 clientinfoplu > getConnection Entry WSRdbManagedConnectionImpl@6bf26bf2 <null> com.ibm.ws.rsadapter.spi.WSConnectionRequestInfoImpl@6b086b08 [08/06/16 20:37:39:484 JST] 00000040 clientinfoplu 3 setClientInformation(Properties props,WSRdbManagedConnectionImpl mc, boolean explicitCall) with sqlConn <null> WSRdbManagedConnectionImpl@6bf26bf2 false com.ibm.db2.jcc.c.dc@4b004b0 [08/06/16 20:37:39:484 JST] 00000040 clientinfoplu < getConnection Exit com.ibm.ws.rsadapter.jdbc.WSJccSQLJConnection@58945894 [08/06/16 20:37:39:500 JST] 00000040 clientinfoplu > prepareStatement Entry com.ibm.ws.rsadapter.jdbc.WSJccSQLJConnection@58945894 SELECT * FROM STAFF WHERE ID=? TYPE FORWARD ONLY (1003) CONCUR READ ONLY (1007) [08/06/16 20:37:39:500 JST] 00000040 clientinfoplu < prepareStatement Exit com.ibm.ws.rsadapter.jdbc.WSJccPreparedStatement@414c414c 36 続いて実際にトレースを取得した際のサンプルを紹介します。 上記はデータベース接続の状況を確認する際に有用な、j2cに関するトレースを取得した例になります。 このトレース結果から、接続プールの使用状況や、アイソレーションレベルや共用接続の有無といったリ ソース参照の情報、トランザクションに関する情報などがわかりますので、WASとデータベースとの間で問 題が発生した際には、問題判別のために非常に有用です。 36 trace解析ツール - Trace and Request Analyzer GUIベースのTrace解析ツール 以下からフリーで入手可能 ¾ 解析 http://www.alphaworks.ibm.com/tech/tra 以下のコマンドにて起動し、ファイルを選択する java –jar <HRA_ROOT>¥tra13.jar ¾ ¾ ¾ WebSphere Trace HTTP Plugin Trace WebSphere MQ JMS Trace 37 trace解析ツールにIBM Trace and Request Analyzer for WebSphere Application Serverがあります。 Trace and Request AnalyzerはJavaで書かれたtrace解析用のツールであり、Javaが動作できる環境であれ ば、全てのプラットフォームで利用出来ます。操作はすべてGUIから実行できるのが特徴です。 Trace and Request Analyzerの起動は、以下のコマンドを実行します。 Trace and Request Analyzer起動 後、ファイルを選択して下さい。 #java –jar <TRA_ROOT>¥tra13.jar (<TRA_ROOT>はTrace and Request Analyzerをインストールしたディ レクトリを指します) ・WebSphere Trace ・HTTP Plugin Trace ・WebSphere MQ JMS Trace 37 JDBCトレースログ JDBCトレースログとは 効果的なケース JDBCドライバーが出力するトレース アプリケーションとデータベース間のデータの流れを確認できる ① ② ③ ④ ⑤ SQLExceptionの原因を探る ドライバーの内部エラーの原因を探る JDBC APIの実行時刻とreturn時刻を知る パラメーターマーカーへの設定値を確認する 分離レベルを確認する 例1:分離レベルを確認する トレースに出力されていたTransactionIsolationにより確認する(0=None = UR, 2 = CS, 4 = RS, 8 = RR) [省略] setTransactionIsolation (2) called 例2:JDBC APIの実行時刻とreturn時刻を知る calledとreturnedを抽出する 更に、ネットワークに要した時間、Driver内の処理時間を算出できる [省略][Time:2007-05-17-14:05:51.794][省略] executeUpdate (insert into Table (sampleColumn) values (1)) called [省略][Time:2007-05-17-14:05:51.888][省略] executeUpdate () returned [省略][SystemMonitor:stop] core: 94.63ms | network: 48.102ms | server: 0.0ms 38 JDBCトレースログとは、JDBCドライバーが出力するトレースになり、ドライバーのプロパティの設定値や実行し ているSQLステートメント・JDBC API等、アプリケーションとデーターベース間のデータの遣り取りの流れを確認 する事が出来ます。JDBCトレースログを取得する効果的なケースとしては、次が挙げられます。 ① SQLExceptionの原因を探る ② ドライバーの内部エラーの原因を探る ③ JDBC APIの実行時刻とreturn時刻を知る ④ パラメーターマーカーへの設定値を確認する ⑤ 分離レベルを確認する ・分離レベルとは 実行するトランザクションが、RDBMSによってどの程度のデータ保証すべきかを定義したもの。 UR: Uncommitted Read(未コミット読み取り) CS: Cursor Stability(カーソル固定) RS: Read Stability(読み取り固定) RR: Repeatable Read(反復可能読み取り) 38 JDBCトレースログの設定方法 設定方法 管理コンソールより、データソースのカスタムプロパティに設定 その他、便利なプロパティ ¾ ¾ ¾ traceLevel、traceFile traceFileAppend プロパティの指定 (デフォルト:false) trueに設定することにより、トレースファイルが上書きされず、ログが累積される。 traceDirectory プロパティの指定 (デフォルト:未設定) 当プロパティを設定することにより、スレッド毎にトレースファイルを取得できる。 設定後、アプリケーション・サーバーの再起動を実施 トレースレベルの指定方法 複数のトレース・レベル・オプションを同時に取得可能 (例) CONNECTION_CALLSとSTATEMENT_CALLSのトレースを取得する場合 1 + 2 = 3 を指定 特定のトレース・レベル・オプション以外を取得可能 39 管理コンソールの「リソース」 →「データ・ソース」 →「カスタム・プロパティ」を選択し、traceLevelとtraceFileを選 択します。 指定可能なtraceLevelについては、以下のDB2のInfoCenterをご参照下さい。全て取得する事も、複数のト レースレベルオプションを取得する事も、特定のトレースレベルオプション以外を取得する事も出来ます。 traveFileについては、任意の出力場所を指定して下さい。traceFileAppendをtrueに設定する事により、トレース ファイルが上書きされずログが累積させます。また、traceFileの設定では、全てのスレッドがひとつのファイルに 書き込まれますが、traceDirectoryを設定することによりスレッド毎にトレースファイルを取得する事が出来ます。 ・DB2V9 - InfoCenter - 「IBM DB2 Driver for JDBC and SQLJ のプロパティー」 http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.java.doc/doc/rj vdsprp.htm com.ibm.db2.jcc.DB2BaseDataSource.TRACE_NONE= 0x0 (= 0) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTION_CALLS= 0x1 (= 1) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_STATEMENT_CALLS= 0x2 (= 2) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_CALLS= 0x4 (= 4) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRIVER_CONFIGURATION= 0x10 (= 16) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_CONNECTS= 0x20 (= 32) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DRDA_FLOWS= 0x40 (= 64) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_RESULT_SET_META_DATA= 0x80 (= 128) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_PARAMETER_META_DATA= 0x100 (= 256) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DIAGNOSTICS= 0x200 (= 512) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SQLJ= 0x400 (= 1024) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_XA_CALLS= 0x800 (= 2048) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_META_CALLS= 0x2000 (= 8192) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_DATASOURCE_CALLS= 0x4000 (=16384) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_LARGE_OBJECT_CALLS= 0x8000 (=32768) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_SYSTEM_MONITOR= 0x20000 (=131072) com.ibm.db2.jcc.DB2BaseDataSource.TRACE_ALL= 0xFFFFFFFF (= -1) 39 クラス・ローダーの問題判別 (1/2) クラス・ローダー・ビューワー クラス・ローダーの階層構造や各クラス・ローダー毎のクラスパス、各クラス・ロー ダーがロードしたクラスを確認可能 管理コンソールに組み込まれたWASの基本機能 クラス・ローダーがロードしたクラスを確認するためには、事前にアプリケーショ ン・サーバーでクラス・ローダー・ビューアー・サービスを有効にする必要あり クラス・ローダーはディスク上のクラスファイルを メモリー上にロードする クラス・ローダーは対象クラス・パスごとに複数存在 メモリー クラス・ローダーの階層構造を表示 クラス・パス等の情報のファイル保存も可能 Javaクラス・ローダー Class Hello WebSphere拡張クラス・ローダー ディスク アプリケーション・クラス・ローダー Hello.class WARクラス・ローダー 40 クラスローダーに関連する問題が発生した際に、非常に有用となるツール・設定を紹介させて頂きます。 クラスローダーの階層構造や各クラスローダ毎のクラスパス、特定のクラスローダーによってロードされたク ラス等を確認して下さい。 ①クラス・ローダー・ビューワー 管理コンソールより「トラブルシューティング」-「クラス・ローダー・ビューワー」を選択して下さい。 40 クラス・ローダーの問題判別 (2/2) クラス・ローダーのトレース設定 com.ibm.ws.classloader.*=all [07/07/12 22:11:20:401 JST] 00000018 JarClassLoade > JarClassLoader Entry [07/07/12 22:11:20:401 JST] 00000018 ReloadableCla > createLoader Entry [07/07/12 22:11:20:403 JST] 00000018 CompoundClass > CompoundClassLoader this= com.ibm.ws.classloader.CompoundClassLoader@50d250d2 Local ClassPath:Delegation Mode: PARENT_LAST Entry trace.log クラス・ローダーに関連するJVM引数 -verbose:class ¾ ¾ ¾ 管理コンソールの冗長クラス・ロードと同一の設定 クラスローダーが検索したクラスパスの階層構造を表示 特定のクラスのみ表示させる場合は、-Dibm.cl.verbose=myPackage.myClass native_stderr.log class load: com/ibm/ws/classloader/WsClassLoader class load: com.ibm.ws.classloader.WsClassLoader from: file:/usr/IBM/WebSphere/AppServer1/lib/bootstrap.jar class load: com/ibm/ws/bootstrap/ExtClassLoader class load: com.ibm.ws.bootstrap.ExtClassLoader from: file:/usr/IBM/WebSphere/AppServer1/lib/bootstrap.jar -verbose:dynload ¾ ¾ ¾ クラス名とパッケージ名を表示 クラスのサイズとクラスのロードに要した時間を表示 Jarファイル名をフルパスで表示 native_stderr.log <Loaded org/apache/tools/ant/BuildListener> < Class size 363; ROM size 512; debug size 0> < Read time 4 usec; Load time 23 usec; Translate time 9 usec> 41 ②クラス・ローダーのトレース設定 管理コンソールより「トラブルシューティング」-「ログおよびトレース」-「ログ詳細レベルの変更」を選択して下さい。 ③クラス・ローダーに関連するJVM引数 ・-verbose:class 管理コンソールより、「サーバー」-「アプリケーションサーバー」-「Javaおよびプロセス管理」-「プロセス定義」「Java 仮想マシン」にて「冗長クラス・ロード」をONにして下さい。もしくは、汎用JVM引数に、-verbose:classと入 力して下さい。また、特定のクラスのみを表示させたい場合には、-Dibm.cl.verboseにて指定して下さい。 ・-verbose:dynaload 管理コンソールより、「サーバー」-「アプリケーションサーバー」-「Javaおよびプロセス管理」-「プロセス定義」「Java 仮想マシン」にて「汎用JVM引数」に、-verbose:classと入力して下さい。 41 IHS / WebSphere Application Server問題判別 JVM情報収集・問題判別 ガーベッジコレクション(GC) verbose:gc verbose:gcの出力(GC) verbose:gcの出力(Compaction) verbose:gcの出力(HeapExpansion) verbose:gcの出力(OutOfMemory) verbose:gcの解析ツール GCトレース JavaDump JavaDump出力内容の設定 JavaDumpの取得情報 JavaDumpの出力(再帰呼び出し) JavaDumpの出力(Lock) JavaDumpの出力(Deadlock) JavaDumpの解析ツール HeapDump HeapDumpの出力 HeapDump解析ツール JavaDump、HeapDumpに関する環境変数 その他JavaDump、HeapDumpに関する環境エントリー 42 42 ガーベッジコレクション(GC) (1/2) JVMは不要になったオブジェクトをメモリ領域から開放 開発者のメモリ管理を軽減、メモリリークやランタイムエラーの回避 Object Allocation heap STEP1 Object Allocation オブジェクトの割り当て オブジェクト(使用中) オブジェクト(使用されていない) STEP2 Garbage Collection GC発生のトリガー ¾ ¾ Java Heap領域へのオブジェクト割り当 てが失敗した場合 System.gc()が呼び出された場合 GC処理のステップ ① Mark Phase ② Sweep Phase ③ Compaction Phase(optional) STEP1 heap 走査 GC発生中は、GC終了まで、全て のアプリケーション・スレッドは停止 状態となる 走査 × 走査 STEP2 ① Allocation Failure STEP2 ② heap 除 削 除 削 除 削 ※ Object Allocationのためのスペースが無くなる までSTEP1~STEP2を繰り返す heap STEP2 ③ 43 ガーベッジコレクションとは、不要になったメモリ上のオブジェクトを領域から開放するJVMの機能で、こ れにより開発者のメモリ管理の手間を軽減し、不要なオブジェクトがメモリ上に残ることによるメモリリークや、 参照されるオブジェクトの消去によるランタイムエラーを回避することが可能となります。 ガーベッジコレクションの流れは以下のようになります。 STEP1. JVMがヒープにオブジェクトを割り当てます。 STEP2. JVMがヒープにオブジェクトを割り当てられなかったとき、また明示的にSystem.gc()を呼び出した ときにガーベッジコレクションが実行されます。 ①Mark phaseでは、使用中のオブジェクトを走査(使用中のオブジェクトのマーク付け)します。 ②Sweep phaseでは、未使用のオブジェクトを除去します。 ③Compaction phaseでは、ヒープの空き領域を整理をします。Compaction phaseは時間のかかる処理で すのでJVMは可能な限り、Compactionを行いません。 基本的なフローは上記処理の繰り返しですが、それでもオブジェクトに割り当てることができないときは、 ヒープ領域の拡張が起こります。また、GCの実行中は、全てのアプリケーション・スレッドは停止状態となり ます。(例外として、GCポリシーの選択により、Mark phaseにてアプリケーション・スレッドとGC・スレッドを同 時並行で動かすことも出来ます。) 43 ガーベッジコレクション(GC) (2/2) -Xmx -Xms STEP3 Heap Expansion GC処理後に十分な空きスペースが 無いとき、heapの拡張が行われる heap拡張発生のトリガー ¾ ¾ ¾ GCを実施しても要求されたリクエスト・オ ブジェクト分の空き領域が確保できない 場合 GCを実施しても空き領域の割合が-Xminf (デフォルト:0.3)値よりも小さかった場合 GC時間が全体の13%を上回った場合 heap拡張発生中は全てのアプリケー ション・スレッドは停止状態となる 逆に必要以上の空きがあれば、 Heap Shrinkageが発生してheapが縮 小される heap STEP1 × Allocation Failure 空き領域 < 30% heap STEP2 GC発生するが、必要なサイズの空 き領域を確保できない heap heap拡張 STEP3 -Xminf分の空き領域が確保できる 程度に拡張 heap STEP1 44 ガーベッジコレクションの流れは以下のようになります。 (STEP1. JVMがヒープにオブジェクトを割り当てます。) (STEP2. JVMがヒープにオブジェクトを割り当てられなかったとき、また明示的にSystem.gc()を呼び出した ときにガーベッジコレクションが実行されます。) STEP3. ガーベッジコレクションが行われた後も、ヒープに十分な空きスペースが確保できなかった場合 に、ヒープ領域を拡張して、オブジェクトを割り当てます。 具体的には、heap拡張発生のトリガーには、次の3つの場合があります。また、ヒープの拡張中は、全て のアプリケーション・スレッドは停止状態となります。なお、ヒープ領域に必要以上の空きがある場合には 逆にHeap Shrinkageというヒープの縮小が行われます。 ・GCを実施した後も、要求されたリクエスト・オブジェクト分の空き領域が確保できない場合 ・GCを実施しても空き領域の割合が、-Xminf (GC後の最小の空き領域の割合。デフォルト:0.3) 値よりも 小さかった場合 ・GC時間が全体の13%を上回った場合 (JVMが起動してからのトータルの時間で計算します) 44 verbose:gc ガーベッジコレクションの実行状況を記録 native_stderr.logに出力 汎用JVM引数に -Xverbosegclog:<path>/<filename> で変更可能 デフォルトはOFF、管理コンソールにて設定 冗長ガーベッジ・コレクションにチェック or –verbose:gc アプリケーションサーバー選択し、 「Javaおよびプロセス管理」→「プロセス定義」 →「Java仮想マシン」 冗長ガーベッジ・コレクションにチェック。 もしくは「汎用JVM引数」に-verbose:gc入力 ファイルの出力先をnative_stderr.logから変 更したい場合もここで指定する 45 verbose:gcとはガーベッジコレクションの実行状況をトレースし、native_stderr.logに出力するものです。こ れを参照することは問題判別のみならずパフォーマンスチューニングにおいても有用です。ただし、デ フォルトではOFFになっているためにverbose:gcを有効にするためには設定が必要です。管理コンソール から「Java仮想マシン」設定画面に移動し、冗長ガーベッジコレクションにチェックを入れるか、汎用JVM引 数の欄に-verbose:gcと入力します。また、出力先はnative_stderr.logですが変更することも可能です。そ の際は同じ画面の汎用JVM引数の欄に-Xverbosegclog:<path>/<filename>という形でファイル名のフルパ スを記述します。 45 verbose:gcの出力(GC) ガーベッジコレクション発生時 native_stderr.log GCの発生回数 Allocationに 必要な容量 前回のFailure発生からの時間 <af type="tenured" id="837" timestamp="Wed May 23 16:11:47 2007" intervalms="3490.591"> <minimum requested_bytes="168" /> <time exclusiveaccessms="0.100" /> <tenured freebytes="889032" totalbytes="134217728" percent="0" > <soa freebytes="0" totalbytes="131533824" percent="0" /> <loa freebytes="889032" totalbytes="2683904" percent="33" /> </tenured> <gc type="global" id="837" totalid="837" intervalms="3490.817"> <refs_cleared soft="0" threshold="32" weak="1" phantom="0" /> <finalization objectsqueued="1" /> <timesms mark="61.120" sweep="3.331" compact="0.000" total="64.569" /> <tenured freebytes="87957456" totalbytes="134217728" percent="65" > <soa freebytes="87068424" totalbytes="131533824" percent="66" /> <loa freebytes="889032" totalbytes="2683904" percent="33" /> </tenured> </gc> <tenured freebytes="87956616" totalbytes="134217728" percent="65" > <soa freebytes="87067584" totalbytes="131533824" percent="66" /> <loa freebytes="889032" totalbytes="2683904" percent="33" /> </tenured> <time totalms="64.884" /> </af> このAllocationFailureにかかった時間 GC後の容量 46 以上はガーベッジコレクションが発生したときのverbose:gcの出力例です。ガーベッジコレクションはJVM がオブジェクトをヒープに割り当てることができなかったときに発生します。この状態をAllocation Failure(AF)と言います。また、Tenuredとはold領域の事であり、この出力例では記述されておりませんが、 nurseryはnew領域を示しております。 1行目:afがAllocation Failureの発生、idの数字がJVM起動後にAFが発生した回数を示しています。 Intervalms=3490.591が前回のAllocationFailureからの経過時間を示しています。上記の例では、3490ms 後に今回(837回目)のAllocation Failureが発生したことを示しています。 2行目:requested_bytes=168byteがAllocationに必要な容量になります。 11行目:このGCのmarkフェーズ(オブジェクトのマーキング)、sweepフェーズ(不要オブジェクトの開放)、 compact(空き領域の整理)の所要時間およびGC全体の所要時間を示しています。上記の例では compactの作業は行っていません。 17行目:GC後の容量を示しています。 21行目:今回のAllocation Failureに要した合計の時間が記録されます。 46 verbose:gcの出力(Compaction) Compaction発生時 移動したオブジェクトの数とサイズ、Compactionの理由 native_stderr.log <af type="tenured" id="151" timestamp="Wed May 23 14:56:59 2007" intervalms="181.001"> <minimum requested_bytes="65536" /> <time exclusiveaccessms="0.117" /> <tenured freebytes="63485528" totalbytes="134217728" percent="47" > <soa freebytes="63485528" totalbytes="134217728" percent="47" /> <loa freebytes="0" totalbytes="0" percent="0" /> </tenured> <gc type="global" id="151" totalid="151" intervalms="181.206"> <compaction movecount="689474" movebytes="39607992" reason="compact to meet allocation" /> <refs_cleared soft="0" threshold="32" weak="1" phantom="0" /> <finalization objectsqueued="0" /> <timesms mark="62.511" sweep="4.676" compact="167.126" total="234.445" /> <tenured freebytes="94606872" totalbytes="134217728" percent="70" > <soa freebytes="93264920" totalbytes="132875776" percent="70" /> <loa freebytes="1341952" totalbytes="1341952" percent="100" /> </tenured> </gc> <tenured freebytes="94541336" totalbytes="134217728" percent="70" > <soa freebytes="93199384" totalbytes="132875776" percent="70" /> <loa freebytes="1341952" totalbytes="1341952" percent="100" /> </tenured> <time totalms="234.768" /> </af> 47 GC後の容量 ガーベッジコレクションを実行しても開き領域が確保できない場合、Compactionが発生します。 Compactionはメモリ上に確保されたオブジェクトの位置を動かし参照を変更しなければいけないため、 markフェーズやsweepフェーズよりも多くの時間を要し、その間アプリケーションは停止させなくてはいけな いため、JVMはできる限りCompactionは行いません。 (GCの実行毎にcompactionが実行されるわけではございません。) 上記はCompactionが発生したときのverbose:gcの出力例になります。Compactionによって移動したオブ ジェクトの数とサイズ、Compactionの理由、増加された容量を示しています。以上の例では、 689474個、 計39607992 byteのオブジェクトを移動させた事を示しています。 また、soaとはSmall Object area、loaとはLarge Object areaの略になります。デフォルトでは、64KB以上 のオブジェクトが割り当てられた場合、もしくはsoaにオブジェクトが割り当てられなかった場合にloaにオブ ジェクトが割り当てられます。loaでは、複数スレッドにより同時にオブジェクトを割り当てる事が出来ないの が、注意点になります。 47 verbose:gcの出力(HeapExpansion) HeapExpansion発生時 拡張できた容量と最終的な容量、理由 native_stderr.log <af type="tenured" id="880" timestamp="Wed May 23 16:15:49 2007" intervalms="15.194"> <minimum requested_bytes="13571688" /> <time exclusiveaccessms="1.106" /> <tenured freebytes="18640136" totalbytes="134217728" percent="13" > <soa freebytes="11929352" totalbytes="127506944" percent="9" /> <loa freebytes="6710784" totalbytes="6710784" percent="100" /> </tenured> <gc type="global" id="880" totalid="880" intervalms="15.413"> <expansion type="tenured" amount="6989824" newsize="141207552" timetaken="0.635" reason="insufficient free space following gc" /> <refs_cleared soft="0" threshold="32" weak="0" phantom="0" /> <finalization objectsqueued="0" /> <timesms mark="174.618" sweep="1.148" compact="0.000" total="176.527" /> <tenured freebytes="55934424" totalbytes="141207552" percent="39" > <soa freebytes="47462360" totalbytes="132735488" percent="35" /> <loa freebytes="8472064" totalbytes="8472064" percent="100" /> </tenured> </gc> <tenured freebytes="42362736" totalbytes="141207552" percent="30" > <soa freebytes="33890672" totalbytes="132735488" percent="25" /> <loa freebytes="8472064" totalbytes="8472064" percent="100" /> </tenured> <time totalms="177.862" /> </af> 48 さらにCompactionでも充分な容量が確保できない場合、ヒープ領域の拡張が行われます。ヒープの拡 張が行われるのは、容量が確保できない場合以外にも、空き領域が最小空き領域として指定した値(デ フォルト0.3)よりも少なくなった場合、GCの総実行時間がシステム起動からの経過時間の13%を越えた場 合に発生します。 上記は、HeapExpansionが発生したときのverbose:gcの出力例です。GC後に十分な領域を確保すること が出来ず、ヒープの拡張を試みています。最終的に6989824 byteの領域が拡張され、全体として領域が 141207552byteになったことを示しています。また、JDK5.0より、HeapExpansionの理由が記録されるように なりました。(例:reason="insufficient free space following gc" ) 48 verbose:gcの出力(OutOfMemory) OutOfMemory発生時 SnapDump、HeapDump、JavaDump が出力されたことを示す native_stderr.log JVMDUMP006I Processing Dump Event "uncaught", detail "java/lang/OutOfMemoryError" - Please Wait. JVMDUMP013I Processed Dump Event "uncaught", detail "java/lang/OutOfMemoryError". JVMDUMP007I JVM Requesting Snap Dump using '/usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/Snap0003.20070523.161857.536664.trc' JVMDUMP010I Snap Dump written to /usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/Snap0003.20070523.161857.536664.trc JVMDUMP007I JVM Requesting Heap Dump using '/usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/heapdump.20070523.161857.536664.phd' JVMDUMP010I Heap Dump written to /usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/heapdump.20070523.161857.536664.phd JVMDUMP007I JVM Requesting Java Dump using '/usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/javacore.20070523.161857.536664.txt' UTE436: Unable to get formatString for mm .14045 component not registered JVMDUMP010I Java Dump written to /usr/IBM/WebSphere/AppServer1/profiles/AppSrv01/javacore.20070523.161857.536664.txt JVMDUMP013I Processed Dump Event "uncaught", detail "java/lang/OutOfMemoryError". verbose:gcからメモリの圧迫の様子がわかる メモリが圧迫されているときの特徴 ¾ ¾ GCの発生間隔が短い 1回のGCの開放量が少ない 49 それでも空き領域が確保できないと、やがてメモリ領域を使い果たし、OutOfMemoryとなり、JVMがダウ ンしてしまいます。上記はOutOfMemoryが発生したときのverbose:gcの出力例です。JVMがSnapDumpと HeapDump、JavaDumpの出力を要求し、指定された位置に出力されたことがわかります。なお OutOfMemory発生時は、SnapDumpもHeapDump、JavaDumpも自動で出力されるようにデフォルトで設定 されています。 また、verbose:gcの出力結果より、メモリリークの有無を確かめることが可能です。メモリが圧迫されると、 GCの発生間隔が短くなる、1回のGCの開放量が小さくなる、といった現象が見られます。verbose:gcを取 得するとGCの発生間隔やメモリの開放量が確認できますので、メモリに問題があると思われる場合に verbose:gcは非常に有用です。 49 verbose:gc解析ツール - PMAT GUIベースのverbose:gc解析ツール 以下からフリーで入手可能 http://www.alphaworks.ibm.com/tech/pmat 以下のコマンドにて起動し、native_stderr.logファイルを選 択する 解析 java –jar <PMAT_ROOT>¥ga16.jar ISAを導入していれば、ISAプラグインとしてツールから使 用可能(事前にプラグイン追加しておく必要がある) 50 verbose:gc解析ツールの一つにPMAT (IBM Pattern Modeling and Analysis Tool for java Garbage Collector)があります。PMATはJavaで書かれたverbose:gc解析用のツールであり、操作はすべてGUIから 実行できるのが特徴です。 PMATは単体で使用する場合、起動は以下のコマンドを実行します。PMAT起動後、native_stderr.log ファイルを選択して下さい。(<PMAT_ROOT>はPMATをインストールしたディレクトリを指します。) #java –jar <PMAT_ROOT>¥ga16.jar また、PMATはISAのプラグインとして使用することも可能です。この場合は、事前にISAにPMATをプラグ イン追加しておくことで、ISAのツールから起動することができます。 PMATについての詳細は下記URLをご参照ください。 - IBM Pattern Modeling and Analysis Tool for Java Garbage Collector http://www.alphaworks.ibm.com/tech/pmat 50 PMATを用いたverbose:gc解析 解析 統計情報 推奨チューニング グラフ表示も可能 51 PMATを起動してnative_stderr.logを読み込ませると上記のような概要画面が表示されます。ここではGC やAllocation Falureの発生回数などの概要に加え、Recommendationsには現状で推奨されるチューニン グ内容も表示されます。また、「Graph View」を選択することにより、ヒープの使用状況やGCの発生状況な ど、確認したい項目をグラフ化することができます。 51 GCトレース GCトレースを利用することで、GCの挙動を更に詳細に把握 できる 出力される量が膨大で、出力内容の絞込みが必要 設定方法 ¾ JVM引数に以下のオプションを指定する -Xtgc:<オプション名> 例:-Xtgc:backtrace,compaction ログの出力先 ¾ ¾ デフォルト:各AppServerのnative_stderr.log 出力場所は変更可能 52 GCトレース(-Xtgc:<オプション名>)とは、verbose:gcよりも更に詳細にガーベッジコレクションの実行状況をト レースし、native_stderr.logに出力するものです。これを参照することは問題判別のみならずパフォーマンス チューニングにおいても有用です。ただし、膨大な量が出力されるので、出力内容の絞込みが重要です。Xtgcのオプションについては、次ページを参照して下さい。 52 GCトレースのオプション オプション 内容 サンプル出力 backtrace GCのトリガーとなったスレッド情報 "main" (0x0003691C) compaction compactionに関連する情報 Compact(3): reason = 7 (forced compaction) Compact(3): Thread 0, setup stage: 8 ms. Compact(3): Thread 0, move stage: handled 42842 objects in 13 ms, bytes moved 2258028. concurrent Concurrent Mark情報 <CONCURRENT GC BK thread 0x0002645F (started after GC(5)) traced 25435> dump Sweepフェーズ情報 <GC(4) 13F9FE44 freelen=x000002C4 -- x00000038 spec/jbb/Stock> excessiveGC GCのサイクルの統計情報 excessiveGC: gcid="10" intimems="122.269" outtimems="1.721" percent="98.61" averagepercent="37.89" freelist 前回のGCからのfreelistとallocation の統計情報 <Alloc TLH: count 3588, size 3107, discard 31> < non-TLH: count 6219, search 0, size 183, discard 0> parallel Parallel Mart、Parallel Sweep情報 Mark: busy stall tail acquire release 0: 30 30 0 0 3 1: 53 7 0 91 94 references GC中の活動情報 enqueuing ref sun/misc/SoftCache$ValueCell@0x1564b5ac >0x1564b4c8 scavenger Scavenger GCの情報 {SCAV: | class | instances of age 0-14 in semi-space terse GC前後のheapの内容をdump *DH(1)* 230AD778 a x0000001C java/lang/String *DH(1)* 230AD794 a x00000048 char[] 53 上記表は、GCトレースのオプションになります。JVMの各サブコンポーネントが出力可能なトレースは、取得す る内容に応じて複数のオプションに分かれています。この中からひとつのオプションを選択してトレースを出力 するだけでも非常に大きなサイズのログが出力されるため、必要なオプションのみを必要な時にだけ取得するよ うに心がける必要があります。 53 JavaDump (1/3) Javaプロセスが異常終了したとき、または明示的に命令を 送った時に出力されるテキストベースの診断情報 Javacore、Javaスレッドのダンプファイル、スレッドダンプとも呼ばれている。 遮断直前のJVMの状態についての情報を出力 取得できる情報は稼動プラットフォームに依存 ¾ ダンプから取得できる情報例: z z z z z z OS関連情報 環境変数 スレッド情報 native stack lock情報 memory情報 54 JavaDumpは、ある時点におけるJVMのコンポーネントの状態を示すダンプ情報になります。JavaDumpは Javacoreとも呼ばれ、WebSphere Application ServerのInfoCenterではJavaスレッドのダンプファイル、ス レッドダンプとも表記されるが、どれも同一のダンプを示しています。JavaDumpはJVMプロセスがクラッシュ 等で遮断された場合やユーザーが外部から明示的に出力命令を送ることで出力されます。JVMプロセス が遮断された場合は、OSが命令を送って出力されます。デフォルトではJavaDumpの設定はONであり、 JVMプロセスがクラッシュしたり、JVMが明示的な出力指令を受け取ると自動的にJavaDumpを生成します。 JavaDumpは、JVMの異常終了やヒープが使い果たされたときに生成されます。命令が送られると、その 瞬間にJVMが持っている情報をテキストファイルとして出力します。JavaDumpの出力先はJVMの作業ディ レクトリ(デフォルトは環境変数USER_INSTALL_ROOT)になり、ファイル名はOSによって上記のように異な ります。CPU_TIMEは1970年1月1日からの経過時間を秒単位で示したものになります。また、出力先ディ レクトリはプロセス定義の環境エントリーIBM_JAVACOREDIRの設定により変更することも可能です。 54 JavaDump (2/3) JavaDumpの生成条件 JVMがダウン →デフォルト設定では、ダウンした際に自動的に出力。 ¾ ¾ JVMが異常終了した場合 OutOfMemoryエラーが発生した場合 z 環境変数IBM_JAVADUMP_OUTOFMEMORY=FALSEにより出力しないことも可能 ユーザーがJavaプロセスに対して明示的に命令を発行して生成 ¾ ユーザーがOSのコンソールから明示的に命令を送信して取得 z z ¾ kill -3 <PID> kill –QUIT <process id> WASの管理ツール(wsadmin)により取得 wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=server01,*] wsadmin>$AdminControl invoke $jvm dumpThreads wsadmin>jvm = AdminControl.completeObjectName('type=JVM,process=server01,*') wsadmin>AdminControl.invoke(jvm, 'dumpThreads') ¾ アプリケーションからstatic com.ibm.jvm.Dump.JavaDump()を実行 z static com.ibm.jvm.Dump.JavaDump() 55 JavaDumpの生成条件をJVMプロセスのダウンのケースと明示的に出力させるケースとに分けてご説明さ せて頂きます。 JVMプロセスがダウンした場合、デフォルト設定では自動的にJavaDumpが出力されます。また、ユーザ が意図的にJavaDumpを出力させることも可能です。AIXやLinuxのkillコマンドを用いて取得したいプロセ スIDにkill –3 、kill –QUITのコマンドを送信することにより生成する方法、WASのwsadminを使用して生成 する方法、アプリケーション内でstaticメソッドcom.ibm.jvm.Dump.JavaDump()を呼び出すことで生成する方 法があります。 WASに関連する問題が発生し、ログやトレースの解析では判明できない場合は、WASを再起動される 前にJavaDumpを出力させておくと、今後の解析に役立つ事がございます。 55 JavaDump (3/3) JavaDump取得のための設定 デフォルトでONのため特に設定は必要ない。 OFFに設定することも可能 ¾ JavaDumpの出力先 以下の存在の有無と書き込み属性を上の候補からチェックし、書き込み可能 な場所に出力 ¾ ¾ ¾ ¾ ¾ 環境エントリー: DISABLE_JAVADUMP=trueと指定することでOffの設定となる 環境エントリー: IBM_JAVACOREDIR の場所 JVMプロセスのカレント・ワーキング・ディレクトリ(デフォルトは USER_INSTALL_ROOT ) (setされている場合)環境変数: TMPDIR の場所 /tmpディレクトリ、または(Windows環境のみ)環境変数: TEMP の場所 (Windows環境のみ)上記のどの場所も不可能だった場合はSTDERRへ出力 JavaDumpファイル名 [Windows & Linux] [AIX] javacore.YYYYMMDD.HHMMSS.PID.txt javacorePID.TIME.txt 56 JavaDumpは、以下の環境エントリーの設定、または実行時のJVM引数の設定によりOFFにすることも可 能ですが、特別な理由がない限りOFFしないで下さい。 環境エントリー:DISABLE_JAVADUMP=true JVM引数:-Xdisablejavadump また、出力先ディレクトリは環境エントリーIBM_JAVACOREDIRの設定により変更することも可能です。 JavaDumpのファイル名は以下になります。 (Windows & Linux)javacore.YYYYMMDD.HHMMSS.PID.txt (AIX)javacorePID.TIME.txt 56 JavaDumpの取得情報 いくつかのサブコンポーネントに分類 TITLE subcomponent GPINFO subcomponent ENVINFO subcomponent MEMINFO subcomponent LOCKS subcomponent THREADS subcomponent CLASSES subcomponent :OS発行のシグナル、日付、ファイル名の情報 :OSレベル、CPUの情報 :Java・VM・JITのバージョン、実行時の引数の情報 :メモリーに関する情報 :LOCKに関する情報 :存在しているスレッドとスタックトレースのリスト :クラスローダーに関する情報 57 JavaDumpの出力はいくつかのサブコンポーネントに分類されています。そのサブコンポーネントの説明 は上記の通りです。このうち問題判別に特に有効なのはLOCKS(Lockに関する情報)とTHREADS(スレッド のスタックトレース)のサブコンポーネントになります。次ページ以降にて出力例をご紹介させて頂きます。 57 JavaDumpの出力(再帰呼び出し) THREADS subcomponentに注目 存在するスレッドとスタックトレースの情報 スタックトレースより、同じメソッドが何度も呼ばれていることがわかる javacoreYYYYMMDD.HHMMDD.<process id>.txt 0SECTION THREADS subcomponent dump routine NULL ================================= 1XMCURTHDINFO Current Thread Details NULL ---------------------3XMTHREADINFO "Signal dispatcher" (TID:0x101EB960, sys_thread_t:0x213638A0, state:R, native ID:0x960) prio=5 NULL 1XMTHDINFO All Thread Details 出力時点での全スレッドの状態を記録 NULL -----------------NULL 2XMFULLTHDDUMP Full thread dump J9SE VM (J2RE 5.0 IBM J9 2.3 AIX ppc-32 build 20070322_12058_bHdSMR, native threads): 3XMTHREADINFO "WebContainer : 1" (TID:0x1034AD60, sys_thread_t:0x25847B48, state:CW, native ID:0x1490) prio=5 Thread.sleepを呼び出した状態 4XESTACKTRACE at java.lang.Thread.sleep(Native Method) 4XESTACKTRACE at com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:17) 4XESTACKTRACE at com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) 4XESTACKTRACE at com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) 4XESTACKTRACE at com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) RecursiveCall.javaの17行目 4XESTACKTRACE at com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) doRecursiveCallメソッドがsleep 4XESTACKTRACE at RecursiveCall.javaの18行目 com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) メソッドを呼び出した 4XESTACKTRACE at doRecursiveCallメソッドが com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) 58 4XESTACKTRACE at 再度doRecurisiveCallメソッドを呼んでいる com.ise.waspd.jvm.RecursiveCall.doRecursiveCall(RecursiveCall.java:18) ・・・・・・ (この状態が無限に続き、ループに) 上記例は、同一メソッドによる再帰メソッドが無限に起こり続けている際のJavaDumpの出力例です。 THREAD subcomponent dump routineを参照します。存在するスレッドとスタックトレースの情報が記録さ れていますので、スレッドのスタックトレースを確認すると、WebContainer:1というスレッドがThread.sleepメ ソッドを呼び出した状態で停止しており、さらにそのsleepメソッドは com.ise.waspd.jvm.RecursiveCall.doReCursiveCallメソッドから呼ばれたことがわかります。さらにその後に 同じメソッドが何度も繰り返し呼ばれていることから、このプログラムが再帰処理を続けていることがわかり ます。 58 JavaDumpの出力(Lock) LOCKS subcomponentに注目 LOCKに関する情報 Monitor Pool Dump欄により、どのスレッドのオブジェクトがどのスレッドのオ ブジェクトによってLockされているかが判断できる javacoreYYYYMMDD.HHMMDD.<process id>.txt 0SECTION LOCKS subcomponent dump routine オブジェクトのLockに関する情報を記録 NULL ============================ ・・・・・・・ 1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors): 2LKMONINUSE sys_mon_t:0x0028AE90 infl_mon_t: 0x0028A898: 3LKMONOBJECT com.ibm.ws.util.BoundedBuffer@124E1798/124E17A0: <unowned> 3LKNOTIFYQ Waiting to be notified: “Thread-0”はjava.lang.Object@3030DF38/3030DF40のロック開 3LKWAITNOTIFY "WebContainer : 0" (0x250BA170) 放待ち状態にあり、そのObjectが0x07によってロックされている。 2LKMONINUSE sys_mon_t:0x3020DAE8 infl_mon_t: 0x00000000: 3LKMONOBJECT java.lang.Object@3030DF38/3030DF40: Flat locked by thread ident 0x07, entry count 1 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "Thread-0" (0x353366F0) ・・・・・・・ ID 0x07は”Thread-1”を示している 1LKFLATMONDUMP Thread identifiers (as used in flat monitors): 2LKFLATMON ident 0x07 "Thread-1" (0x35336E90) ee 0x35336C64 2LKFLATMON ident 0x06 "Thread-0" (0x353366F0) ee 0x353364C4 ・・・・・・・ 59 上記例は、あるスレッドのオブジェクトが他のオブジェクトにLockされている際のJavaDumpの出力例です。 LOCKS subcomponent dump routineを参照します。ここにはオブジェクトのLockに関する情報が記録さ れています。Monitor Pool Dump欄から各スレッドが要求しているオブジェクトと、そのオブジェクトがどのス レッドによって所有されているのかがわかります。どのスレッドによっても所有されていない場合は <unowned>と記載されますが、所有されている場合はそのスレッドのIDが記載されます。上記例ではスレッ ドID 0x07によってロックされていることがわかります。 さらにThread identifierの欄を見ると、スレッドIDとスレッド名との紐付けを読み取れます。上記例ではID 0x07が「Thread-1」と結び付けられていますので、Thread-0のオブジェクト java.lang.Object@3030DF38/3030DF40がThread-1のオブジェクトによってロック開放待ちになっているこ とがわかります。 59 JavaDumpの出力(Deadlock) LOCKS subcomponentに注目 LOCKに関する情報 「Deadlock detected!」の内容から、デッドロックの発生箇所が特定できる javacoreYYYYMMDD.HHMMDD.<process id>.txt 1LKDEADLOCK Deadlock detected !!! Deadlockに関する情報を記録 NULL --------------------NULL 2LKDEADLOCKTHR Thread "RightToLeft" (0x886C718) 3LKDEADLOCKWTR is waiting for: RightToLeftはLeftToRightのス 4LKDEADLOCKMON sys_mon_t:0x08A49B08 infl_mon_t: 0x0898B128: レッドの保持しているオブジェクト 4LKDEADLOCKOBJ のロック開放待ち com.ibm.jp.ws.diagnose.SynchronizedObject@13DE5770/13DE5778: 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "LeftToRight" (0x891C458) 3LKDEADLOCKWTR which is waiting for: 4LKDEADLOCKMON sys_mon_t:0x063E9BE0 infl_mon_t: 0x00000000: LeftToRightはRightToLeftのス 4LKDEADLOCKOBJ レッドの保持しているオブジェクト com.ibm.jp.ws.diagnose.SynchronizedObject@13DE5728/13DE5730: のロック開放待ち 3LKDEADLOCKOWN which is owned by: 2LKDEADLOCKTHR Thread "RightToLeft" (0x886C718) 60 上記例はデッドロックが発生し、DeadLock detectedが検出された際のJavaDumpの出力例です。 片方のオブジェクトがもう一方のオブジェクトのロック開放を待ち、さらにもう一方のオブジェクトが片方の オブジェクトのロック開放を待っている状態がデッドロックです。この状態になると、どちらのスレッドも先に 進めず、処理がそこで止まってしまいます。この際にJavaDumpを取得すると、LOCKS subcomponentに 「DeadLock detected!」の記述が記録されます。 上でスレッド”RightToLeft“がオブジェクト com.ibm.jp.ws.diagnose.SynchronizedObject@13DE5770/13DE5778を要求していますが、それがスレッ ド”LeftToRight“によって保持されていることを示しています。さらに下でスレッド”LeftToRight“がオブジェ クトcom.ibm.jp.ws.diagnose. SynchronizedObject@13DE5728/13DE5730を要求しているが、それがスレッ ド”RightToLeft“によって保持されていることを示しています。これより、上記例で は”LeftToRight“と”RightToLeft“がデッドロックの状態に陥っていることがわかります。 このようにして、JavaDumpは現在のスレッドやオブジェクトの状況を知ることができるため、ハングやスロー ダウン時の原因箇所特定に非常に有用です。 60 JavaDump解析ツール - IBM Thread and Monitor Dump Analyzer for Java Technology GUIベースのJavaDump解析ツール 以下からフリーで入手可能 解析 http://www.alphaworks.ibm.com/tech/jca 以下のコマンドにて起動し、javacoreファイルを選択する java –jar <JCA_ROOT>¥jca17.jar 61 JavaDump解析ツールの一つにIBM Thread and Monitor Dump Analyzer for Java Technologyがあります。 IBM Thread and Monitor Dump Analyzer for Java TechnologyはJavaで書かれたJavaDump解析用のツー ルであり、操作はすべてGUIから実行できるのが特徴です。 IBM Thread and Monitor Dump Analyzer for Java Technologyの起動は以下のコマンドを実行します。 IBM Thread and Monitor Dump Analyzer for Java Technology起動後、javacoreファイルを選択して下さい。 (<JCA_ROOT>はIBM Thread and Monitor Dump Analyzer for Java Technologyをインストールしたディレ クトリを指します。) #java –jar <JCA_ROOT>¥jca17.jar IBM Thread and Monitor Dump Analyzer for Java Technologyについての詳細は下記URLをご参照くだ さい。 - IBM Thread and Monitor Dump Analyzer for Java Technology http://www.alphaworks.ibm.com/tech/jca 61 IBM Thread and Monitor Dump Analyzer for Java Technologyを用いたJavaDump解析 解析 Thread Detail画面 代表的なスレッドの状態は以下のとおり ・Runnable: 処理を受付可能な状態 ・Blocked: 別スレッドが保持しているロッ クの解放待ち状態 ・Waiting on condition: sleep()、wait()メ ソッドやI/O、join()メソッドによる待ち状態 Monitor Detail画面 リソースのロック解放待ちスレッドの 一覧を表示 62 JVM上のスレッドの状況を確認するには[Analysis] – [Thread Detail]で起動するツールを使用します。こ の画面ではRunnable、Blockedなどのスレッドの状態を見やすい形で確認することができます。左画面で スレッドを選択するとそのスレッドのスタックトレースが確認できます。 複数スレッドから要求されているリソースのロック状況を確認するには[Analysis] – [Monitor Detail]で起 動するツールを使用します。上記の赤線内の例ではWebContainer:16が保持しているリソースの解放を6 つのスレッドが待っている状態が確認できます。 62 HeapDump (1/2) JVMがHeapを使い切ったときに生成 Heap上の全てのオブジェクトの情報を出力 wsadminを用いた手動によるHeapDumpの作成 wsadmin> set obj [$AdminControl queryNames WebSphere:type=JVM,process=server01,*] wsadmin> $AdminControl invoke $obj generateHeapDump wsadmin> jvm = AdminControl.queryNames(‘WebSphere:type=JVM,process=server01,*’) wsadmin> AdminControl.invoke(jvm,’generateHeapDump’) 63 HeapDumpはJVMがヒープを使い果たしたときやクラッシュしたとき、またはユーザーが明示的に命令を 送ったときに生成されます。命令が送られると、その瞬間のヒープ上の全てのオブジェクト情報を出力しま す。 HeapDumpは、ヒープを使い切ったときにはJavaDumpと同時に出力されます。またV6.0.2から新たに、 wsadminを用いて手動でHeapDumpのみを出力させることも可能になりました。 63 HeapDump (2/2) ヒープ内に割り当てられているすべての到達可能(live)オブ ジェクトの状態を記録 ある時点のヒープの状態を示すスナップショット ¾ HeapDumpによって分かること ¾ ¾ アプリケーションのオブジェクトによるヒープの利用状況 ヒープの状態(分断化の度合い、オブジェクトのロード状況) HeapDumpの出力先 以下に示す場所について存在の有無と書き込み属性を上の候補からチェックし、書 き込み可能な場所に出力 ¾ ¾ ¾ ¾ HeapDump出力前に必ずGCが起動し、到達不可能な“ゴミ”オブジェクトがあまり残らないような形でデータ を出力 環境エントリー: IBM_HEAPDUMPDIR の場所 JVMプロセスのカレント・ワーキング・ディレクトリ(デフォルトは USER_INSTALL_ROOT ) (setされている場合)環境変数: TMPDIR の場所 /tmpディレクトリ、(Windows環境 x:¥tmp ここでxはカレントドライブ名) HeapDumpファイル名 Java SDK 1.4.2 SR1より出力フォーマットがphd形式に変更 SR1以降の環境でテキストファイルで出力するには ¾ 環境エントリー: IBM_JAVA_HEAPDUMP_TEXT=true の設定が必要 Windows heapdump.YYYYMMDD.HHMMSS.PID.phd Linux & AIX heapdumpPID.TIME.phd 64 JavaDumpがJVMのコンポーネントの状態についての情報を取得するためのデータであるのに対して、 HeapDumpではJVMの仮想ストレージの状態、つまりヒープの中でどのようなオブジェクトがどのように格納 されているか、及びどこに空き領域が存在するかなどの状態を表す情報を取得することが出来ます。 JavaDumpにおいてSTコンポーネントについてのダンプを出力することが可能ですが、これはOSから割り 当てているメモリ領域の情報や、GCの方法などのSTコンポーネントそのものの状態についてのダンプ情 報であるため、HeapDumpの内容とは異なります。 HeapDumpの出力先はJVMの作業ディレクトリ(デフォルトは環境変数USER_INSTALL_ROOT)になり、 ファイル名はOSによって上記のように異なります。また、出力先ディレクトリは環境エントリー IBM_HEAPDUMPDIRの設定により変更することが可能です。 WASV6からHeapDumpの出力ファイルはテキストファイルではなく、PHDファイルになりました。これをテ キストファイルで出力させるには、環境エントリーIBM_JAVA_HEAPDUMP_TEXTの設定が必要です。テキ スト形式でHeapDumpを出力するとヒープサイズとほぼ同じ大きさの出力になり、システムのディスクI/Oに 大きな負荷がかかるため、V1.4.2 SR1からはデフォルトの出力フォーマットがテキストからphd形式に変更 され、一回の出力量がテキストのおよそ1/4程度まで小さくなっています。 64 HeapDumpの出力 オブジェクトのアドレス、サイズ、タイプと参照されている オブジェクトアドレスをリストで表示 HeapDumpの解析には解析ツールが必要 HeapAnalyzer MDD4J Heaproots heapdump.YYYYMMDD.HHMMDD.<process id>.txt // Version: J2RE 5.0 IBM J9 2.3 AIX ppc-32 build 20070322_12058 0x101EBCB8 [56] array of java/lang/Object 0x11cffd38 0x10342e98 0x103925b0 0x102a24f8 0x10268468 ・・・・・・ // Breakdown - Classes: 9473, Objects: 207102, ObjectArrays: 37404, PrimitiveArrays: 59884 // EOF: Total 'Objects',Refs(null) : 313863,713853(185700) 1行目:オブジェクトのアドレス、サイズ、タイプ 2行目:参照されている他のオブジェクトのアドレス 65 HeapDumpは、ヒープの構造をシンプルに表現した形式になっています。上記例のように、先頭にJRE情 報があり、オブジェクトの構造を1行目にオブジェクトのアドレス、サイズ、タイプ。2行目に参照されている オブジェクトのアドレス、という形で羅列し、最後にファイルのサマリーが載っている形式になっています。 しかし、このファイルだけを見て解析を行うのは非常に困難ですので、通常はHeapDumpの解析用ツール を用いて解析を行います。 HeapDumpをメモリリークやOutOfMemoryの発生時に取得し解析ツールにて解析することで、どのオブ ジェクトがヒープを占領しているのかを見分けることが出来ます。 65 HeapDump解析ツール - HeapAnalyzer GUIベースのHeapDump解析ツール 以下からフリーで入手可能 解析 http://www.alphaworks.ibm.com/tech/heapanalyzer 以下のコマンドにて起動し、HeapDumpファイルを選択する java –jar <HA_ROOT>¥ha150.jar 66 HeapDump解析ツールの一つにHeapAnalyzerがあります。HeapAnalyzerはJavaで書かれたHeapDump 解析用のツールであり、Javaが動作できる環境であれば、全てのプラットフォームで利用出来ます。操作 はすべてGUIから実行できるのが特徴です。 HeapAnalyzerの起動は、以下のコマンドを実行します。HeapAnalyzer起動後、heapdumpファイルを選択 して下さい。(<HA_ROOT>はHeapAnalyzerをインストールしたディレクトリを指します。) #java –jar <HA_ROOT>¥ha150.jar 66 HeapAnalyzerを用いたHeapDump解析 (1/2) 状況に応じて、以下の項目を選択し、表示する ツリー構造 オブジェクトリスト タイプリスト ルートリスト オブジェクト間のサイズのギャップ ギャップサイズ毎の数 オブジェクト名/タイプ名による検索 アドレスによる検索 解析 67 HeapAnalyzerでは、以下の項目を調査する事が出来ます。問題発生状況に応じて選択して下さい。 ・ツリー構造 ・オブジェクトリスト ・タイプリスト ・ルートリスト ・オブジェクト間のサイズのギャップ ・ギャップサイズ毎の数 ・オブジェクト名/タイプ名による検索 ・アドレスによる検索 67 HeapAnalyzerを用いたHeapDump解析 (2/2) ツリー構造よりリークの疑いがある場所を教えてくれる Locate a leak suspect 解析 68 HeapAnalyzerの効果的な使用方法として、ツリー構造よりリークの疑いがある場所を教えてくれる機能が あります。「Analysis」-「Tree Views」より右クリックにて「Locate a leak suspect」を選択して下さい。 68 HeapDump解析ツール - MDD4J 解析 GUIベースのHeapDump解析ツール ISAより起動し、プライマリー・メモリー・ダンプ・URLにHeapDumpファイルを 入力する アップロードと分析をクリックする HeapDumpファイル名の入力 解析する際にクリックする 69 HeapDump解析ツールの一つにMDD4Jがあります。ISAを起動し、「ツール」→「製品」からJava 用メモ リー・ダンプ診断 (MDD4J)を選択して下さい。 その他、当ページでは以下を実施する事が出来ます。 1.プライマリー・メモリー・ダンプ・ファイル URL 入力ボックスに、ヒープ・ダンプ・ファイルを指す URL を入 力して、「アップロードと分析」ボタンをクリックし、単一ダンプ分析機能を起動します。 2.ペアのヒープ・ダンプ・ファイルを指す 2 つの URL を 1 つはベースライン・メモリー・ダンプ・ファイル URL 入力ボックスに、もう 1 つはメモリー・ダンプ・ファイル URL 入力ボックスに入力して「アップロードと 分析」ボタンをクリックし、比較分析機能を起動します。 3.メモリー・ダンプ URL の例: a.GZIP 圧縮した PHD ダンプへの HTTP URL: http://productionmachine/opt/WebSphere/AppServer/profiles/default/heapdump.20040819.115809.3716.phd.gz b.GZIP 圧縮した HPROF ダンプへの HTTP URL: http://productionmachine/opt/WebSphere/AppServer/profiles/default/hprof20040813.txt.gz c.解凍した IBM TXT ダンプへの HTTP URL: http://productionmachine/opt/WebSphere/AppServer/profiles/default/heapdump20820.1090614135.txt d.SVC ダンプへの FTP URL: ftp://userid:password@productionmachine/opt/WebSphere/AppServer/profiles/default/dump1.bin e.ローカル・ファイル・システムにある IBM TXT ダンプへのファイル URL: file:///c:/WebSphere/AppServer/profiles/default/heapdump20820.1090614135.txt f.ローカル Windows ファイル・システムにある IBM TXT ダンプ・ファイルへのパス: c:¥WebSphere¥AppServer¥profiles¥default¥heapdump20820.1090614135.txt 4.メモリー・ダンプ分析結果セクションのドロップダウン選択リストで、以前に実行された分析によって保管 された結果を含むディレクトリーを選択して、「分析結果のロード」ボタンをクリックし、分析結果を表示しま す。すべての分析結果が、IBM サポート・アシスタント Java プロセスのデフォルト作業ディレクトリーに保 管されています。「構成オプション」ページを介して分析結果を保管する代替作業ディレクトリーの構成が 可能です。 5.構成オプションのリンクをクリックして、修正が可能な別の構成オプションを表示します。 6.ヘルプのリンクをクリックして、この文書を表示します。 69 MDD4Jを用いたHeapDump解析 (1/5) 解析 分析サマリー 分析結果のサマリーと分析結果を表示するために行なう次の一連のステッ プを表示 分析結果のサマリーを確認する 次のステップを確認する 70 当ページでは、以下の内容を確認する事が出来ます。 分析結果のサマリー: プライマリーおよびベースライン・ダンプの全体の増加、比較分析機能で検出されたデータ構造サスペ クト数 (存在すれば)、到達サイズの最大ドロップがあるデータ構造サスペクト数、およびタイプ・サスペクト とパッケージ・サスペクトの数がリストされます。 メモリー・ダンプ・コンテンツのサマリー: プライマリーおよびベースライン・ダンプに関する情報が表示されます。 次のステップ: 分析結果ページと相互作用可能な、さまざまな次のステップがリストされます。このセクションでの最初の 3 つのアクションにより、次の 3 つのタブ (サスペクト、コンテキストとコンテンツの探索、およびブラウズ) へ 誘導されます。その 3 つのタブでは、最大サスペクトに関連のある情報が強調表示されます。4 番目のア クションを選択して、アプリケーション Java ヒープの占有スペースへの主なコントリビューターを表示できま す。4 番目のアクションを選択して、メモリー・ダンプ内で検出されたすべてのルート・オブジェクトを「ブラ ウズ」タブに表示できます。6 番目のオプションを選択して、すべてのオブジェクトと型を表示する表形式 で Java ヒープのすべてのコンテンツをリストできます。7 番目のオプションを選択して、分析結果をテキス ト形式で表示できます。このテキスト・ファイルは、分析結果の要約版を伝えるのに使用できます。8 番目 のオプションを選択して、分析の結果を削除できます。これは、ハード・ドライブから分析結果ディレクト リーを削除し、対応するメモリー・ダンプから、分析結果を再計算する必要があります。9 番目である最後 のオプションは、この分析セッションのメモリー・セッション状態にあるすべてを閉じて、初期入力ページに 戻ります。 70 MDD4Jを用いたHeapDump解析 (2/5) 解析 サスペクト 以下の4 つのタイプのサスペクトを表示 ¾ ¾ ¾ ¾ 増加に最も寄与するデータ構造 到達サイズにおいて大きなドロップが起きているデータ構造 大量のインスタンスを持つオブジェクトのタイプ 大量のオブジェクト・インスタンスを持つ Java パッケージ) オブジェクト毎のインスタンス数、バイト数を確認する パッケージ毎のインスタンス数を確認する 71 当ページでは、以下の内容を確認する事が出来ます。 ・比較分析技法によって検出されたデータ構造または領域 各データ構造サスペクトに対して、領域の増加サイズおよびプライマリー・ダンプでの領域の実際のサイ ズを伴ってリーク・ユニット・タイプが表示されます。領域の実際のサイズは、合計ヒープ・サイズのパーセ ントとして表示されます。データ構造サスペクトは、リーク・ユニットの増加数の結果および領域の実際のサ イズに従って、ランク付けされます。デフォルトでは、最初のデータ構造サスペクトが選択されます。大幅 な増加のあるデータ構造サスペクトが検出されない場合は、このセクションは表示されません。 ・単一ダンプ分析技法によって検出された、コンテナー・オブジェクトの到達サイズで大きなドロップを持つ データ構造 到達サイズで大きなドロップを持つ各データ構造サスペクトに対して、コンテナー・オブジェクトのオブ ジェクト・タイプが、コンテナー・オブジェクトの到達サイズと、最大到達サイズを持つ子オブジェクトの到達 サイズへのコンテナー・オブジェクトの到達サイズでのドロップを伴って表示されます。大きなドロップを持 つデータ構造サスペクトは、到達サイズのドロップに従ってソートされます。比較分析技法、または単一ダ ンプ分析で検出されたデータ構造サスペクトがない場合は、デフォルトで、最初のドロップ・サスペクトが 選択されます。到達サイズの大きなドロップを持つデータ構造が検出されない場合は、このセクションは表 示されません。 ・プライマリーおよびベースライン・ダンプ内でインスタンス数の最大増加が起こっているオブジェクト・タイ プ 多くのメモリー・リーク事例において、サスペクトを持つオブジェクト・タイプのインスタンスのすべてが、 リーク・データ構造の一部ではなく、増加オブジェクト・タイプのすべてがリークしているわけではありませ んが、大幅な増加のあるオブジェクト・タイプは、しばしば、メモリー・リークに関与しています。 ・プライマリーおよびベースライン・ダンプ内でインスタンス数の最大増加が起こっているオブジェクトの Java パッケージ名 パッケージ名は、メモリー・リークに関与するアプリケーション・コンポーネントを示します。 また、任意のサスペクト・テーブル行をクリックすると、そのサスペクトが強調表示され、選択したサスペク トに関連した別のタイプのサスペクトのすべてを表示出来ます。 71 MDD4Jを用いたHeapDump解析 (3/5) 解析 コンテキストとコンテキストの検索 プライマリー・メモリー・ダンプの Java ヒープの占有スペースへの ¾ ¾ 主なコントリビューターのオーナーシップ・コンテキストのグラフ グラフで選択されたノードのコンテンツを表示 (オブジェクト・タイプ、インスタンス数、バイトの表示) 72 当ページでは、以下の内容を確認する事が出来ます。 「コンテキストとコンテンツの探索」タブは、タブ・ヘッダーをクリックするか、フレームの下部にある「次へ」 ボタンをクリックするか、「分析サマリー」タブの「次のステップ」セクションの 2 番目のステップをクリックする ことで表示できます。 このタブは、「コンテキストとコンテンツの探索」に示すように Java ヒープの占有スペースへの主なコントリ ビューターのオーナーシップ・コンテキストを表示します。「サスペクト」タブで選択された任意のサスペクト 行に対して、占有スペース内で対応する主なコントリビューター・ノードが選択されます。占有スペース内 のこれらの選択された各ノードに対して、ノードのサイズに大きく寄与するオブジェクトのタイプが、コンテ ンツ・セクションに表示されます。 選択されたサスペクトのために強調表示されているノードを除いて、オーナーシップ・コンテキストにある 他のノードは、ノード・テーブルの行をクリックすることによっても選択できます。これによって、コンテンツ・ テーブルが更新され、選択したノードで最大インスタンス数を持つ大きなオブジェクト・タイプを表示します。 選択されたサスペクトに対して、「ノードの選択」ボタンは、選択されたサスペクトを含むオーナーシップ・ コンテキスト内のノードのみを強調表示します。 選択されたデータ構造サスペクトまたはドロップ・サスペクトに対しては、「ブラウズ」ボタンで、「ブラウズ」 タブに進み、サスペクトの場所を探索されている深さ優先検索ツリーの特定の部分を表示します。 72 MDD4Jを用いたHeapDump解析 (4/5) 解析 ブラウズ オブジェクト参照グラフの深さ優先全探索に基づいたツリー表示で、プライ マリー・メモリー・ダンプのすべてのコンテンツを表示 73 当ページでは、以下の内容を確認する事が出来ます。 「ブラウズ」タブは、タブ・ヘッダーをクリックするか、フレームの下部にある「次へ」ボタンをクリックするか、 「分析サマリー」タブの「次のステップ」セクションの 3 番目のステップをクリックすることでアクセスできます。 「ブラウズ」タブは、「コンテキストとコンテンツの探索」タブで、選択されたデータ構造またはドロップ・サス ペクトに対する「ブラウズ」ボタンをクリックすることによってもアクセスできます。 「ブラウズ」タブでは、デフォルトでは、ツリーが、選択されたデータ構造サスペクトのリーク・コンテナーま で展開されています。デフォルトでは、最初のデータ構造サスペクトが選択され、対応するリーク・コンテ ナーまでツリーが展開されます。他のサスペクトへツリーを展開するには、「サスペクト」タブで、そのサスペ クトを選択する必要があります。 「ブラウズ」タブには、オブジェクト参照グラフの深さ優先全探索に従って構成されたツリー表示で、プラ イマリー・ダンプのすべてのコンテンツを表示します。展開されたノードの子は、深さ優先全探索中に計算 された合計到達サイズの順番に表示されます。先頭 20 個の子のみが展開されたノードに表示されます。 それ以上の子を表示する場合は、親ノードを選択せずに、左側のパネルで「子の追加表示」アクションを 選択する必要があります。 ツリー内の各ノードには、オブジェクト ID (アドレス)、オブジェクトの種類 (クラス、オブジェクト配列、プリ ミティブ配列)、および型名が表示されます。ツリー表示で任意のノードの情報をさらに表示するには、ノー ドを選択する必要があります。すべての親 (ノードへの入力参照) を含む、選択したツリー・ノードの追加 情報が左に表示されます。親テーブルの任意の行をクリックして、親ノードまでツリーを展開できます。 「ブラウズ」タブで使用可能なその他のアクションは、後で特定のオブジェクトをアドレス毎に表示および 検索できるように、ツリー・ノードにブックマークを付ける能力があります。 73 MDD4Jを用いたHeapDump解析 (5/5) オブジェクト・テーブル 解析 すべてのメモリー・ダンプ情 報を表示する タイプ・テーブル インスタンス数を表示する 74 当ページでは、以下の内容を確認する事が出来ます。 <オブジェクト・テーブル> 「オブジェクト・テーブル」タブは、「分析サマリー」タブの「次のステップ」セクションの 6 番目のステップを クリックすることでアクセスできます。 「オブジェクト・テーブル」に示されるオブジェクト・テーブルは、プライマリー・メモリー・ダンプ内のすべて の項目をページに表示します。特定のページは、ページ番号を選択するか、「ページに進む」ボタンをク リックするか、「前のページ」または「次のページ」ボタンをクリックすることで選択できます。オブジェクト・ テーブルは列ヘッダーをクリックすることでソートできます。 オブジェクト・テーブル内に表示される項目は、 使用可能なフィルターのリストからフィルターを適用し、フィルター値を指定して、「フィルター」ボタンをク リックすることにより、フィルターに掛けることができます。たとえば、1KB より大きなサイズのオブジェクトは、 「サイズ」>「フィルター」を選択して、フィルター値に 1024 バイトを指定すると表示されます。 <タイプ・テーブル> 「タイプ・テーブル」タブは、「分析サマリー」タブの「次のステップ」セクションの 6 番目のステップをクリッ クし、「タイプ・テーブル」タブを選択することでアクセスできます。 タイプ・テーブルに示されるタイプ・テーブルは、他のオブジェクト・タイプのすべてとこれらの各型のインス タンス数を表示します。タイプ・テーブルは、オブジェクト・テーブルと似た方法で操作できます。 74 IBM Supprt Assistant Workbench (ISA) 問題判別に関する情報、ツール、過程を提示するワークベンチ 情報 ツール 過程 Wizard w/ expandable information Detailed Information ・・・Technotes , Redbook , Education Video 等 ・・・MDD4J , PMAT 等 ・・・問題判別の推奨手順 等 Tools 75 IBM Guided Activity Assistant(IGGA)とは、問題判別に関する情報、ツール、過程を提示するワークベンチに なります。ISAより「ツール」から対象製品を選択し、以下のリンクを選択することで起動されます。 IBM Guided Activity Assistant (IGAA) IGAAは、「Quick Views」、「Wizard」、「Detailed Information」の3つのポートレットに分割されています。画面 メッセージに従い現象を選択していくことにより問題判別、トラブルシューティングを行うことができます。現在、 英語版のみの提供となっております。 IGAAの詳細につきましては、以下のサイトをご参照下さい。 ・About - IBM Guided Activity Assistant http://www-1.ibm.com/support/docview.wss?uid=swg27010135 75 その他問題判別ツール一覧 代表的な解析対象資料に対する問題判別ツール一覧 これらツールの一部はISAのプラグインとして組み込まれており、ISAからの起動 が可能 解析対象資料 設定方法 説明 冗長ガーベッジ コレクション (verbose:gcログ) 管理コンソール、または、 GC状況のトレース JVM引数で設定する JavaDump(javacore) デフォルトで、JVMのク ラッシュ時やQUIT(kill 3)シグナルを受け取った ときに生成する HeapDump デフォルトで OutOfMemory発生時に 自動生成する (クラッシュ時にも生成す るように環境変数で設定 変更可能) 解析ツール PMAT(ISAから起動可能) ◎ EVTK(ISAから起動可能) ○ GC Collector △ JVMに関するダンプ情報。 IBM Thread and Monitor Dump Analyzer for Java OS情報、環境変数、稼 Technology 動する全スレッドのダン プ情報など ThreadAnalyzer (ISAから起動可能) JVMが使用するヒープ上 に存在する全liveオブ ジェクトのダンプ情報 お勧め度 ◎ ○ HeapAnalyzer ◎ HeapRoots ○ MDD4J(ISAから起動可能) △ 76 問題判別時に使用するツールの一覧を纏めました。表からもわかるようにISAを使用することにより、冗長ガー ベッジコレクション・JavaDump・HeapDump等の問題判別ツールを登録することができます。 PMAT:IBM Pattern Modeling and Analysis Tool for Java Garbage Collector EVTK :Extensible Verbose Toolkit MDD4J:Memory Dump Diagnostic for Java その他、ISAに登録されている以外のツールにつきましては、以下をご参照下さい。 ・GC Collector http://www.alphaworks.ibm.com/tech/gcdiag ・IBM Thread and Monitor Dump Analyzer for Java Technology http://www.alphaworks.ibm.com/tech/jca ・HeapAnalyzer http://www.alphaworks.ibm.com/tech/heapanalyzer ・HeapRoots http://www.alphaworks.ibm.com/tech/heaproots 76 JavaDump、HeapDump出力内容の設定(1/2) V6.1New 汎用JVM引数-Xdump設定 ダンプファイルの種類 ダンプイベントの種類 設定例①:予期せぬクラッシュでheapdumpを出力させる場合 名前:汎用JVM引数 値:-Xdump:heap:events=gpf 設定例②:heapdumpの出力回数を3回に変更する場合 名前:汎用JVM引数 値:-Xdump:heap:range=1..3 77 JVMのバージョン5.0では、ダンプ機能の実装においてRAS(Reliability, Availability, and Serviceability)機能が拡充 され、新しく-Xdumpオプションが追加されました。 それ以前のバージョンでは、環境変数のJAVA_DUMP_OPTSやIBM_HEAPDUMP_OUTOFMEMORY等でダンプ機能 を設定することが可能でしたが、今後は、よりきめ細かい設定が可能である-Xdumpオプションをお勧め致します。 <参考> ・JVM 5.0 SR5未満の環境では、OutOfMemoryError発生時にJavacoreおよびHeapdumpが出力されません (WAS08-006) http://www-06.ibm.com/jp/domino01/mkt/cnpages1.nsf/page/default-0003F586 77 JavaDump、HeapDump出力内容の設定(2/2) 環境エントリーJAVA_DUMP_OPTS 出力するダンプの種類を設定可能 環境変数 JAVA_DUMP_OPT=“ON<condition>(<dumptype>),・・・・・” condition ANYSIGNAL, DUMP, ERROR, INTERRUPT, EXCEPTION,OUTOFMEMORY dumptype ALL, NONE, JAVADUMP, SYSDUMP, HEAPDUMP condition: Javacoreファイルの生成条件を指定 ¾ ¾ ¾ ¾ dumptype: 生成するダンプの種類 ¾ ¾ ¾ DUMP: CTRL-BREAK(Windows環境)やCTRL-¥(AIX, Linux)によりJavacoreを出力 ERROR: JVMの内部で検知されたエラーによって異常終了 INTERRUPT: CTRL-CなどによりJavacoreを出力 OUTOFMEOMRY: OutOfMemory(メモリ不足)エラーが発生 SYSDUMP: OSが生成するコアファイル HEAPDUMP: ヒープダンプ JAVADUMP: JavaDumpファイル 推奨値 ¾ JAVA_DUMP_OPTS="ONERROR(JAVADUMP,SYSDUMP) ONEXCEPTION(JAVADUMP,SYSDUMP), ONDUMP(JAVADUMP)" 78 前ページで、ダンプの設定を行う際は-Xdumpを使用することをお勧めしておりますが、これまで同様に 環境エントリーJAVA_DUMP_OPTSを使用して引き続き設定することも可能です。この環境変数を使用する ことで、どのような状況で (どのような命令が送られたときに) 、どの種類のダンプを生成するか設定するこ とが可能です。 生成条件のDUMP,ERROR,INTERRUPTの各レベルに対してどの信号がマッピングされているかはプ ラットフォームによって異なっており、詳細はdiagnostic guideに掲載されています。問題判別を行うときに は、一般に各OSが生成するCoredumpファイルも有用な情報を提供する場合が多いため、設定を以下の ように変更することが望ましいとされています。 ・Diagnostic Guide, Chapter 25 Using Heapdump(p.370) JAVA_DUMP_OPTS="ONERROR(JAVADUMP,SYSDUMP) ONEXCEPTION(JAVADUMP,SYSDUMP), ONDUMP(JAVADUMP)" 78 その他JavaDump、HeapDumpに関する環境エントリー 管理コンソールにて設定 アプリケーションサーバー選択後、 「Javaおよびプロセス管理」から「プロセ ス定義」→「環境エントリー」 にて設定 環境変数名 値 Memo IBM_HEAPDUMP 又は IBM_HEAP_DUMP true/false Heap Dumpの機能を有効にする IBM_HEAPDUMP_OUTOFMEMORY true/false IBM_JAVACOREDIR fullpath OutOfMemoryをhookし、Heap Dumpを生成する 機能を有効にする JavaDumpの出力先変更 IBM_HEAPDUMPDIR fullpath HeapDumpの出力先変更 IBM_JAVA_HEAPDUMP_TEXT true/false IBM_JAVA_HEAPDUMP_TEST true/false TMPDIR fullpath PHDフォーマットかTXTフォーマットかを選択す る PHD+TXTフォーマットの二種類のHeap Dump を同時に生成する Heap Dumpの出力先が利用不能な場合に書き 出し先となるディレクトリ 79 上記の表は、JavaDumpとHeapDumpに関する環境エントリーの一覧になります。これらの環境変数は管 理コンソールからアプリケーションサーバーを選択し、「Javaおよびプロセス管理]から「プロセス定義」→ 「環境エントリー」の画面から設定可能です。デフォルトでは何も表記されていませんので、手動で変数と 値を設定する必要があります。出力先やファイル名を変更したいときは参考にして下さい。 79 【ご注意下さい】JVM5.0 SR5未満の環境では、OutOfMemoryError発生時に JavacoreおよびHeapdumpが出力されません JVM5.0 SR5未満の場合、障害によりOutOfMemoryError時にJavacore またはHeapdumpが出力されない 対応方法(以下の3つ内、1つを選択ください。) 1. 2. 3. JVMのバージョンを5.0.0 SR5以上にアップグレードする アプリケーション側で、OutOfMemoryErrorをキャッチしてスローする 管理コンソールで以下のいずれかを設定する ¾ ¾ アプリケーション・サーバー > <アプリケーション・サーバー名>Java およびプロセス管理>プ ロセス定義>環境エントリーを選択し以下のパラメータを追加 名前:IBM_HEAPDUMP_OUTOFMEMORY 値:true 名前:IBM_JAVADUMP_OUTOFMEMORY 値:true アプリケーション・サーバー > <アプリケーション・サーバー名>Java およびプロセス管理>プ ロセス定義>環境エントリーを選択し以下のパラメータを追加 名前:JAVA_DUMP_OPTS 値: ONERROR(JAVADUMP,SYSDUMP),ONEXCEPTION(JAVADUMP,SYSDUMP),ONDUMP(JAV ADUMP),ONOUTOFMEMORY(JAVADUMP,HEAPDUMP) (注意) JVM5.0 SR2では対応可能な事を確認済み JVMがその他のバージョンの場合には、確認テストを行ってください 80 JVMでは、デフォルト設定でJavacoreおよびHeapdumpが出力されるようになっていますが、JVMのバージョンによっ ては、障害によりOutOfMemoryError時にJavacoreまたはHeapdumpが出力されないことが確認されています。 JavacoreおよびHeapdumpは問題解析の際にとても大切な情報であり、問題発生時にこれらの情報が出力されること は問題の早期解決につながります。 よって、上記の対応策を早期に実施されることをお勧め致します。 80 IHS / WebSphere Application Server問題判別 症状別問題判別 ハング スローダウン OutOfMemory ブラウザから応答が返ってこない時の一例 81 81 症例1:スローダウン レスポンスが遅い 主な原因 マシンのリソースの限界 ¾ ¾ ¾ 他のアプリケーション(バッチなど) ¾ CPU使用率の調査 事前に負荷テスト・パフォーマンスチューニングを行い、リクエストをどこまで受付 可能か、限界値を見極めておく 負荷分散装置などでそれ以上のリクエストがこないように流量制限 grep/find/tailなどのコマンドもシステムに負荷を与えることがあるので注意 アプリケーションロジックの不備 他システムの遅延 ボトルネックの特定が必要 OS、ネットワーク、ソフトウェアなど、全体を見て検出 Webサーバーでレスポンスタイム記録 + 要求メトリックが有用 (→ 「IHSアクセスログのカスタマイズ」) 82 スローダウンは、個々の構成要素は正常に稼動しているにも関わらず、レスポンスが返ってくるのが非常 に遅い現象になります。 主な原因は、マシンのリソースの限界や他のアプリケーションの影響が考えられます。マシンのリソース はCPU使用率などを調査し、必要以上に負荷がかかっていないかを確認します。その場合には、負荷分 散装置などを利用し、それ以上のリクエストがこないように流量制限することも考慮にいれなくてはなりませ ん。また、事前に負荷テストやパフォーマンスチューニングを行い、リクエストをどこまで受付可能か、限界 値を見極めておくことも重要になります。 また、他のアプリケーションやバッチの影響もあります。見落としがちですが、grepやfind、tailなどのコマ ンドもシステムに負荷を与えることがあるので注意が必要です。 スローダウンを解決するには、そのボトルネックがどこにあるのかを検出することが非常に重要です。考 えられるボトルネックとしては、OSレベル、Network、ソフトウェアなどシステム全体からそのボトルネックを 検出することが重要です。OSレベルであればvmstatコマンド、ソフトウェアであれば、 Webサーバーでレス ポンスタイム記録を取得し、要求メトリックを利用してコンポーネントごとのレスポンスタイムを取得すること が有用です。(→「IHSアクセスログのカスタマイズ」) 82 症例2:ハングアップ WAS(App)プロセスは存在しているが、応答が無い状態 主な原因 アプリケーションや製品の問題(→「JavaDump」) ¾ ¾ ¾ デッドロック 再帰呼び出しによる無限ループ JavaDumpの取得が有用 他連携システムからの応答待ち パフォーマンスの劣化による長時間スローダウン JavaDumpからハングアップポイントの判定 83 ハングは、プロセスは存在しているにもかかわらず応答がない現象になります。 主な原因としては、アプリケーションまたは製品のバグに起因する場合があります。スレッドがデッドロッ クを起こし停止してしまう場合や、再起呼び出しによる無限ループが発生し、結果的に応答がなくなる場 合があり、最終的にStackOverflowでJVMがダウンしてしまう可能性もあります。ハングが発生した際、CPU 使用率があまり高くない場合にはデッドロック、CPU使用率が高い場合には再起呼び出しによる無限ルー プの状態になっていることが考えられます。この場合は、JavaDumpの取得が有用です。 (→「JavaDump」) また、後方リソースの処理待ちに起因する場合もあります。この場合、DBやMQなど、後方リソース処理 やネットワーク処理などにより、スレッドがI/O処理待ちの状態となります。この場合、後方のリソースについ て問題判別を行う必要があります。 また、パフォーマンスの劣化により、レスポンスが返ってこないように感じられる場合です。この場合、遅く てもレスポンスが帰ってくる状態であれば、後方リソースまたはパフォーマンスの問題と考えられます。(次 ページ「スローダウン」参照) 83 症例3:OutOfMemory ヒープ領域を使い切ってしまった 主な原因 Java heap領域の不足 Native heap領域の不足 GCやメモリ領域のチェック verbose:gc (→ 「verbose:gc」) ¾ ¾ 出来る限り、通常時から取得して下さい より詳細なGCの挙動を確認したい場合には、GCトレースを取得して下さい HeapDump (→ 「HeapDump」) ¾ ¾ 正常時に1回取得しておくと、障害発生時の分析に便利である PDを行う際には、問題発生までの時間の経過に合わせて(もしくは、状況に応じ て)2回程取得することを推奨 84 OutOfMemoryは、メモリー領域を使い切ってしまい、ログにOutOfMemoryエラーが出力されJVMがダウ ンする現象になります。 主な原因としては、Java heap領域の不足の場合とNative heap領域の不足の場合があります。 OutOfMemoryが発生した時には、GCがどのように行われ、メモリ領域がどのように使われているのか チェックする必要があります。そのために取得すべき情報としては、 verbose:gc、HeapDumpがあります。 (→「verbose:gc」)また、より詳細なGCの挙動を確認したい場合には、GCトレースを取得して下さい。 (→Hits&Tips「GCトレース」) 正常時の状況のHeapDumpを事前に取得しておき、問題発生時に比較することにより、問題判別がより スムーズに進みますので、正常時に一度HeapDumpを取得しておくことをお勧め致します。また、問題判 別を行う場合には、問題発生までの時間の経過に合わせて2回程度Heapdumpを取得することを推奨しま す。また、AIXであれば、svmonコマンドによりメモリー使用量の変化を追うことも有効です。 84 症例4:クラッシュ JVMの異常終了 主な原因 Native Code(JNI)の問題 JVMそのものの問題 サポートセンターに依頼 クラッシュ時はCore、JavaDumpは自動で出力される 85 クラッシュは、SIGSEGV (incorrect access to memory) 、SIGILL (illegal instruction) などでJVMが異常終 了する現象になります。 主な原因としては、Native Code (JNI)の問題やJVMそのものの問題が考えられます。JNIの問題としては、 JDBCドライバーの問題なども含まれます。 この場合には、CoreやJavaDumpが自動で取得されます。その原因がJVMの問題と考えられる場合には、 CoreとJavaDumpファイルを取得し、IBMサポートセンターに報告します。通常、クラッシュの場合、IBMサ ポートセンターに問題を解析してもらうことになりますが、JavaDumpを参照することによって、現場のSEが その問題判別をできる場合もございます。 85 ブラウザから応答が返ってこないときの一例 (1/6) •F/Wや負荷分散装置がある場合、そこに対する調査も行う。 Pingは通るか ネットワークの問題判別 No Yes Webサーバーは起動しているか(プロセスのチェック) No Yes 静的コンテンツへのリクエストは返ってくるか Webサーバーダウン? ログ/設定coreの確認 No Yes アプリケーションサーバーは起動しているか(プロセスのチェック) Javaプロセスダウン? ログ/JavaDumpのチェック No Yes WASやアプリケーションのログの確認、解析 Plug-inが怪しい ログの確認 Fixの有無の確認 トレース取得 特に何も出ていない Yes Webサーバーを経由せず、HTTPトランスポートから アプリケーションサーバーへ直接アクセスしたときは応答が返ってくるか No アプリケーション 高負荷 CPU使用率の調査 CPUを使っているの サーバープロセス はどのプロセスか? ほとんど使っていない リソースの限界の可能性? ループ?→JavaDumpの取得/解析 他のプロセス そのプロセスの調査 (バッチなどが重い?) 他のアプリケーションへのリクエストへの応答は正常に返ってくるか Yes 問題のアプリケーション内でのトレースの取得・解析(どこで止まるのか) No ハング? 再現性の確認 アプリケーションの見直し JavaDumpの取得/解析 86 上記はブラウザから応答が返ってこないときの問題判別手順の一例を示したものになります。 Pingは正常に通るか、Webサーバーは起動しているか、静的コンテンツへのリクエストは返ってくるか、な ど一つ一つの問題を切り分けて問題判別を行います。また負荷分散装置やファイアウォールなどがある 場合は、それに対する調査も必要になります。 86 ブラウザから応答が返ってこないときの一例 (2/6) Pingは通るか クライアント・サーバー間のネットワークの問題? ping の出力(Windows) C:¥Documents and Settings¥user1>ping mercury Pinging mercury [9.170.251.57] with 32 bytes of data: Reply from 9.170.251.57: bytes=32 time<1ms TTL=128 Reply from 9.170.251.57: bytes=32 time<1ms TTL=128 Reply from 9.170.251.57: bytes=32 time<1ms TTL=128 Reply from 9.170.251.57: bytes=32 time<1ms TTL=128 Ping statistics for 9.170.251.57: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms 送った全てに対し、リプライが返っている 87 まずはクライアントとサーバー間のネットワークに問題がないかを確認するために、pingを実行します。マ シンのホスト名に対しpingコマンドを実行します。成功すると、Reply fromという形で応答が返ってきます。 失敗した場合は、クライアント・サーバー間のネットワークで問題が発生している可能性があります。 87 ブラウザから応答が返ってこないときの一例 (3/6) Webサーバーは起動しているか プロセス確認(ps、tasklist) ps –ef | grep http の出力(AIX) host1@root[/usr/IBMIHS60/conf] ps -ef | grep http root 35698 20872 0 16:53:17 pts/4 0:00 grep http nobody 36180 42056 0 16:53:14 - 0:00 /usr/IBMIHS60/bin/httpd -d /usr/IBMIHS60 -k start root 42056 1 1 16:53:13 - 0:00 /usr/IBMIHS60/bin/httpd -d /usr/IBMIHS60 -k start nobody 42772 42056 0 16:53:14 - 0:00 /usr/IBMIHS60/bin/httpd -d /usr/IBMIHS60 -k start nobody 48984 42056 0 16:53:14 - 0:00 /usr/IBMIHS60/bin/httpd -d /usr/IBMIHS60 -k start 静的コンテンツへの応答があるか IHS上のコンテンツにアクセス Webサーバーのダウン? ログの確認 http://localhost/ 88 次にWebサーバーが起動しているかを確認するために、プロセスを確認します。プロセス確認のコマンド はAIXやLinuxならpsコマンド、Windowsならtasklistコマンドを実行します。正常にプロセスが起動していれ ば、一つの親プロセスに対し複数の子プロセスが起動していることが確認出来ます。(上記はAIXでの例) WindowsであればtasklistコマンドでApache.exeを確認します。また、タスクマネージャでも確認出来ます。 また、IHS上の静的コンテンツに対しリクエストを投げ、IHS上のコンテンツが正常に表示されるかどうかを 確認します。例ではIHSのデフォルトページにアクセスして、IHSが正常に動作していることを確認していま す。 以上の2つが失敗する場合、IHSが正常に起動していない可能性がありますので、IHSのログを確認しま す。(→「IHSで取得されるログ」) 88 ブラウザから応答が返ってこないときの一例 (4/6) アプリケーションサーバーは起動しているか プロセス確認(ps、tasklist) WASのプロセスダウン? ps –ef | grep java の出力(AIX) host1@root[/usr/WebSphere/AppServer6]ps -ef | grep java root 26240 1 0 17:07:45 pts/4 0:40 /usr/WebSphere/AppServer6/java/bin/java -Xbootclasspath/p:/usr ・・・・・・・・ r6/profiles/Dmgr01/config silver2Cell01 silver2CellManager01 dmgr root 42962 1 0 17:11:07 pts/4 0:24 /usr/WebSphere/AppServer6/java/bin/java -Xbootclasspath/p:/usr ・・・・・・・・ ere/AppServer6/profiles/Custom71/config silver2Cell01 silver2Node71 nodeagent WAS、アプリケーションのログの確認 SystemOut.log、SystemErr.logなどにエラーメッセージが出力されて いないか 89 次にWASが起動しているかを確認するために、プロセスを確認します。psコマンドを実行すると、プロセ ス末尾にセル名、ノード名、サーバー名が書かれたプロセスがありますので、それぞれ正常に起動してい るかどうかを確認します(上はAIXでの例)。Windowsであればtasklistコマンドでjava.exeが存在しているか どうかを確認します。この場合、どのjava.exeが何のプロセスを表しているか判断できませんので、PIDファ イルとプロセスIDを照らし合わせる必要があります。プロセスが起動していない場合、WASのプロセスダウ ンの可能性がありますので、JavaDumpなどを確認します。 また、WASやアプリケーションのログを確認し、エラーメッセージが出力されていないか確認します。 (→ 「WASで取得されるログ」 )エラーが出力されていれば、そのエラーに対して解決策を施す必要があります。 89 ブラウザから応答が返ってこないときの一例 (5/6) HTTPトランスポートに直接アクセスしたときに応答があるか http://localhost:9080/snoopなどにアクセス トランスポートは管理コンソールで確認 起動時SystemOut.logにもメッセージが表示 アプリケーションサーバーを選択し、 「Webコンテナー設定」→「Webコンテナー・ト ランスポートチェーン」 プラグインの割り振りの問題? 実際のどのHTTPトランスポートを使って通信したかはプラグインログのレベ ルをトレースにすると判断できる http_plugin.log [Tue Sep 20 14:59:09 2005] 0000aad6 00000203 - TRACE: ws_common: websphereFindTransport: Finding the transport [Tue Sep 20 14:59:09 2005] 0000aad6 00000203 - TRACE: ws_common: websphereFindTransport: Setting the transport (case 2): silver2.makuhari.japan.ibm.com on port 9080 90 次にWebサーバーを経由せず、HTTPトランスポートに直接アクセスしたときに応答があるかを確認しま す。アプリケーションサーバーのトランスポートを指定して直接アクセスして、応答の有無を確認します。ア プリケーションサーバーが所有しているHTTPトランスポートは管理コンソールからも確認出来ますし、起 動時にSystemOut.logにも「TCP チャネル TCP_2 は、ホスト * (IPv4)、ポート 9080 で listen しています。」 というメッセージが出力されます。 HTTPトランスポートに直接アクセスしたときに正しい応答が返ってくれば、IHSからWASに渡す際のプラ グインの挙動に問題がある可能性があります。プラグインログを確認し、必要であればプラグインのログレ ベルをトレースに設定してプラグインの挙動を確認します。プラグインを経由してWASにアクセスする際に、 どのHTTPトランスポートにアクセスしたかも、プラグインログのレベルをトレースにすると確認出来ます。 (→「プラグインで取得されるログ」) 90 ブラウザから応答が返ってこないときの一例 (6/6) CPU使用率の確認 使用率が高いプロセスの調査 リソース上の限界 無限ループなどによるリソースの消費 vmstat -t 10 の出力(AIX) host1@root[/]vmstat -t 10 kthr メモリ ページ フォルト CPU 時間 ------- -------------------- ------------------------ ----------------- --------------- ----------r b avm fre re pi po fr sr cy in sy cs us sy id wa hr mi se 1 1 115652 95387 0 0 0 0 0 0 159 1693 127 1 3 95 1 14:18:24 0 0 115662 95377 0 0 0 0 0 0 153 1275 107 1 1 98 0 14:18:34 0 0 115660 95379 0 0 0 0 0 0 152 1819 107 1 3 96 0 14:18:44 2 0 115659 95380 0 0 0 0 0 0 162 2779 130 2 5 89 4 14:18:54 1 0 122849 88190 0 0 0 0 0 0 155 3968 104 83 6 10 0 14:19:04 ps v(ww) <process id> の出力(AIX) host1@root[/usr/WebSphere/AppServer6]ps vww 22952 PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND 22952 pts/0 A 0:30 228 130448 130504 32768 39 56 11.8 11.0 /usr/WebSphere/AppSer ver6/java/bin/jav・・・・・ 91 次にマシン自体のCPU使用率を確認します。もしCPU使用率が非常に高い状態であれば、どこがCPU を多く消費しているのか確認します。 もしその原因がアプリケーションサーバーのプロセスであれば、アプ リケーションで無限ループなどが発生していないか確認します。リソースの限界である場合には、必要以 上の負荷がマシンにかからないように、パフォーマンスチューニングを行い、流量制限を行う必要がありま す。 91 Edge Component問題判別 情報収集・症状別問題判別 (参考)Edgeの構成要素と役割 Edgeの情報収集/ログ Manager Reportコマンド ケース1:dsserverが起動しない ケース2:「エラー: サーバーが応答していません」 ケース3:Manager Reportが全サーバー「-1」を返す ケース4:割振りが行われない ケース5:Takeoverが正常に完了しない ケース6:意図しないTakeoverが発生する ケース7:セッションが維持できない ケース8:割振りが偏る ケース9:接続数が異常に多い 92 92 (参考)Edgeの構成要素と役割 Edge構成要素 Executor Manager Advisor サーバーの監視を行い レスポンスの時間を Managerに伝える Server dsserver(javaコンポーネント) 監視 Manager Advisor Server リク Client エス ト Executor カーネル Executorから接続数を 受け取り、それらの情報を基に 負荷を計算してExecutorに ”重み”として伝える 割り振り Server Load Balancer Managerに接続数 を伝え、“重み”を基に 割り振りを行う Cluster 93 Dispatcherは、主にExecutor, Manager, Advisorの3つの要素から構成されております。 Executor・・・接続数をカウントし、その情報をManagerに渡します。またManagerが計算した重みを受け取 り、その情報を基に割り振りを行います。 Manager・・・Executorからは接続数の情報を、Advisorからはレスポンスタイムを受け取り、割り振り先サー バーの重み付けを計算します。 Advisor・・・割り振り先サーバーに対し監視リクエストを投げることで障害検知を行います。またレスポンス タイムをManagerへ渡します。 93 Edgeの情報収集 (1/3) 情報収集ツール lbpd Dispatcher用問題判別基本情報収集ツール <EDGE_ROOT>/lbディレクトリ下にlbpmr.tar.Zが作成される lbpmr.tar.Zに含まれるもの ¾ ¾ ¾ lbpd実行結果(lbinfo.txt) <EDGE_ROOT>/lb/logs/下の ログファイル全て <EDGE_ROOT>/lb/ configurations/dispatcher/下の 構成ファイル全て lbpdの中で採取している情報 < AIXの例> [/opt/ibm/edge/lb/servers/bin] ./lbpd Running java -version................................Done. Running netstat -ni..................................Done. Running netstat -nr..................................Done. Running lslpp -l.....................................Done. Running no -a........................................Done. Running arp -a.......................................Done. Running dscontrol executor status....................Done. Running dscontrol executor report....................Done. Running dscontrol cluster report :...................Done. Running dscontrol cluster status :...................Done. Running dscontrol port report ::.....................Done. Running dscontrol port status ::.....................Done. Running dscontrol server report ::...................Done. Running dscontrol server status ::...................Done. Running dscontrol highavailability status............Done. Running dscontrol manager report.....................Done. Running dscontrol file save ibmpmr.cfg force.........Done. 94 Edgeで問題発生時に情報を収集するツールとしてlbpdコマンドがあります。実行すると、 <EDGE_ROOT>/libディレクトリ下にlbpmr.tar.Zファイルが作成されます。このファイルにはlbpd実行結果、 ログファイル、構成ファイルが含まれます。 94 Edgeの情報収集 (2/3) 現行構成ファイル dscontrol file save <ファイル名> ¾ ¾ <EDGE_ROOT>/lb/servers/configurations/dispatcher <EDGE_ROOT>¥lb¥servers¥configurations¥dispatcher Dispatcherの詳細バージョン ¾ ¾ ¾ ¾ [AIX/Linux] [Windows] [AIX] [Linux] [Solaris] [Windows] lslpp –l | grep ibmlb rpm -qa | grep ibmlb pkginfo -l ibmlbadm dscontrol executor report Active code page: 437 C:¥work>dscontrol executor report Executor Report: ---------------Version level ................................. 06.00.00.00 20041028-142356 WSBLD39] Total packets received since starting ......... 0 Packets sent to nonforwarding address ......... 0 Packets processed locally on this machine ..... 0 Packets sent to collocated server ............. 0 Dispatcherと割振り先サーバーのネットワーク情報 設定 ルーティング 接続テーブル インターフェース [Unix] netstat –in [Windows] ipconfig –all [Unix] netstat –rn [Windows] route print [Unix] netstat –an [Windows] netstat –an [UnixOnly] ifconfig –a 95 Edgeで問題判別の際に収集すべき情報には、現行構成ファイル、バージョン、ネットワーク情報、ログ ファイル、ネットワーク・トレースがあります。現行構成ファイル、バージョン、ネットワーク情報は、以上のコ マンドを実行することで取得出来ます。 95 Edgeの情報収集 (3/3) ログファイル スクリプトファイル <EDGE_ROOT>¥lb¥servers¥logs¥ディレクトリ下のログファイル ログレベル5のhamon.log dscontrol set loglevel 5 ログレベル5のreach.log dscontrol manager reach set loglevel 5 ログレベル5のアドバイザー・ログ dscontrol advisor loglevel <アドバイザー名> 5 <EDGE_ROOT>¥lb¥servers¥binディレクトリ下のスクリプト・ファイル ネットワーク・トレース [AIX] ¾ [AIX] ¾ ユーザー・トラフィックに問題がある場合 iptrace -a -s <クライアントIP> -d <クラスター・アドレス> -b <出力ファイル名> Heartbeatに問題がある場合 iptrace –abp <HeartBeat使用ポート> <出力ファイル名> [Linux] tcpdump -w <出力ファイル名> [Windows] snifferやEtherealなどパケット・トレース・ツールを使用 96 ログファイル、ネットワークトレースは、以上のコマンドを実行することで取得出来ます。Edgeではデフォ ルトのログファイルサイズが1MBになりますので、ログレベルを5にされた場合はログサイズを増やして下さ い。また、最終的にログなどから問題を切り分ける事が出来ない場合は、ネットワークトレースを採取するこ とがあります。AIX環境でのIPトレースの使用方法につきましては、以下をご紹介させて頂きます。 ・InfoCenter - 「iptrace デーモン」 http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmd s3/iptrace.htm 96 Edgeのログ Load Balancerのログは循環ログ サイズがオーバーしたら古いログから上書き ログ・サイズは変更可能 ログの種類 server.log manager.log 使用advisor名_ポート.log ¾ ¾ ¾ dsserverの活動の記録、発行したコマンド等の情報 managerの活動記録等 使用するadvisorに関する情報 subagent.log ¾ SNMP subagentに関する情報 hamon.log reach.log ¾ ¾ high availabilityに関する情報(Primary, Backupの両方) reach advisorがとばしたping情報等 97 上記のログは、コマンドdscontrol loglevel <0~5> にて書き込む情報量を変更することが可能です。 ログレベルを0~5まで変更することが出来ます。ログレベルが3以上の場合は、最大サイズを設定することを望 まれます。ログの最大サイズを指定した場合は、ログサイズの最大値に達すると、上から上書きされていきます。 ログのサイズは、現在の値よりも小さいものには設定できません。 (※) LoadBalancerのログは問題判別用ですので、常時ログレベルを5にして運用する事は一般的ではありませ ん。ログレベルを高くするとパフォーマンスが悪くなります。 Load Balancerを再起動したときに、前回使用していたログファイルに.bak拡張子を付加して保存し、新しいロ グファイルが作成されます。ログを保存したい場合は、再起動する前に、.bakを保存する事をお奨め致します。 97 Manager Reportコマンド dscontrol manager report コマンド managerが持っている情報を表示する ¾ ¾ ¾ ¾ 問題判別では、このPORT値をまず確かめます PORT値は,advisorを使用してサーバの状態を監視した時の、割り振り先サーバに対するリク エストのレスポンス時間に依存した値を表しております。 PORTが-1の場合、割振り先サーバがダウンしている状況です WEIGHTが-1の場合、割振りを停止している状況です z ACTV 現在接続中の接続数 z NEWC 直近4秒の新規接続数 z PORT アドバイザーへの応答時間 ------------------------------------------------------------------| 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秒 WEIGHT 更新 2秒 2秒 ACTV, NEWC 更新 WEIGHT 更新 ACTV, NEWC 更新 98 Webシステムの問題判別時には、まずはじめにどこで問題が発生しているかを切り分ける必要がございます。 その切り分けを実施してくれるのが、Edgeのmanager reportコマンドになります。このコマンドを実行しPORT値を 確認することで、どの割振り先に問題が発生しているかを確認する事が出来ます。 以下、manager reportコマンドの出力結果についてご説明させて頂きます。 ・WEIGHTのNOW値は、現在executorが使用している重みです。 ・WEIGHTのNEW値は、次のサイクルでexecutorが使用する重みです。 ACTV値、NEWC値に関しては、executorが内部カウンターからカウントした接続数をmanagerに渡したもので す。managerは、default2秒間隔でWEIGHTを更新しており(参考図)、そのサイクルを2回(default)繰り返すごとに 接続数(ACTV,NEWC)の情報を更新しています(参考図)。その2サイクルの間に(点線部)新しく入ってきた接続 数が、次の「NEWC」として反映されます。また、総接続数から次の接続数の更新時までに接続が終了した数を 引いたものが、「ACTV」として反映されます。 ・PORT値は,advisorを使用してサーバの状態を監視した時の、サーバに対するリクエストのレスポンス時間に 依存した値を表しております。レスポンスがない場合は、PORT値は「-1」となります。 ・SYS値は、Metric Serverなどのシステムの負荷を監視するツールにより、割振り先サーバーのCPU使用率やメ モリ使用率などのシステム負荷を監視している場合、その値が反映されます。 お客様によっては、定期的にmanager reportの出力結果を保管している事例もございます。 98 ケース1:dsserver / cbrserverが起動しない ポートの競合が発生しているケースが多い dsserverが使用するポート ポート 設定ファイル 変数名 用途 10099 dsserver LB_RMIPORT dsserverとdscontrolコマンドの通信 10199 dsserver LB_RMISERVERPORT dsserver自身の使用するポート 10004 metricserver LB_RMIPORT メトリック・サーバーとの通信 cbrserverが使用するポート ポート 設定ファイル 変数名 用途 10099 dsserver LB_RMIPORT dsserverとdscontrolコマンドの通信 10199 dsserver LB_RMISERVERPORT dsserver自身の使用するポート 10004 metricserver LB_RMIPORT メトリック・サーバーとの通信 競合するアプリケーションの停止を行う 各設定ファイルの変数値を変更することでも対応可能 ¾ ¾ AIXやLinux、Solarisの場合 :/usr/binディレクトリに存在 Windowsの場合 :C:¥WINDOWS¥system32に存在 99 ・ケース1:dsserver / cbrserverが起動しない ポートの競合が発生しているケースが多いです。netstatコマンド等にてポートが競合していないかを確認し、 競合している場合にはアプリケーションの停止、設定ファイルの見直しを実施して下さい。 99 ケース2:「エラー: サーバーが応答していません。」 dsserverとdscontrolコマンドとが通信出来ない場合に表示さ れるメッセージ dsserverプロセスは起動しているか? ¾ ¾ ¾ Javaプロセスが起動しているか確認して下さい。 Dispatcherの場合 ps –ef | grep java | grep SRV_KNDConfigServer CBRの場合 ps –ef | grep java | grep SRV_WTEConfigServer /opt/ibm/edge/lb/java/jre/bin/java -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Stack=false -cp /opt/ibm/edge/lb/servers/lib:/opt/ibm/edge/lb/servers/lib/ibmlb.jar:/opt/ibm/edge/lb/admin/lib/ChartRuntime.jar:/opt/ibm/ edge/lb/admin/lib/management.jar:/opt/ibm/edge/lb/admin/lib/tmx4jc.jar:/opt/ibm/edge/lb/servers/lib/CustomAdvisors DLB_INSTALL_PATH=/opt/ibm/edge/lb -DLB_CLIENT_KEYS_DIRECTORY=/opt/ibm/edge/lb/admin/keys -Dcom.ibm.edge.nd.ServerKeysDirectory=/opt/ibm/edge/lb/servers/key -Djava.protocol.handler.pkgs=com.ibm.net.ssl.internal.www.protocol com.ibm.internet.nd.server.SRV_KNDConfigServer 10099 /var/log/edge/ /opt/ibm/edge/lb/servers/configurations/dispatcher/ /opt/ibm/edge/lb/servers/bin/ default.cfg 10199 dscontrolコマンドの通信に使われるカギが壊れていませんか? ¾ ¾ ¾ 「lbkeys create force」コマンドで、鍵を再生成して下さい 生成された鍵は、/opt/ibm/edge/lb/admin/keysディレクトリにあります それでも直らない場合は、鍵ファイル名に付加されるIPアドレスをご確認下さい z z 例)dispatcher-<NFAアドレス>-10099.key、cbr-<NFAアドレス>-11099.key IPアドレスがNFAアドレスではない場合は、/etc/hostsファイルなどの設定を確認して下さい 100 ・ケース2:エラー:サーバーが応答していません。 dsserverとdscontrolコマンドとが通信出来ない場合に表示されるメッセージになります。dsserverプロセスの起 動確認とdscontrolコマンドの通信に使用される鍵が壊れていないかを確認して下さい。 (※)dscontrolコマンドとdsserver間にてSSLによる暗号化通信が実施されてます。IPアドレスを変更した場合に発 生する事がございますので、ご注意下さい。 100 ケース3: Manager Reportで全サーバー「-1」を返す (1/7) クラスター・アドレスはDispatcherに設定しましたか? ネットワークインターフェースに正しく登録されているか? ¾ ¾ ¾ [AIX] netstat –in [Windows] ipconfig /all [Linux] ifconfig -an goActive / goStandbyスクリプトを確認して下さい。 [MAC] 割振り先サーバー側の設定は行いましたか? [Windows/AIX] [Linux] ¾ ¾ ¾ 割振り先サーバーのループバック・アダプターにクラスター・アドレスを設定して下さい。 割振り先サーバーでiptablesの設定をして下さい iptables -t nat -A PREROUTING -d <CLUSTER_ADDRESS> -j REDIRECT 101 ・ケース3:Manager Reportで全サーバー「-1」を返す <クラスター・アドレスはDispactcherに設定しましたか?> クラスター・アドレスをネットワークインターフェースに正しく登録されているかを確認して下さい。また、 goActive・goStandbyスクリプトの設定を再度確認して下さい。 <[MAC]割振り先サーバー側の設定は行いましたか?> [WINDOWS/AIX]割振り先サーバーのループバック・アダプターにクラスター・アドレスを設定して下さい。 [Linux]割振り先サーバーでiptablesの設定をして下さい。 詳細につきましては、以下のTechnotesをご参照下さい。 ・Technotes - 「Aliasing alternatives for a loopback device when using MAC forwarding for Load Balancer」 http://www1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1%20=iptables&uid=swg21177105&loc=en_ US&cs=utf-8&lang=en 101 ケース3: Manager Reportが全サーバー「-1」を返す (2/7) [MAC]割振り先サーバー側でエキストラ経路の削除を行い ましたか? AIX5.1以降は、ループバック・アダプターにエイリアスを設定した際に 不要なエキストラ経路が作成されます ¾ ¾ ¾ エイリアスのネットマスクを実際のネットマスク(255.255.255.0等)ではなく、255.255.255.255で 設定すればエキストラ経路は作成されません。 実際のネットマスクでエイリアスを設定している場合は、route deleteコマンドでエキストラ経路 を削除します マシンIP: 192.168.10.10 Cluster:192.168.10.20 netstat -rnでルーティング・テーブルを確認 [/] netstat -rn Routing tables Destination Gateway Flags Refs Route Tree for Protocol Family 2 (Internet): default 192.168.10.1 UG 2 116730 192.168.10.0 192.168.10.10 UHSb 0 0 192.168.10/24 192.168.10.10 U 3 128811 192.168.10/24 192.168.10.20 U 1 1 192.168.10.1 127.0.0.1 UGHS 8 1946 192.168.10.255 192.168.10.10 UHSb 0 1 127/8 127.0.0.1 U 4 268 Use If en0 en0 en0 lo0 lo0 en0 lo0 PMTU Exp Groups - - => - => - 網掛け部がエキストラ経路 - Route Tree for Protocol Family 24 (Internet 「route v6): delete 192.168.10/24 192.168.10.20」で削除 ::1 ::1 UH 0 32 lo0 - - 102 ・ケース3:Manager Reportで全サーバー「-1」を返す < [MAC]割振り先サーバー側でエキストラ経路の削除を行いましたか?> AIX5.1以降は、ループバック・アダプターにエイリアスを設定した際に不要なエキストラ経路が作成され ますので、ご注意下さい。 102 ケース3: Manager Reportが全サーバー「-1」を返す (3/7) [MAC]割振り先サーバー側でエキストラ経路の削除を行い ましたか? Windows2000では、ループバック・アダプターにエイリアスを設定した 際に不要なエキストラ経路が作成されます ¾ AIXと異なり255.255.255.255のネットマスクでエイリアスの設定はできません route deleteコマンドでエキストラ経路を削除 ¾ ¾ 再起動の度にエキストラ経路が作成されるので、タスク・スケジューラーに経路削 除スクリプトを作成し登録するなど工夫が必要 route printでルーティング・テーブルを確認 z 網掛けの経路がエキストラ経路「route delete 192.168.10.0 192.168.10.20 」で経路削除 Active Routes: Network Destination Netmask 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 192.168.10.0 255.255.255.0 192.168.10.0 255.255.255.0 192.168.10.10 255.255.255.255 192.168.10.20 255.255.255.255 192.255.255.255 255.255.255.255 192.255.255.255 255.255.255.255 127.0.0.0 255.0.0.0 224.0.0.0 224.0.0.0 224.0.0.0 224.0.0.0 255.255.255.255 255.255.255.255 Default Gateway: 192.168.10.1 Gateway 192.168.10.1 192.168.10.1 192.168.10.10 192.168.10.20 127.0.0.1 127.0.0.1 192.168.10.10 192.168.10.20 127.0.0.1 192.168.10.10 192.168.10.20 192.168.10.20 Interface Metric 192.168.10.10 1 192.168.10.20 1 192.168.10.10 1 192.168.10.20 1 127.0.0.1 1 127.0.0.1 1 192.168.10.10 1 192.168.10.20 1 127.0.0.1 1 192.168.10.10 1 192.168.10.20 1 192.168.10.20 1 マシンIP:192.168.10.10 Cluster:192.168.10.20 103 ケース3:Manager Reportで全サーバー「-1」を返す <[MAC]割振り先サーバー側でエキストラ経路の削除を行いましたか?> WINDOWS2000では、ループバック・アダプターにエイリアスを設定した際に不要なエキストラ経路が作 成されますので、ご注意下さい。 103 ケース3: Manager Reportが全サーバー「-1」を返す (4/7) [Windows] NICの設定を見直してみましょう TCP/IPフィルタリングを設定していませんか? ¾ NDは割振り先サーバーのヘルスチェックにpingも使用しています。このため、ICMPプロトコル が許可されている必要があります。IP プロトコルの Protocol 1(icmp) を許可してください Broadcom社製Ethernet Adapterを使用している場合 ¾ ¾ Broadcom社製Ethernet Adapterをご使用の場合は、Ethernet@Wirespeed機能を無効にする 必要があります。 ネットワーク・アダプター・プロパティーの詳細設定で、[Ethernet@Wirespeed]を[None]に設 104 定してください。(デフォルトはYes) ケース3:Manager Reportで全サーバー「-1」を返す <[Windows] NICの設定を見直してみましょう> ICMPプロトコルが許可されている必要がありますので、ご注意下さい。また、Broadcom社製Ethernet Adapterを使用している場合は、 Ethernet@Wirespeed機能を無効にする必要がありますので、ご確認下さ い。 104 ケース3: Manager Reportが全サーバー「-1」を返す (5/7) [Windows] NICの設定を見直してみましょう Task/ChecksumのOffload機能を使用していませんか? ¾ Task Offload機能とはOSではなくアダプター・レベルでTCP Checksumの計算を行う機能 です。Dispatcherでこの機能を使うと、Advisor機能が正常に稼動しませんので、無効化し て下さい ¾ ネットワーク・アダプターの製品によって、呼び方が異なることがありますので 注意してください。 例)Intel Pro 1000CT Network Connection 9 9 9 9 9 TCPセグメンテーションのオフロード 受信IPチェックサムのオフロード 受信TCPチェックサムのオフロード 送信IPチェックサムのオフロード 送信TCPチェックサムのオフロード 105 ・ケース3:Manager Reportで全サーバー「-1」を返す <[Windows] NICの設定を見直してみましょう> Task/ChecksumのOffload機能を使用している場合、無効化にする必要がありますので、ご確認下さい。 105 ケース3: Manager Reportが全サーバー「-1」を返す (6/7) Advisorのリクエストは正しく届いていますか? 割振り先サーバーのアクセスログを確認してください ¾ ¾ 監視リクエストがちゃんと届いていますか? 200 OKで返していますか? DispatcherのNFAアドレスからの監視リクエスト デフォルトは” HEAD / HTTP/1.0” 192.168.10.10 - - [21/Apr/2005:00:51:27 +0900] "HEAD / HTTP/1.0" 200 192.168.10.10 - - [21/Apr/2005:00:51:34 +0900] "HEAD / HTTP/1.0" 200 - 監視リクエスト・監視文字列は正しく設定されていますか? ¾ ¾ dscontrol server status :: で確認 監視リクエスト設定時の注意 z z dscontrol file newloadで読み込む 構成ファイルの中での設定 dscontrolプロンプトの中での設定 dscontrol server set :: adovisorrequest ”GET /TestServlet HTTP/1.0” adovisorresponse ”SUCCESS” z OSのプロンプトから入力するときは dscontrol server set :: adovisorrequest “¥”GET /TestServlet HTTP/1.0¥”” adovisorresponse “¥”SUCCESS¥”” 以下のように表示されてしまっている場合は、間違い advisor 要求 ................... ¥"GET /TestServlet HTTP/1.0¥“ advisor 応答 ................... ¥”SUCCESS¥” サーバー状況: ------------サーバー ................bronze ポート番号 ..............80 クラスター ..............192.168.10.20 クラスター・アドレス ....192.168.10.20 静止 ....................N サーバー・アップ ........Y 重み ....................10 固定重み ................N ルールのスティッキー ....Y リモート・サーバー ......N ネットワーク・ルーター・アドレス 0.0.0.0 連結 ....................N advisor 要求 ............GET /TestServlet HTTP/1.0 advisor 応答 ............SUCCESS Cookie (クッキー) 値 ....適用なし クローン ID .............適用なし 106 ・ケース3:Manager Reportで全サーバー「-1」を返す <Advisorのリクエストは正しく届いていますか?> Advisorのリクエストが割振り先サーバーに届いているかを、割振り先サーバーのアクセスログにて確認し て下さい。また、監視リクエスト・監視文字列が正しく設定されているかを確認して下さい。dscontrol server status ::コマンドにて以下のように出力されている場合には、正しく設定されておりません。 advisor 要求 ................... ¥"GET /TestServlet HTTP/1.0¥“ advisor 応答 ................... ¥”SUCCESS¥” 106 ケース3: Manager Reportが全サーバー「-1」を返す (7/7) Advisorのレスポンスは正しく返ってきていますか? アドバイザーのログレベルを5に上げて確認 ¾ dscontrol advisor loglevel http 80 5 ¾ ログレベル5のアドバイザーログの例 423 17:02:41.894 JST THD (192.168.10.20:80:cube): send method on socket 48 投げたアドバイザー >>>GET /test.html HTTP/1.0^M 要求の文字列 Accept: */*^M User-Agent: IBM_Network_Dispatcher_HTTP_Advisor^M ^M <<< 423 17:02:41.895 JST THD (192.168.10.20:80:cube): timeoutreceive method (16) on socket 48 (中略) 423 17:02:41.764 JST THD (192.168.10.20:80:cube): Sleeping for socket 48 to open. iSleepTime ....... 128 ms _iCurrentLoad .... 136 ms Socketのオープンを待機中 _iTimeoutConnectMs 21000 ms 423 17:02:41.898 JST THD (192.168.10.20:80:cube): Select to receive - iRc = 1 423 17:02:41.898 JST THD (192.168.10.20:80:cube): Load is 124 監視している文字列 423 17:02:41.894 JST THD (192.168.10.20:80:cube): isSocketOpen() checking thread status: CMN_OpenSocketThread: Target(Cluster/Server) .. 192.168.10.20 Socket .................. 48 Port .................... 80 SleepTimeMs ............. 80 Status .................. Success Initialized ............. true KillMeNow ............... false Object Counts ........... 326/2/326 423 17:02:41.898 JST HTTPAdvisorResponse string : SUCCESS 423 17:02:41.898 JST HTTPReceivedData string : HTTP/1.1 200 OK^M Date: Sat, 23 Apr 2005 07:51:44 GMT^M Server: IBM_HTTP_SERVER/1.3.19.6 Apache/1.3.20 (Unix)^M Last-Modified: Sat, 23 Apr 2005 07:51:32 GMT^M ETag: "cce-72-4269fe84"^M Accept-Ranges: bytes^M Content-Length: 114^M 返ってきたレスポンスの文字列 Connection: close^M ・監視文字列が含まれているか? Content-Type: text/html^M ^M <HTML> <HEAD><TITLE>HealthCheckPage</TITLE></HEAD> <BODY> DB Access is SUCCESS ! All works well! </BODY> </HTML> 423 17:02:41.894 JST THD (192.168.10.20:80:cube): Socketがオープンできた Advisor socket 48 opened. 423 17:02:41.898 JST THD (192.168.10.20:80:cube): doRun: After getLoad. Returned 0. 423 17:02:41.894 JST THD (192.168.10.20:80:cube): doRun: Calling getLoad. 423 17:02:41.898 JST THD (192.168.10.20:80:cube): doRun: returning. 423 17:02:41.894 JST THD (192.168.10.20:80:cube): doRun: Calling getLoad. 423 17:02:41.898 JST THD (192.168.10.20:80:cube): The load returned: 124, the current load: 124 423 17:02:41.893 JST THD (192.168.10.20:80:cube): isSocketWaiting/_thNativeSocketThread.getStatus() = Success 正の値を返している 107 ・ケース3:Manager Reportで全サーバー「-1」を返す <Advisorのレスポンスは正しく返ってきていますか?> Advisorのレスポンスが正しく返ってきているかは、アドバイザーのログレベルを5に上げて確認して下さ い。上記にサンプル出力を添付させて頂きます。 107 ケース4:割振りが行われない (1/3) Dispatcherにパケットは届いていますか? 誰がクラスター・アドレスに応答しているか確認する 1. Dispatcherと同一ネットワークに存在するマシンからクラスター・アドレスにPing [/] ping cluster.internal.com PING cluster.internal.com: (192.168.10.20): 56 data bytes 64 bytes from 192.168.10.20: icmp_seq=0 ttl=255 time=0 ms 64 bytes from 192.168.10.20: icmp_seq=1 ttl=255 time=0 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=255 time=0 ms 2. クラスター・ア ドレスは正し くDispatcher に解決されて いますか? Pingを発行したマシンのARPテーブルを確認 [/] arp -a | more cluster.internal.com (192.168.10.20) at 8:0:5a:f8:63:91 [ethernet] stored in bucket 19 web2.internal.com (192.168.10.31) at 0:60:94:a3:8a:6d [ethernet] stored in bucket 20 web3.internal.com (192.168.10.33) at 0:2:55:76:16:4 [ethernet] stored in bucket 28 proxy.internal.com (192.168.10.11) at 0:6:29:4:5b:be [ethernet] stored in bucket 30 ? (192.168.10.1) at 0:e:38:91:a2:41 [ethernet] stored in bucket 66 ・・・ DispatcherマシンのMACアドレスを確認するには、Dispatcherマシン上でnetstat -inを 実行します。 ¾ [/] netstat Name Mtu en0 1500 en0 1500 lo0 16896 lo0 16896 lo0 16896 -in Network link#2 192.168.10 link#1 127 ::1 Address 8.0.5a.f8.63.91 192.168.10.20 127.0.0.1 Ipkts Ierrs 5602361 5602361 22553 22553 22553 0 0 0 0 0 Opkts Oerrs 457932 457932 22625 22625 22625 Coll 0 0 0 0 0 0 0 0 0 0 108 ・ケース4:割振りが行われない <Dispatcherにパケットは届いていますか?> 誰がクラスター・アドレスに応答しているかを確認する為、以下を実施して下さい。 1.Dispatcherと同一ネットワークに存在するマシンからクラスター・アドレスにPing 2. Pingを発行したマシンのARPテーブルを確認 108 ケース4:割振りが行われない (2/3) 割振り先サーバー側の仮想ホストの設定は正しいですか? 割振り先サーバー側で仮想ホストを設定したり、ListenするIPアドレス を限定する場合、Dispatcherのパケットがどのように変換されている か考える必要があります。 ¾ MAC転送方式の場合は、宛先IPアドレスは変換されませんので、仮想ホストはク ラスター・アドレスで設定する必要があります [MAC] エキストラ経路の削除は行いましたか? [MAC] 割振り先サーバー側での設定は行いましたか? [NAT/KCBR]ReturnAddressは正しく付けられていますか? NAT転送方式、KCBR転送方式では割振り先サーバーへのリクエスト の送信、および割振り先サーバーからのレスポンスの受信ために ReturnAddressが必要です。 構成ファイルの中で、指定したReturnAddressがDispatcher筐体上に 正しく設定されていますか? 109 ・ケース4:割振りが行われない <割振り先サーバー側の仮想ホストの設定は正しいですか?> 転送方式により異なりますが、Dispatcherのパケットがどのように変換されているかを確認して下さい。 <[MAC] エキストラ経路の削除は行いましたか?> →ケース3をご参照下さい。 <[MAC] 割振り先サーバー側での設定は行いましたか?>→ケース3をご参照下さい。 <[NAT/KCBR]ReturnAddressは正しく付けられていますか?> 構成ファイルの中で、指定したReturnAddressがDispatcher筐体上に正しく設定されているかを確認して 下さい。 109 ケース4:割振りが行われない (3/3) ネットワーク・トレースでどこまでパケットが届いているか 確認してください。 以下の2箇所にネットワーク・トレースを仕掛ける ¾ Dispatcherマシン ¾ 割振り先サーバー Dispatcher IHS どこでパケットが行方不明になっているのか切り分けて下さい 1. 2. 3. 4. 5. クラスター・アドレス宛にパケットが届いているか? 割振り先サーバーにパケットは送っているか? IHSにパケットは届いているか? IHSからレスポンスは正しく返っているか? Dispatcherからパケットは正しく返っているか? 110 ・ケース4:割振りが行われない <ネットワーク・トレースでどこまでパケットが届いているかを確認して下さい> Dispatchedrマシンと割振り先サーバーにてネットワーク・トレースを仕掛け、どこでパケットが行方不明に なっているかを確認して下さい。 110 ケース5: Takeoverが正常に完了しない goActive/goStandbyが正しく設定されているかご確認下さい [Unix] 各スクリプトに実行権限があることを確認してください 障害時にdsserverのjavaプロセスは存在しましたか? goActive/goStandby各スクリプトの呼出しはjavaプロセスによって行 われるため、プロセスもダウンしていた場合はTakeoverが発生しませ ん 111 ・ケース5: Takeoverが正常に完了しない <goActive/goStandbyが正しく設定されているかご確認下さい> 各スクリプトの設定内容、実行権限等を再度ご確認下さい。 <障害時にdsserverのjavaプロセスは存在しましたか?> プロセスダウン時に、dserverのjavaプロセスが存在したかどうかを確認して下さい。 111 ケース6:意図しないTakeoverが発生する Dispatcherマシン上でNTPが動いていませんか? HA構成時に、Heartbeatにより正副機相互で監視を行うロジックの中でシステム時間 が使われており、NTP(Network Time Protocol)により時間の調整が行われると、予期 せぬTakeoverの原因となることがあります。 ¾ NTPをsleuthモードで稼動させることにより、許容される時間の変更幅を0.1秒以内に抑えれば Dispatcherは問題なく稼動すると考えられますが、NTPが原因で発生した問題は、Best Effort でのサポートとなります。 NTPを停止しても問題が解消しない場合 Heartbeat間隔を広げ、 Heartbeatの断絶の可能性を減らします ¾ dscontrol executor set hatimeout <断絶を許容する秒数(デフォルト2)> z Heartbeatを2重化し、Heartbeatの断絶の可能性を減らします ¾ 広げすぎると障害発生時の検知が遅くなりますので注意が必要です Heartbeatを2重化した際にはReachabilityの設定が必要になります Heartbeatを行っているポートのネットワークトレースを採取します ¾ ¾ 正しくHeartbeatが行われているか確認してください Heartbeatは0.5秒間隔で送られているGREというパケットです 112 ・ケース6:意図しないTakeoverが発生する <Dispatcherマシン上でNTPが動いていませんか?> HA構成時に、Heartbeatにより正副機相互で監視を行うロジックの中でシステム時間が使われており、 NTP(Network Time Protocol)により時間の調整が行われると、予期せぬTakeoverが発生する事がありま す。 詳細は、以下のTechnoteをご確認下さい。 ・Technotes - 「Network Time Protocol support with WebSphere Edge Components」 http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=NTP&uid= swg21178386&loc=en_US&cs=utf-8&lang=en <NTPを停止しても問題が解消しない場合> 以下の対策を実施してみて下さい。 ・Heartbeat間隔を広げ、 Heartbeatの断絶の可能性を減らします ・Heartbeatを2重化し、Heartbeatの断絶の可能性を減らします ・Heartbeatを行っているポートのネットワークトレースを採取します 112 ケース7:セッションが維持できない IPStickyを使用している場合 携帯電話や一部プロバイダーからのリクエストはラウンド・ロビン・プ ロキシーを通過してくるものがあります ラウンド・ロビン・プロキシーを通過してきている場合、IPStickyでは セッションを維持できませんので、CookieやURL再書き込みでセッショ ンを維持する必要があります Cookieを使用している場合 Cookieはリクエストに含まれていますか? ¾ Cookieを発行する側の設定 ¾ クライアントのブラウザの設定を確認してください。 Cookieのパスは明示的に指定されていますか? PassiveCookieの設定が正しくできていますか ¾ Cookie名前、Cookie値にスペルミスなどありませんか? z z dscontrol rule status :: でCookie名の確認 dscontrol server status :: でCookie値の確認 113 ・ケース7:セッションが維持できない <IPStickyを使用している場合> ラウンド・ロビン・プロキシーを通過している場合、IPStickyではセッションを維持できませんので、ご注意下さい。 <Cookieを使用している場合> 以下の観点から、ご確認下さい。 ・Cookieはリクエストに含まれていますか? ・Cookieを発行する側の設定 ・PassiveCookieの設定が正しくできていますか (参考)セッションアフィニティについて ・IPSticky(MAC、NAT/NAPT転送方式) 負荷分散装置がクライアントのIPアドレスを覚えていてアフィニティを維持する。 ・PassiveCookie(KCBR転送方式、CBRコンポーネント) 割振り先サーバー側で発行したCookie を利用してアフィニティを維持する。 ・ActiveCookie(CBRコンポーネント) CBR自身が発行するCookieを利用してアフィニティを維持する。 ・SSLSessionID(KCBR転送方式) SSLのHandshake中に生成されるIDを用いてアフィニティを維持する。 クライアントがInternetExplorerの環境では使用できません。 113 ケース8:割振りが偏る 割振り先サーバーのアクセス・ログを確認してみて下さい 複数のIPアドレスからのアクセスですか? 特定IPからのアクセスではないですか? Dispatcherの前段にProxyServerが存在する場合など、特定 のIPからしかリクエストが来ない場合には、IPStickyは使用 できません。 114 ・ケース8:割振りが偏る <割振り先サーバーのアクセス・ログを確認してみて下さい> 複数のIPアドレスからのアクセスはないか、特定のIPからのアクセスではないかを確認して下さい。また、 Dispatcherの前段にProxyServerが存在する場合など、特定のIPからしかリクエストが来ない場合には、 IPStickyは使用出来ませんので、ご注意下さい。 114 ケース9:接続数が異常に多い 通常時と比べ、異常 な数ではないか? 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することは可能 z IPルールを設定し、ルールの割振り先サーバーに何も指定しない 115 ・ケース9:接続数が異常に多い <Manager Reportで表示される接続数が異常な値を示す> 特定の時間のみ、突然に接続数が急増したのであれば、外部から攻撃されている可能性があります。SYNフ ラッド攻撃について、上記に纏めましたので、ご確認下さい。 115 通信データ問題判別 通信データ解析 ipパケットの確認 - iptrace ipパケットの確認 - WireShark ieHTTPHeaders 116 116 IPパケットの確認 - iptrace ネットワークを流れるパケットをキャプチャするコマンド(AIX) iptraceコマンドでキャプチャを開始し、killコマンドで停止 ipreportコマンドによりフォーマット iptraceの一例 ¾ ¾ ¾ ¾ ¾ -a : ARPパケットを除く -b : 双方向のパケットを記録 -d : パケット送信先を指定 -s : パケット受信元を指定 -p : ポート番号を指定 9.170.251.98から9.188.52.71の80番ポートにアクセスする、 ARPパケットを除いた双方向のパケットについてキャプチャ ipreportの一例 ¾ ¾ -n : パケット出力の先頭にパケット番号を記載 -s : 各行先頭にプロトコルを記載 (iptraceコマンド実行) host1@root[/usr/IBMIHS60]iptrace -ab -d 9.188.52.71 -s 9.170.251.98 -p 80 /tmp/trace/itrace (プロセス番号確認) host1@root[/usr/IBMIHS60]ps -ef | grep iptrace root 38242 1 0 18:28:43 - 0:00 iptrace -ab -d 9.188.52.71 -s 9.170.251.98 -p 80 /tmp/trace/itrace root 43666 42878 0 18:28:59 pts/4 0:00 grep iptrace (キャプチャ終了したら、iptraceのプロセス番号をkill) host1@root[/usr/IBMIHS60]kill -9 38242 (ipreportでフォーマット) host1@root[/usr/IBMIHS60]ipreport -ns /tmp/trace/itrace > /tmp/trace/ireport 117 クライアントとIHS間、IHSとWAS間でパケットレベルでトレースを取得したい場合に用いられるツールの 一つにiptraceがあります。iptraceはAIXでのみ用いることが出来ます。iptraceは、iptraceコマンドを実行に よりネットワークを流れるパケットのキャプチャを開始し、killコマンドで停止した後、さらにipreportコマンド を用いてフォーマットすることで、パケットの様子を知ることが出来ます。iptrace、ipreportコマンド実行時に よく用いられるオプションは以上の通りです。上記の例では、9.170.251.98から9.188.52.71の80番ポート にアクセスする、ARPパケットを除いた双方向のパケットについてキャプチャし、さらにそれをipreportコマ ンドでフォーマットして出力させています。 117 iptraceで取得したパケットトレースファイル Packet Number 4 ETH: ====( 406 bytes received on interface en0 )====18:29:26.547582540 ETH: [ 00:0e:38:91:a2:41 -> 00:09:6b:2e:93:5d ] type 800 (IP) IP: < SRC = 9.170.251.98 > IP: < DST = 9.188.52.71 > (silver2) IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=392, ip_id=58485, ip_off=0 DF IP: ip_ttl=124, ip_sum=d5ea, ip_p = 6 (TCP) TCP: <source port=4614, destination port=80(http) > TCP: th_seq=9219e724, th_ack=698ffbb7 TCP: th_off=5, flags<PUSH | ACK> TCP: th_win=32120, th_sum=9545, th_urp=0 TCP: 00000000 47455420 2f204854 54502f31 2e310d0a |GET / HTTP/1.1..| TCP: 00000010 41636365 70743a20 696d6167 652f6769 |Accept: image/gi| TCP: 00000020 662c2069 6d616765 2f782d78 6269746d |f, image/x-xbitm| TCP: 00000030 61702c20 696d6167 652f6a70 65672c20 |ap, image/jpeg, | TCP: 00000040 696d6167 652f706a 7065672c 20617070 |image/pjpeg, app| TCP: 00000050 6c696361 74696f6e 2f766e64 2e6d732d |lication/vnd.ms-| TCP: 00000060 65786365 6c2c2061 70706c69 63617469 |excel, applicati| TCP: 00000070 6f6e2f76 6e642e6d 732d706f 77657270 |on/vnd.ms-powerp| TCP: 00000080 6f696e74 2c206170 706c6963 6174696f |oint, applicatio| TCP: 00000090 6e2f6d73 776f7264 2c206170 706c6963 |n/msword, applic| TCP: 000000a0 6174696f 6e2f782d 73686f63 6b776176 |ation/x-shockwav| TCP: 000000b0 652d666c 6173682c 202a2f2a 0d0a4163 |e-flash, */*..Ac| TCP: 000000c0 63657074 2d4c616e 67756167 653a206a |cept-Language: j| TCP: 000000d0 610d0a41 63636570 742d456e 636f6469 |a..Accept-Encodi| TCP: 000000e0 6e673a20 677a6970 2c206465 666c6174 |ng: gzip, deflat| TCP: 000000f0 650d0a55 7365722d 4167656e 743a204d |e..User-Agent: M| TCP: 00000100 6f7a696c 6c612f34 2e302028 636f6d70 |ozilla/4.0 (comp| TCP: 00000110 61746962 6c653b20 4d534945 20362e30 |atible; MSIE 6.0| TCP: 00000120 3b205769 6e646f77 73204e54 20352e31 |; Windows NT 5.1| TCP: 00000130 290d0a48 6f73743a 20392e31 38382e35 |)..Host: 9.188.5| TCP: 00000140 322e3731 0d0a436f 6e6e6563 74696f6e |2.71..Connection| TCP: 00000150 3a204b65 65702d41 6c697665 0d0a0d0a |: Keep-Alive....| Packet Number 5 ETH: ====( 362 bytes transmitted on interface en0 )====18:29:26.557472149 ETH: [ 00:09:6b:2e:93:5d -> 00:0e:38:91:a2:41 ] type 800 (IP) IP: < SRC = 9.188.52.71 > (silver2) IP: < DST = 9.170.251.98 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=348, ip_id=39246, ip_off=0 DF IP: ip_ttl=60, ip_sum=613e, ip_p = 6 (TCP) TCP: <source port=80(http), destination port=4614 > TCP: th_seq=698ffbb7, th_ack=9219e884 TCP: th_off=5, flags<PUSH | ACK> TCP: th_win=17520, th_sum=0, th_urp=0 パケットの受信元と送信先 受信元と送信先のポート番号 HTTPレスポンスヘッダの内容 118 上は先程の手順でipreportにより出力されたパケットトレースの一部です。クライアントから<SYN>パケット をリクエストし、サーバーが<SYN | ACK>をレスポンスを返すと言ったHTTP接続の一連の流れも見ること が出来ますし、HTTPリクエストやレスポンスのヘッダの内容を確認することが出来ます。 118 Wireshark(旧Ethereal)(1/2) フリーのパケットキャプチャーツール 以下のサイトからダウンロード可能 http://www.wireshark.org/ Windows、Linux、Unixといった多くのOSをサポート Wireshark導入マシンのネットワークインターフェースに対してパケットキャプチャーが可能 他OSで取得したネットワークトレースコマンド(tcpdump、iptraceなど)出力も読み込み可能 □ Wireshark導入マシン上のパケットキャプチャー ①「Capture」メニューから 「Interfaces」を選択 ④キャプチャー したパケットが 表示される ③任意のタイミングで 「Capture」メニューから 「Stop」を選択 ②調査対象インター フェースを選択し、 「Start」をクリック 119 119 Wireshark(旧Ethereal)(2/2) その他便利な機能 任意のTCPストリームを構成する全てのパケットを連結して表示(Follow TCP Stream) 表示するパケットのフィルタリングを実施(Display Filters) □ Follow TCP Stream ①任意のパケットを 選択し、 「Analyze」 メニューから「Follow TCP Stream」を選択 ②任意のパケット を含むTCPスト リームがTCPヘッ ダを除いた形で表 示される □ Display Filters ①「Analyze」メニューから 「Display Filters」を選択 ②HTTPのみやIPア ドレスによるフィ ルタリング表示を 選択可能 任意のフィルタリ ング定義を作成す ることも可能 120 120 ieHTTPHeaders フリーのHTTPヘッダーモニターツール 以下のサイトからダウンロード可能 http://www.blunck.se/iehttpheaders/iehttpheaders.html Internet Explorer(IE)に組み込まれ、リクエスト、レスポンス内 のHTTPヘッダーをリアルタイムに表示 IEのツールバーより「表示」→「エクスプローラーバー」→「ieHTTPHeaders」を選択 IEに組み込まれるため、暗号化(HTTPS)通信でもHTTPヘッダーは表示可能 画面上はコンテンツを表示 画面下はリクエスト、レスポンス のHTTPヘッダーを表示 121 121 おわりに 122 122 このセッションで学習したこと 問題判別の心得 IHS / WebSphere Application Server問題判別 Edgeに関するログ・トレース、症状別問題判別方法について確認しま した。 通信データ問題判別 IHS/WASに関するログ・トレース、JVM問題判別方法、症状別問題判 別方法について確認しました。 各種ツール紹介について確認しました。 Edge Component問題判別 確認すべきサイト、情報収集方法について確認しました。 通信データの内容を確認するためのツールについて確認しました。 (参考)Rational Application Developer問題判別 RADの紹介、症状別問題判別、Fix、オプション・フィーチャーの適用 方法について確認しました。 123 123 参考資料 WebSphere AS V6.1 Information Center DB2 Information Center http://publib.boulder.ibm.com/infocenter/pseries/index.jsp WebSphere Developer Domain http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp pSeries and AIX Information Center http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp http://www-6.ibm.com/jp/software/websphere/developer/ Diagnostics Guide http://www.ibm.com/developerworks/java/jdk/diagnosis/index.html 124 124 (参照)Rational Application Developer問題判別 問題判別 Rational Software の製品ポートフォリオ Rational Application DeveloperV7.0 パッケージ・ライセンス管理 症状別問題判別 125 125 Rational Softwareの製品ポートフォリオ IBM Rational Softeware Delivery Platform(SDP) 126 上記は、Rational Softwareの製品ポートフォリオになります。V7における共通の機能向上は以下になります。 <Open Computing> ・Eclipse 3.2.1 & JDK5 に対応 ・標準のサポート: Java 5, AJAX, Sun JRE ・Elite support for Eclipse <Consumability> ・最新のIBM ミドルウェアのサポート(WAS 6.1, WP 6.0, UDB 9) ・ライセンス・コンプライアンス: フローティング・ライセンスを指定可能(オプション) ・パフォーマンスとスケーラビリティーの向上 <Flexibility> ・新しいインストーラー ・既存のEclipse 上へインストール ・Rose/XDE/Robot 機能のより多くの取り込み 126 Rational Application Developer V7.0 Java 開発者を対象に高品質の Java/J2EE, ポータル、 Web, Webサービ スや SOA アプリケーションの迅速な開発、アセンブル、テスト、プロファ イル、デプロイをサポートするツール群 インストールするRational Application Developerのフィーチャーを選択するこ とにより、カスタマイズ可能 Rational Application Developer V7.0の新機能 ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ Eclipse 3.2 およびJDK5への対応 IBMミドルウェアの最新バージョンをサポート (WAS 6.1、WP 6.0、UDB 9) Webダイアグラム・エディターの強化 JSF開発機能の強化 Webサービス開発のユーザビリティ向上 J2EEセキュリティ・ツールの追加 J2Cサポートの拡大 静的コード・レビューの改善 デバッグ・ツールの強化 ポータル・ツールの新機能 127 Rational Application Developer V7.0は、Java 開発者を対象に高品質の Java/J2EE, ポータル、 Web, Web サービスや SOA アプリケーションの迅速な開発、アセンブル、テスト、プロファイル、デプロイをサポートする ツール群になります。インストールするRational Application Developerのフィーチャーを選択することにより、カス タマイズ可能です。 また、Rational Application Developer V7.0の新機能は、以下になります。 ・Eclipse 3.2 およびJDK5への対応 ・IBMミドルウェアの最新バージョンをサポート (WAS 6.1、WP 6.0、UDB 9) ・Webダイアグラム・エディターの強化 ・JSF開発機能の強化 ・Webサービス開発のユーザビリティ向上 ・J2EEセキュリティ・ツールの追加 ・J2Cサポートの拡大 ・静的コード・レビューの改善 ・デバッグ・ツールの強化 ・ポータル・ツールの新機能 127 パッケージの管理 オンライン、オフラインで適用可能 http://www.ibm.com/jp/software/rational/download/ifix/level.html IBM Installation Managerによるパッケージの管理 既存のEclipse環境へプラグインする事で、Rational製品を導入できる インストールするフィーチャーを選択できる 最新を含め、すべてのバージョンが表示される 適用したいバージョンを選択する パッケージのアンインストール、ロールバックも可能 128 RADのFix、オプション・フィーチャーの適用はオンライン、オフラインで適用可能です。詳細は、以下をご参照 下さい。 http://www-6.ibm.com/jp/software/rational/download/ifix/index.html 適用の際には、IBM Installation Managerを使用し、パッケージを管理します。非常に便利な機能であり、ネット ワークにつないでいる場合、自動検出をしてくれます。表示された項目を選択して、適用することが可能です。 また、IBM Installation Manager自身のFixpackも存在しますので、最新版にされます事をお勧め致します。 128 ライセンスの管理 IBM Installation Managerによるライセンスの管理 製品導入CDよりアクティベーション・キットを選択し、ライセンスキーを 入力する 評価版をアンインストールすることなく、そのまま製品版へとアップグ レードできる 129 IBM Installation Managerを使用し、ライセンスを管理します。RADを導入した際には、製品導入CDよりアクティ ベーション・キッドを選択し、ライセンスキーを入力して下さい。また、評価版をアンインストールすることなく、そ のまま製品版へとアップグレードする事が出来ます。 129 RAD症状別問題判別 どこで起こった問題か切り分ける!! ツールの使い方が分からない ¾ WASコンソール上でエラーメッセージ ¾ ¾ WASの問題判別と同様、コンソールやログより解析を行う 解析の際はPAコールも活用 アプリケーションの障害の場合は、デバッグを行い、バグの発見・修正 ウィザード使用やコンパイル時にエラー ¾ ¾ ヘルプ、チュートリアル、Webの記事(WebSphere/Rational Developer Domain etc.) を参照 まずはツールのFixを当ててみる(次項参照) org.eclipse.xxxx とトレースで出ていた場合は、ツールの障害である可能性も 再現を確認して、PAコール ツールのパフォーマンスが遅い ¾ IBM Rational Software Development Platform 製品群 パフォーマンスTips http://www-6.ibm.com/jp/developerworks/rational/mdd/performance/sdptips.html 上記以外では、 ¾ ¾ ディスクのデフラグ、ワークスペースの分割も有用 といっても、やはりPCのスペック(CPU/メモリ)を向上させることが一番!! 130 ツールを使用していて、何かおかしいと思ったときの問題判別としては、まず「どこで起こった問題か切り分け る」必要があります。 ツールの使い方が分からない ヘルプ、チュートリアル、Webの記事(WebSphere/Rational Developer Domain etc.)を参照して下さい。RADに は機能がたくさんありますので、これを参照することで解決する場合が多いです。 ・WebSphere Developer Domain http://www-6.ibm.com/jp/software/websphere/developer/ ・Rational Developer Domain ~Rational 製品に関する技術情報サイト http://www-06.ibm.com/jp/developerworks/rational/index.html ・Rational Developer Domainの中のRSDP http://www-06.ibm.com/jp/developerworks/rational/category/mdd/rsdp/ WebSphere フォーラム(日本語)~RAD、Eclipse、Java 開発に関するオンライン意見交換が可能 http://www.wsdeveloper.com/viewforum.php?f=7&sid=2d9db4ab6dfdda02359973dc11ded37d WASコンソール上でエラーメッセージ テスト環境のWASのコンソールでエラーメッセージが表示した場合は、通常のWAS問題判別と同様、コンソー ルやログより解析を行ってください。アプリケーションの障害の場合は、RADでデバッグを行い、バグの発見・修 正を行うことが出来ます。また、解析の際は必要に応じて、PAコールも利用して下さい。 ウィザード使用やコンパイル時にエラー まずはツールのパッケージを当ててみることを検討してみて下さい。修正リストに同じような症状があった場合 は、解決する可能性があります。パッケージの適用に関しては次頁を参照してください。org.eclipse.xxxx とト レースで出ていた場合は、ツール自体の障害である可能性があります。再現を確認して、PAコールして下さい。 ツールのパフォーマンスが遅い RADで開発する際には、開発ツール&WASテスト環境(その他にはDBMSなど)が同時に稼動することになりま すので、高スペックのPC環境が必要となります。以下にパフォーマンスTipsがまとめられていますので、パ フォーマンスが遅いと感じられる場合は、試してみる価値があります。 ・IBM Rational Software Development Platform 製品群 パフォーマンスTips http://www-6.ibm.com/jp/developerworks/rational/mdd/performance/sdptips.html これ以外には、ディスクのデフラグ、ワークスペースの分割も有用ですが、やはりPCのスペック(CPU/メモリ)を 向上させることが一番の解決策となります。 130