8. トラブル
8.1 エラー状況の確認について
WebSphere MQの構成時やメッセージ処理中にエラーが発生した場合に、どこを確認するか、問題判別の概要についてご紹介します。
おもに、確認する項目としては、
- エラー・メッセージが出力されていないか?
- APIからエラーコードが戻されていないか?
- MQメッセージはどこにいるか?
- MQは正常に稼動しているのか?(チャネル、リスナー、MQプロセス等)
などがあります。
確認後、より詳細な情報が必要になる場合もあります。そのためにはトレースや統計情報の取得を求められることがあるかもしれません。
実際に問題を解決するにはいくつかの方法があります。最後の章では方法の選択肢について述べていきます。
また、詳細な内容を調べるためには以下のMQマニュアルをご参照ください。
8.2 エラー状況の確認について
1. エラーメッセージの出力先
MQは、そのシステム稼動状況について、メッセージを以下のディレクトリに出力します。
Windowsの場合
- wmq_dir\qmgrs\QMGRNAME\errors キューマネージャー名がわかる場合のエラー
- wmq_dir\qmgrs\@SYSTEM\errors キューマネージャー名がわからない場合のエラー(V6以降では使いません)
- wmq_dir\errors V6以降では、wmq_dir\qmgrs\QMGRNAME\errorsに出る以外のすべてのエラー。V6より前では初期段階でのエラー(MQの構成ファイルがない場合など)、MQクライアント・アプリケーションのエラー
- wmq_dir : WebSphere MQのインストールディレクトリ
- QMGRNAME : キューマネージャー名
Unixの場合
- /var/mqm/qmgrs/QMGRNAME/errors キューマネージャー名がわかる場合のエラー
- /var/mqm/qmgrs/@SYSTEM/errors キューマネージャー名がわからない場合のエラー(V6以降では使いません)
- /var/mqm/errors V6以降では/var/mqm/qmgrs/QMGRNAME/errorsに出る以外のすべてのエラー。V6より前では初期段階でのエラー(MQの構成ファイルがない場合など)*QMGRNAME : キューマネージャー名
エラーログファイルは、以下の3つになります。
- AMQERR01.LOG
- AMQERR02.LOG
- AMQERR03.LOG
それぞれのファイルサイズは256KBです。最新のメッセージは、AMQERR01.LOGに出力されます。
AMQERR01.LOGのサイズ256KB以上になると、AMQERR02.LOGがAMQERR03.LOGにコピーされ、AMQERR01.LOGは、AMQERR02.LOGにコピーされます。AQMERR03.LOGファイルの内容は破棄されます。
エラー・ログのファイルサイズはiniファイルのスタンザで変更することができます。(V6からの機能)
QMErrorLog:
ErrorLogSize=1048576 #1Mb Error log size
また、環境変数経由でも変更が可能です。
export MQMAXERRORLOGSIZE=1048576
2. MQのエラーメッセージの確認
前述のエラーログファイル中のエラーメッセージを確認します。メッセージに関する説明は、WebSphere MQのマニュアル「メッセージ」を参照します。
メッセージ番号は、以下のようにカテゴリ分けされています。
- AMQ4000 ~AMQ4999 WebSphere MQ for Windows システム・ユーザー・インターフェース・メッセージ
- AMQ5000 ~AMQ5999 インストール可能サービス・メッセージ
- AMQ6000 ~AMQ6999 共通サービス・メッセージ
- AMQ7000 ~AMQ7999 WebSphere MQ プロダクト・メッセージ
- AMQ8000 ~AMQ8999 WebSphere MQ 管理メッセージ
- AMQ9000 ~AMQ9999リモート・メッセージ
例)
AMQ9999: チャネル・プログラムが異常終了しました。
説明:
チャネル・プログラム'CHAN1' が異常終了しました。
処置:
障害の原因を判別するために、エラー・ファイルにあるチャネル・プログラム'CHAN1' の以前のエラー・メッセージを参照してください。
エラーメッセージ中の記述に従って、問題判別とその対応を実施します。
3. エラーコードの確認(MQRCコマンド)
前述のエラーメッセージ以外に、MQのAPI(MQCONN/MQOPEN/MQPUT/MQGET等)をCallした時には、APIの戻り値として以下の2つの値が戻ります。
MQCCは、API呼び出しが成功したかどうかの戻り値です。
0 MQCC_OK 「正常完了」 理由コードは常にMQRC_NONEです
1 MQCC_WARING 「警告」 呼び出しは部分的に完了。理由コード(MQRC)も返されます。
2 MQCC_FAILED 「呼び出し失敗」 理由コード(MQRC)に詳細が記述されます。
MQRC(理由コード)は通常4桁の数値で戻されます。
理由コードや前述したエラーメッセージのコードは、その内容をMQRCコマンドを利用して確認することができます。
<APIの戻り値理由コードの場合:例MQRC=2035のとき>
C:\>mqrc 2035
2035 0x000007f3 MQRC_NOT_AUTHORIZED
<エラーメッセージの場合:例エラーログ中のエラーメッセージAMQ9999の場合>
C:\>mqrc AMQ9999
536910233 0x20009999 rrcE_ABNORMAL_CHANNEL_END
MESSAGE:
チャネル・プログラムが異常終了しました。
EXPLANATION:
チャネル・プログラム'<insert one>' が異常終了しました。
ACTION:
障害の原因を判別するために、エラー・ファイルにあるチャネル・プログラム'<insert one>' の以前のエラー・メッセージを参照してください。
4. FDCファイル
MQの内部エラー等は、第1障害データ・キャプチャー・ファイル(FDC:First Failure Data Capture files)として詳細に出力されます。
出力ディレクトリは、以下になります。
Windowsの場合
wmq_dir\errors
wmq_dir : WebSphere MQのインストールディレクトリ
Unixの場合
/var/mqm/errors
ファイル名は、AMQnnnnn.mm.FDC となります。
ここで、
- nnnnn: エラーを報告するプロセスIDです。
- mm: 順序番号であり、通常は0です。
一般に、このファイルは、IBMのサポートセンターに送付し、障害解析のために利用されます。
FDCファイル出力例:
5.トレース
MQのトレースを取得することができます。
Windows版、Unix版, Linux版の場合 (AIX版はV6より)
以下のコマンドを使用して、トレースを取得します。
-
- strmqtrc (トレースの開始)
- endmqtrc (トレースの停止)
さらに、
Unix版およびLinux版では、トレース出力をフォーマットするために、次のコマンドを使用します。
dspmqtrc(フォーマット済みトレース出力)
一般に、トレースファイルは、障害解析のために、IBMサポートセンターからの依頼に応じて取得します。
詳細について8.6章をご覧ください。
注)MQ V6以降から、ファイルのアクセス許可レベルが以下のように変更されておりますのでご注意ください。
- システム・エラー・ログ
V6以降ではmqmのグループ・メンバーしかアップデートできません。
- キュー・マネジャー・エラー・ログ
V6以降ではmqmのグループ・メンバーしかアクセスできません。
- FDCファイル
V6以降では作成したユーザーしかRead/Writeできず、mqmのグループ・メンバーしかReadできません。
各MQのオブジェクトの状況を確認します。
- MQのメッセージがどこに滞留しているか?
- チャネルは正常に稼動しているかどうか?
- チャネルをメッセージ通過しているか?
などを確認します。
1. キューのステータス確認
- GUIを使う場合:MQエクスプローラーを利用して各キューの状態を確認します。
- コマンドを使う場合:MQSCコマンドを利用してキューの状況を確認します。
例)キューマネージャーQM1上のローカルキューLQ.QM1の現行メッセージ数(CURDEPTH:CURrent DEPTH)を表示します。
C:\>RUNMQSC QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2008. ALL RIGHTS RESERVED.
キュー・マネージャーQM1 に対してMQSC を始動中です。
DISPLAY QSTATUS(LQ.QM1)
1 : DISPLAY QSTATUS(LQ.QM1)
AMQ8450: キュー状況の詳細を表示します。
QUEUE(LQ.QM1) TYPE(QUEUE)
CURDEPTH(1) IPPROCS(0)
LGETDATE( ) LGETTIME( )
LPUTDATE( ) LPUTTIME( )
MEDIALOG( ) MONQ(OFF)
MSGAGE( ) OPPROCS(0)
QTIME( , ) UNCOM(NO)
END
2 : END
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
例)キューマネージャーQM1上のローカルキューLQ.QM1をオープンしているアプリケーションを表示します
(WMQ V5.3より、キューにアクセスしているプログラム名やプロセスIDを表示できるようになりました)
C:\>RUNMQSC QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2008. ALL RIGHTS RESERVED.
キュー・マネージャーQM1 に対してMQSC を始動中です。
DISPLAY QSTATUS(LQ.QM1) TYPE(HANDLE) ALL
1 : DISPLAY QSTATUS(LQ.QM1) TYPE(HANDLE) ALL
AMQ8450: キュー状況の詳細を表示します。
QUEUE(LQ.QM1) TYPE(HANDLE)
APPLTAG(WebSphere MQ\bin\amqsput.exe) APPLTYPE(USER)
BROWSE(NO) CHANNEL( )
CONNAME( ) ASTATE(NONE)
HSTATE(INACTIVE) INPUT(NO)
INQUIRE(NO) OUTPUT(YES)
PID(5056) QMURID(0.0)
SET(NO) TID(1)
URID(XA_FORMATID[00000000] XA_GTRID[] XA_BQUAL[])
URTYPE(QMGR) USERID(AA057018@AA0570180)
END
2 : END
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
例)キューマネージャーQM1上のローカルキューで、キュー名がLから始まり、かつメッセージが空でないものを表示します。
(WMQ V6より、SQL文のようにWHERE句で条件文をつけることができるようになりました)
C:\>RUNMQSC QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2008. ALL RIGHTS RESERVED.
キュー・マネージャーQM1 に対してMQSC を始動中です。
DISPLAY QSTATUS(LQ.QM1) TYPE(HANDLE) ALL
1 : DISPLAY QSTATUS(LQ.QM1) TYPE(HANDLE) ALL
AMQ8450: キュー状況の詳細を表示します。
QUEUE(LQ.QM1) TYPE(HANDLE)
APPLTAG(WebSphere MQ\bin\amqsput.exe) APPLTYPE(USER)
BROWSE(NO) CHANNEL( )
CONNAME( ) ASTATE(NONE)
HSTATE(INACTIVE) INPUT(NO)
INQUIRE(NO) OUTPUT(YES)
PID(5056) QMURID(0.0)
SET(NO) TID(1)
URID(XA_FORMATID[00000000] XA_GTRID[] XA_BQUAL[])
URTYPE(QMGR) USERID(AA057018@AA0570180)
END
2 : END
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
例)キューマネージャーQM1上のローカルキューで、キュー名がLから始まり、かつメッセージが空でないものを表示します。
(WMQ V6より、SQL文のようにWHERE句で条件文をつけることができるようになりました)
C:\>runmqsc QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2008. ALL RIGHTS RESERVED.
キュー・マネージャーQM1 に対してMQSC を始動中です。
DISPLAY QSTATUS(L*) WHERE(CURDEPTH GT 0)
1 : DISPLAY QSTATUS(L*) WHERE(CURDEPTH GT 0)
AMQ8450: キュー状況の詳細を表示します。
QUEUE(LQA.QM1) TYPE(QUEUE)
CURDEPTH(3)
END
2 : END
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
2.チャネルのステータス確認
チャネルが正常に稼動しているかどうか、また、チャネルを通過したメッセージ数(MSGS)を確認します。
AMQ6047: 変換がサポートされていません。
説明:
WebSphere MQ はCCSID 943 のタグ付きストリング・データをCCSID 819 のデータに変換できません。
処置:
「WebSphere MQ アプリケーション・プログラミング・リファレンス」の付録と該当する
National Language Support の資料を調べて、CCSID がシステムにサポートされているかどうかを確認してください。
この現象は、英語環境上のMQサーバーと日本語環境上のMQサーバーをチャネル接続する場合などに発生します。
対応:
- 英語のCCSID値に統一する
- デフォルトコードページを設定する(設定方法はシステム管理ガイドに記述)
キューマネージャーのCCSID属性値が英語のものであっても、日本語のMQメッセージのやり取りは可能です。
MQMDのCCSID値を適切に設定しておけば、日本語メッセージのコード変換も可能です。
1-2. リスナーが起動していない
リスナーが起動していない状態で、チャネルを開始すると以下のエラーメッセージが表示されます。
AMQ9202: リモート・ホスト'wmqwork (10.0.0.1) (1415)'が利用不能です。後で再試行してください。
説明:
TCP/IPを使用して、ホスト'wmqwork (10.0.0.1) (1415)'への会話を割り振ろうとしましたが、成功しませんでした。しかし、エラーは一時的なものであるかもしれないので、あとでTCP/IP会話を正常に割り振れる可能性があります。
処置:
あとで接続を再試行してください。失敗が続く場合は、エラー値を記録して、システム管理者に連絡してください。TCP/IPからのリターン・コードは10061(X'274D')です。
失敗の原因は、このホストが宛先ホストに到達できないためである可能性があります。
また、ホスト'wmqwork (10.0.0.1) (1415)'のリスニング・プログラムが実行されていないためである可能性もあります。この場合は、TCP/IPリスニング・プログラムの始動に関連する操作を実行して、再試行してください。
対応:
リスナーを起動して、チャネルを再度、起動します。
1-3. 順序番号が一致しない
バージョンアップ等で片側のチャネルを再作成した場合などに、チャネルのメッセージ順序番号が一致せず、チャネル接続エラーになるケースがあります。
AMQ9526:チャネル'QM1.TO.QM2' のメッセージ順序番号エラーです。
説明:
ローカルおよびリモート・キュー・マネージャーが、次のメッセージの順序番号を許可しませんでした。順序番号1 が予期されたときに、順序番号10 を持つメッセージが送信されました。
処置:
矛盾の原因を判別してください。これは、同期情報が壊れているか、または以前のバージョンにバックアウトされたことが原因と思われます。状況が解決できない場合は、RESET CHANNEL コマンドを使用して、チャネルの終わりの送信時に手動で順序番号をリセットすることができます。
対応:
この場合は、チャネルのリセット(RESET CHANNELコマンド)を行って、順序番号をリセットして、再度チャネルを開始します。
1-4. チャネルが未確定状態になる
通信エラーなどが発生してチャネル間での同期がとれずに、チャネル間でメッセージをコミットしていいか、バックアウトしていいかわからない状態です。
AMQ9507 チャネル'CHAN1' は現在未確定です。
説明:
チャネルがホスト'wmqwork' で未確定であるため、要求された操作が完了しません。
ユーザーの処置:チャネル状況を調べ、チャネルを再始動させて未確定状況を解決するか、またはRESOLVE CHANNEL コマンドを使用して問題を手動で訂正します。
対応:
それぞれのチャネルステータスを表示して、作業論理単位ID(LUWID)を確認します。
- 未確定側のチャネル
DISPLAY CHSTATUS(name) SAVED CURLUWID
- 受信側のチャネル
DISPLAY CHSTATUS(name) SAVED LSTLUWID
表示されるLUWID値を比較します。
2 つのLUWID が同じである場合、受信側は送信側が未確定であると見なす作業単位をすでにコミットしています。
この場合は送信側で、コミット処理を行います。
RESOLVE CHANNEL(name) ACTION(COMMIT)
2 つのLUWID が異なっている場合、受信側は送信側が未確定であると見なす作業単位をコミットしていません。
この場合は送信側では、バックアウト処理を行い、メッセージの再送信処理を行います。
RESOLVE CHANNEL(name) ACTION(BACKOUT)
1-5. アクセスできない(クライアント・サーバー接続)
MQクライアント(WindowsNT/2000/XP環境、またはUnix環境)から、クライアント接続する場合に、アクセス権限エラーが発生して接続に失敗する場合があります。これは、MQクライアント接続時には、MQクライアントアプリケーションを実行しているユーザーIDがMQサーバー側に送信され、そのIDをもとにアクセス権限のチェックが行われるからです。
例)サンプルのMQクライアントプログラムを実行したときのエラー
C:\>amqsputc LQ.MQM MQM
Sample AMQSPUT0 start
MQCONN ended with reason code 2035
C:\>MQRC 2035
2035 0x000007f3 MQRC_NOT_AUTHORIZED
C:\
対応:
- MQサーバー側のサーバー接続チャネルのMCAUSER属性に、サーバー側でMQにアクセスできるユーザーIDを指定する。(ただし、この場合はすべてのMQクライアントが接続できるようになります。別途セキュリティに対する考慮が必要です)
- MQサーバー側に、個別のクライアントのユーザーIDを設定して、適切なアクセス権限を付与する
2.MQのAPI関連
2-1. オブジェクトが見つからない
MQのオブジェクト(キュー、キューマネージャー、チャネル等)は大文字、小文字を識別します。
プログラムなどで、キュー名、キューマネージャー名を指定する場合は、大文字、小文字に注意してください。
特に、MQSCコマンドのDEFINEでキュー名を指定する場合、明示的に小文字で作成する場合には、' '(シングルクォーテーション)で囲む必要があります。
シングルクォテーションを使用せずに、小文字で指定すると、自動的に大文字に変換されて定義されます。
MQでは、便宜上、オブジェクト名を、大文字に統一することをお勧めします。
例)サンプルプログラムで、キューマネージャーMQM上のローカルキューSampleにアクセスする場合
C:\>amqsput SAMPLE MQM
Sample AMQSPUT0 start
target queue is SAMPLE
MQOPEN ended with reason code 2085 (<=エラー!)
unable to open queue for output
Sample AMQSPUT0 end
C:\>mqrc 2085
2085 0x00000825 MQRC_UNKNOWN_OBJECT_NAME
C:\>amqsput Sample MQM
Sample AMQSPUT0 start
target queue is Sample (<=OK!)
2-2. キューがOPENできない
共用アクセス不可のキューをすでに他のプログラムがオープンしている。または、他のプログラムが、MQOO_INPUT_EXCLUSIVEオプション指定で排他的にキューをオープンしているような場合は、別のプログラムがそのキューにアクセスしようとしても、MQOPEN時に、MQRC=2042の理由コードが戻り、オープンできません。
前述のQSTATUSコマンド等で、そのキューをオープンしている別のプログラムを確認し、必要に応じて終了します。
例)サンプルプログラムamqsgetで、キューマネージャーMQM上の共用不可のローカルキューLQ.MQMにアクセスする場合
C:\>amqsget LQ.MQM MQM
Sample AMQSGET0 start
MQOPEN ended with reason code 2042
unable to open queue for input
Sample AMQSGET0 end
C:\>mqrc 2042
2042 0x000007fa MQRC_OBJECT_IN_USE
C:\>echo DISPLAY QSTATUS(LQ.MQM) TYPE(HANDLE) ALL | RUNMQSC MQM
5724-B41 (C) Copyright IBM Corp. 1994, 2002. ALL RIGHTS RESERVED.
キュー・マネージャーMQM に対してMQSC を始動中です。
1 : DISPLAY QSTATUS(LQ.MQM) TYPE(HANDLE) ALL
AMQ8450: キュー状況の詳細を表示します。
QUEUE(LQ.MQM) PID(3488)
APPLTAG(D:\amqsgetl.exe) TID(1)
APPLTYPE(USER) CHANNEL()
CONNAME() BROWSE(NO)
INPUT(EXCL) INQUIRE(NO)
OUTPUT(NO) SET(NO)
USERID(mqadmin@wmqwork)
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
すでに別のプログラム'amqsgetl.exe'がLQ.MQMをオープンしているために、オープンできない。(理由コード2042)
対応:
対象となるキューをオープンしているアプリケーションの終了後、再度、キューをオープンします。
キュー属性を共用可能にする、あるいは、MQOPEN時のオプションでMQOO_INPUT_EXCLUSIVEを指定しなければ、複数アプリケーションでキューを共用できます。
2-3.キューがフル
MQPUTしようとするとキューFullになる。
キューのMAXDEPTH値以上メッセージをPUTしようとするとエラーになります。
例)キューマネージャーMQM上のローカルキューLQ.MQMにメッセージをPUTしようすると、Q_FULLのエラー
D:\>amqsput.exe LQ.MQM MQM < sample.txt
Sample AMQSPUT0 start
target queue is LQ.MQM
MQPUT ended with reason code 2053
Sample AMQSPUT0 end
D:\>mqrc 2053
2053 0x00000805 MQRC_Q_FULL
D:\>echo DISPLAY QL(LQ.MQM) MAXDEPTH CURDEPTH | RUNMQSC MQM
5724-B41 (C) Copyright IBM Corp. 1994, 2002. ALL RIGHTS RESERVED.
キュー・マネージャーMQM に対してMQSC を始動中です。
1 : DISPLAY QL(LQ.MQM) MAXDEPTH CURDEPTH
AMQ8409: キューの内容を表示します。
QUEUE(LQ.MQM) MAXDEPTH(5000)
CURDEPTH(5000)
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
D:\>
対応:
ローカルキューLQ.MQMの属性を確認すると、最大メッセージ数(MAXDEPTH属性)5000件に対して、すでに5000件のメッセージが滞留していることがわかります(CURDEPTH属性)。
滞留しているメッセージをMQGETで取り出すか、MAXDEPTH値を大きくすることで対応します。
2-4.キューがフル(ディスクフル)
MQメッセージは、キューファイルとして、ローカルファイルシステム上に保持されます。ディスクスペースが不足すると、MAXDEPTH以下のメッセージ数でもエラーになってPUTできません。(パーシスタントメッセージ、ノンパーシスタントメッセージのどちらでも起こりえます)
例)キューマネージャーMQM上のローカルキューLQ.MQMにメッセージをPUTしようすると、Q_SPACE_NOT_AVAILABLEのエラー
C:\>amqsput LQ.MQM MQM < sample10000.txt
Sample AMQSPUTL0 start
target queue is LQ.MQM
MQPUT ended with reason code 2056
Sample AMQSPUTL0 end
C:\>mqrc 2056
2056 0x00000808 MQRC_Q_SPACE_NOT_AVAILABLE
C:\>echo DISPLAY QL(LQ.MQM) MAXDEPTH CURDEPTH | RUNMQSC MQM
5724-B41 (C) Copyright IBM Corp. 1994, 2002. ALL RIGHTS RESERVED.
キュー・マネージャーMQM に対してMQSC を始動中です。
1 : DISPLAY QL(LQ.MQM) MAXDEPTH CURDEPTH
AMQ8409: キューの内容を表示します。
QUEUE(LQ.MQM) MAXDEPTH(500000)
CURDEPTH(27892)
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
C:\>
このとき、メッセージをPUTしようとしても、最大メッセージ数(MAXDEPTH属性猠件に対して件しか保持していません(CURDEPTH属性)。このときのドライブ空き容量は、24,576 バイトであり、ディスク容量自体が不足しています。
対応:
ディスク容量を増やすか、MAXDEPTH値を小さくして、少量のメッセージしか滞留しないようにします。
2-5.MQのメッセージがTruncateされる
MQに付属しているサンプルプログラム(amqsget)のメッセージのバッファエリアは100バイトです。それ以上のメッセージ長のメッセージをGETしたい場合には、バッファー領域を増やして、プログラムをリコンパイルすることで対応します。
例)サンプルプログラムamqsgetを用い100バイト以上のメッセージをGETしようとした場合
C:\>amqsget LQ.MQM MQM
Sample AMQSGET0 start
MQGET ended with reason code 2080
Sample AMQSGET0 end
C:\>mqrc 2080
2080 0x00000820 MQRC_TRUNCATED_MSG_FAILED
C:\>
補足:
MQGET時に、MQGMO構造体のOptionsで、"MQGMO_ACCEPT_TRUNCATED_MSG"を指定すると、バッファー長より大きなメッセージの場合、バッファー分を取得し、APIは警告メッセージを出力して、処理自体を完了させることができます。
8.6 トレース、統計、アカウンティング情報の取り方
トレース、統計、アカウンティング情報等、MQのシステムの動作情報を把握したい場合の手法についてご説明します。
1. トレース
1-1. MQトレースの使用目的
「トレース」は指定されたイベントの発生時に必要なデータを収集して時系列に出力していく問題判別の手法の一つです。MQの場合、すべてのキュー・マネジャーとMQクライアントに対してトレースを指定することができます。MQトレースではWindowsプラットフォーム以外、バイナリー・データとしてトレースが出力されますので、人間が解読できるようにするためには、トレース出力に対して「フォーマット」を行う必要があります。多くの場合、トレース取得はMQの障害が起こった場合にサポート・センターから要請されます。特に障害再現のテスト環境構築が困難な場合や障害を引き起こす要因が不明な場合に「トレース」は非常に有効ですが、その反面システムのパフォーマンスに多大な悪影響を与えるので、十分な注意を払ってトレースを設定しなければなりません。また、必要なトレースが取得できた後ではトレースをオフにしておくのを忘れてはなりません。
1-2.MQトレースの取得方法
MQエクスプローラーを使用して、MQトレースを開始するには、ルートのトップの「IBM WebSphere MQ」を右クリックして、「トレース」を選択します。
トレースの設定画面で、
「開始」ボタンをクリックします。トレースを終了するには「終了」ボタンをクリックします。MQ Exploreではトレースの細かいオプションは指定できません。コンポーネントを選択するためにはコマンド・インターフェースを使います。
Windows, Linux, UNIX系のプラットフォームでは、トレースの開始にはstrmqtrcコマンド、トレースの終了にはendmqtrcコマンドを使用します。トレースはOSの機能を利用する場合があるので、z/OS等それ以外のプラットフォームについては、マニュアルを確認するか8.7のMQの問題解決の方法あれこれをご覧ください。
デフォルトではトレースできるすべての項目についてトレースをとるようになっていますので、トレース・データ量を抑えるためには必要な項目だけを選択してトレースをとってください。
例) キューマネジャーQM1に対し、トレース・コンポーネントをすべて除外し、APIトレースだけをオンにしてトレースを開始します。
strmqtrc -x all -t api -m QM1
トレースの終了にはendmqtrcコマンドを使います。
トレースの出力先は明示的に指定したのでなければ、
Windowsの場合
wmq_dir\trace
wmq_dir : WebSphere MQのインストールディレクトリ
Unixの場合
/var/mqm/trace
です。
ファイル名はAMQppppp.qq.TRC です。
-
ppppp : トレース対象のプロセスID
-
qq : 0から始まる順序番号
1-3. MQトレースのフォーマット方法
Windowsプラットフォームではトレースがそのままテキスト・ファイルとして出力されますが、UNIXではバイナリー・ファイルとして出力されます。読める形にするためにはdspmqtrcコマンドでトレース・ファイルをフォーマットする必要があります。
例) 現行ディレクトリーのすべてのトレースファイルをフォーマットします。フォーマットされたファイルはAMQppppp.qq..FMTという名前で出力されます。
2.アカウンティング情報と統計情報
2-1. アカウンティング情報と統計情報の使用目的
トレースがイベントの発生毎にレコードが生成されるのに対し、アカウンティング情報と会計情報はある一定時間内に発生したイベントに対して情報をまとめて出力します。両方とも、デフォルトの出力間隔は1800秒(30分)です。出力はキューであり、PCF形式のメッセージとしてシステム・キューに出力されます。
出力設定対象の()内はMQSCコマンドで指定するパラメーター名です。アプリのコネクト・オプションのみAPI名を示しています。
2-2.MQアカウンティング情報と統計情報の取得方法
MQエクスプローラーを使用して、アカウンティング情報や統計情報の設定を行うには、それぞれの設定対象のプロパティー指定で行います。たとえばキュー・マネジャーのプロパティー画面では、以下のように指定を行うことができます。
C:\>runmqsc QM1
5724-H72 (C) Copyright IBM Corp. 1994, 2008. ALL RIGHTS RESERVED.
キュー・マネージャーQM1 に対してMQSC を始動中です。
ALTER QMGR ACCTMQI(ON)
1 : ALTER QMGR ACCTMQI(ON)
AMQ8005: WebSphere MQ キュー・マネージャーが変更されました。
END
2 : END
MQSC コマンドを1 つ読み取りました。
構文エラーがあるコマンドはありません。
有効なMQSC コマンドはすべて処理されました。
2-3. MQアカウンティング情報と統計情報の利用方法
アカウンティング情報と統計情報はキューに出力されるため、そのままで見ることはできません。サンプル・プログラムのamqsmonを使用して内容をフォーマットして出力することができます。
例)キューマネジャーQM1についてのアカウンティング情報を出力。メッセージはキューから消さない。
amqsmon -b -m QM1 -t accounting
MonitoringType: MQIAccounting
QueueManager: 'QM1'
IntervalStartDate: '2009-08-01'
IntervalStartTime: '22.43.55'
IntervalEndDate: '2009-08-01'
IntervalEndTime: '22.44.01'
CommandLevel: 700
ConnectionId: x'414d5143514d312020202020202020203d34744a2000a401'
SeqNumber: 0
ApplicationName: 'WebSphere MQ\bin\amqsput.exe'
ApplicationPid: 4856
ApplicationTid: 1
UserId: 'AA057018'
ConnDate: '2009-08-01'
ConnTime: '22.43.55'
DiscDate: '2009-08-01'
DiscTime: '22.44.01'
DiscType: Normal
OpenCount: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
OpenFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
CloseCount: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
CloseFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
PutCount: [1, 0]
PutFailCount: 0
Put1Count: [0, 0]
Put1FailCount: 0
PutBytes: [5, 0]
GetCount: [0, 0]
GetFailCount: 0
GetBytes: [0, 0]
BrowseCount: [0, 0]
BrowseFailCount: 0
BrowseBytes: [0, 0]
CommitCount: 1
CommitFailCount: 0
BackCount: 0
InqCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
InqFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
SetCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
SetFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
DurableSubscribeCount: [0, 0, 0]
NonDurableSubscribeCount: [0, 0, 0]
SubscribeFailCount: 0
DurableUnsubscribeCount: [0, 0]
NonDurableUnsubscribeCount: [0, 0]
UnsubscribeFailCount: 0
SubRqCount: 0
SubRqFailCount: 0
CbCount: [0, 0, 0, 0]
CbFailCount: 0
CtlCount: [0, 0, 0, 0]
CtlFailCount: 0
StatCount: 0
StatFailCount: 0
PutTopicCount: [0, 0]
PutTopicFailCount: 0
Put1TopicCount: [0, 0]
Put1TopicFailCount: 0
PutTopicBytes: [0, 0]
MonitoringType: QueueAccounting
QueueManager: 'QM1'
IntervalStartDate: '2009-08-01'
IntervalStartTime: '22.43.55'
IntervalEndDate: '2009-08-01'
IntervalEndTime: '22.44.01'
CommandLevel: 700
ConnectionId: x'414d5143514d312020202020202020203d34744a2000a401'
SeqNumber: 0
ApplicationName: 'WebSphere MQ\bin\amqsput.exe'
ApplicationPid: 4856
ApplicationTid: 1
UserId: 'AA057018'
ObjectCount: 1
QueueAccounting: 0
QueueName: 'LQ.QM1'
CreateDate: '2009-08-01'
CreateTime: '06.39.31'
QueueType: Predefined
QueueDefinitionType: Local
OpenCount: 1
OpenDate: '2009-08-01'
OpenTime: '22.43.55'
CloseCount: 1
CloseDate: '2009-08-01'
CloseTime: '22.44.01'
PutCount: [1, 0]
PutFailCount: 0
Put1Count: [0, 0]
Put1FailCount: 0
PutBytes: [5, 0]
PutMinBytes: [5, 0]
PutMaxBytes: [5, 0]
GetCount: [0, 0]
GetFailCount: 0
GetBytes: [0, 0]
GetMinBytes: [0, 0]
GetMaxBytes: [0, 0]
BrowseCount: [0, 0]
BrowseFailCount: 0
BrowseBytes: [0, 0]
BrowseMinBytes: [0, 0]
BrowseMaxBytes: [0, 0]
GeneratedMsgCount: 0
2 Records Processed.
例)キューマネジャーQM1についての統計情報を出力。メッセージはキューから消さない。
amqsmon -b -m QM1 -t statistics
MonitoringType: MQIStatistics
QueueManager: 'QM1'
IntervalStartDate: '2009-08-01'
IntervalStartTime: '23.08.47'
IntervalEndDate: '2009-08-01'
IntervalEndTime: '23.12.13'
CommandLevel: 700
ConnCount: 49
ConnFailCount: 0
ConnHighwater: 7
DiscCount: [22, 0, 0]
OpenCount: [0, 1326, 5, 0, 0, 118, 0, 0, 5, 0, 0, 0, 0]
OpenFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
CloseCount: [0, 1305, 2, 0, 0, 111, 0, 0, 5, 0, 0, 0, 0]
CloseFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
InqCount: [0, 1328, 1, 0, 0, 210, 0, 0, 5, 0, 0, 0, 0]
InqFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
SetCount: [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
SetFailCount: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
PutCount: [1174, 4]
PutFailCount: 0
Put1Count: [1, 0]
Put1FailCount: 0
PutBytes: [964816, 13476]
GetCount: [1174, 4]
GetBytes: [964712, 13276]
GetFailCount: 5
BrowseCount: [0, 99]
BrowseBytes: [0, 50112]
BrowseFailCount: 20
CommitCount: 30
CommitFailCount: 0
BackCount: 0
ExpiredMsgCount: 0
PurgeCount: 0
DurableSubscribeCount: [2, 0, 1]
NonDurableSubscribeCount: [0, 0, 0]
SubscribeFailCount: 0
DurableUnsubscribeCount: [0, 0]
NonDurableUnsubscribeCount: [0, 0]
UnsubscribeFailCount: 0
SubRqCount: 1
SubRqFailCount: 0
CbCount: [0, 0, 0, 0]
CbFailCount: 0
CtlCount: [0, 0, 0, 0]
CtlFailCount: 0
StatCount: 0
StatFailCount: 0
DurableSubscriptionHighWater: [2, 1, 1, 0]
DurableSubscriptionLowWater: [0, 0, 0, 0]
NonDurableSubscriptionHighWater: [0, 0, 0, 0]
NonDurableSubscriptionLowWater: [0, 0, 0, 0]
PutTopicCount: [0, 0]
PutTopicFailCount: 0
Put1TopicCount: [0, 0]
Put1TopicFailCount: 0
PutTopicBytes: [0, 0]
PublishMsgCount: [0, 0]
PublishMsgBytes: [0, 0]
MonitoringType: QueueStatistics
QueueManager: 'QM1'
IntervalStartDate: '2009-08-01'
IntervalStartTime: '23.08.47'
IntervalEndDate: '2009-08-01'
IntervalEndTime: '23.12.13'
CommandLevel: 700
ObjectCount: 21
QueueStatistics: 0
QueueName: 'SYSTEM.ADMIN.QMGR.EVENT'
CreateDate: '2009-08-01'
CreateTime: '06.31.37'
QueueType: Predefined
QueueDefinitionType: Local
QMinDepth: 0
QMaxDepth: 1
AverageQueueTime: [0, 0]
PutCount: [0, 0]
PutFailCount: 0
Put1Count: [1, 0]
Put1FailCount: 0
PutBytes: [104, 0]
GetCount: [0, 0]
GetBytes: [0, 0]
GetFailCount: 0
BrowseCount: [0, 0]
BrowseBytes: [0, 0]
BrowseFailCount: 0
NonQueuedMsgCount: 0
ExpiredMsgCount: 0
PurgeCount: 0
QueueStatistics: 1
QueueName: 'SYSTEM.CLUSTER.REPOSITORY.QUEUE'
CreateDate: '2009-08-01'
CreateTime: '06.31.38'
QueueType: Predefined
QueueDefinitionType: Local
QMinDepth: 0
QMaxDepth: 1
AverageQueueTime: [0, 441264698]
PutCount: [0, 1]
PutFailCount: 0
Put1Count: [0, 0]
Put1FailCount: 0
PutBytes: [0, 12316]
GetCount: [0, 1]
GetBytes: [0, 12316]
GetFailCount: 0
BrowseCount: [0, 2]
BrowseBytes: [0, 24632]
BrowseFailCount: 3
NonQueuedMsgCount: 0
ExpiredMsgCount: 0
PurgeCount: 0
:
8.7 MQ問題解決の方法あれこれ
MQでの問題解決の方法についてまとめてあります。
1. マニュアルやその他関連資料を読む
問題解決に限りませんが、正しい設定や機能の理解を深めるためにもマニュアルは必要です。製品にもドキュメンテーション・パッケージが含まれておりますので、お手持ちのPCに導入して参照することもできますが、外部WebでもMQ V7インフォメーション・センターとしてマニュアルを公開しております。左ナビの先頭にあるWebSpere MQタイトルをクリックすると、MQで提供されているマニュアル一覧が表示されますので、そこから読みたいマニュアルを選択していきます。
また、この「MQ設計虎の巻」の掲載されている、developerWorks JapanのMQコーナーでもいろいろなMQ関連の記事が公開されています。
2.サポート・センターに問い合わせる
正規のMQのライセンスをお持ちであり、かつメンテナンス契約(ソフトウェア・サブスクリプション&サポートといいます)がその時点で有効なものをお持ちであるお客様は、MQについてのテクニカルQAや障害に関する問い合わせや報告をIBMのサポート・センターに対して行うことができます。(古いバージョンでは、製品としてのサポートが切れている場合もあるのでご注意ください。)お問い合わせにはサポートIDが必要です。MQの問い合わせ先は、WebSphereブランド製品の窓口になります。
電話での窓口対応は、障害報告かつその緊急度が最高のものでない限り、通常の業務時間内に限られますが、Webでの問い合わせ(現在サービス・リクエストと呼ばれるインターフェースが用意されています)24時間使用可能です。
3.MQ研修に出る
日本アイ・ビー・エム人財ソリューション株式会社でMQの研修コースを用意しています。(有料) MQの設定やプログラミングの基本を一から学習したい場合にお奨めです。
4. MQのサポートWebで調べる
4-1. MQサポートWeb(US)の検索方法
無料で利用できる問題解決の方法としては、WebでのMQナレッジ・ベースの検索があります。
日本語でのソフトウェア技術検索メニューもありますが、無料で最もMQでの問題解決の可能性の高い方法は、MQの開発元のハーズレー(イギリス)で提供している、MQのサポートWebを検索することです。英語の壁という問題がありますが、世界中から集まってくるMQの障害に対する修正報告や、開発元からのヒント&チップスがここに集められてきますので、一番早く問題が解決する可能性があります。
英語で検索するのに慣れていない方は、まずはMQでのメッセージ番号やバージョン、プラットフォームの名前(RHEL, AIX, HP-UX等)、理由コード、APIや機能の名前(MQGET等)など検索結果を絞り込めるようなキーワードを指定してみましょう。
Additional Search termsの項目に追加のキーワードを入力するか、Document typeのプルダウンでTroubleshootinを選択して検索ボタンをクリックし結果を絞り込みます。また、最新日付順に並べ替えたいときにはSort results byプルダウンからDate - newest firstを選択します。
ご自分の問題に当てはまる文書をTechnote(技術文書)に見つけた場合、Resolving the problem(問題の解決策)の項目に、問題の回避策や、正しい設定方法が書かれている場合があります。
また、問題に対する修正が既に出ている場合もあります。タイトルの最初桁の番号(APAR番号といいます)が書かれているものは問題に対する修正の番号です。Fixes are availableと書いてある場合には、問題に対するFixがFixPackの中に組み込まれていることを示します。FixPackとは開発元が出している障害ご自分のバージョンに対するFixのリンクをクリックすると、そこからダウンロード・サイトにたどり着くことができます。
FixPackのダウンロードサイトなど、サポートサイトの中で、以下のようなIBM IDとパスワードの入力を要求されることがありますが、この登録は無料で行うことができます。registerのリンクをクリックします。
MustGatherの中にはトレース取得方法に関するものもあります。トレースはオペレーティング・システムの特性により取得方法や出力先が異なる場合があります。特にWindows, LinuxあるいはUnix以外のプラットフォームの場合にその傾向が顕著です。その場合はMustGather: Directions to start, end and format traceを試してみてください。用意されているリンクには以下のようなものがあります。
MQに関係ある他のコンポーネントのトレースのためのMustGather集もそこに用意されています。
5.MQのフォーラムに質問を投げる
試用版のMQでのテストなどでサポート・センターの利用ができない場合などでは、MQのフォーラムを利用することなども考えてみてください。必ず回答が得られるとは限りませんが、いろいろな人の意見を聞くことによって解決の手がかりが得られるかもしれません。