システム内でどのようなENQが発行されているかを知りたい場合があります。初期のMVSでは、ENQ情報はQCBとQELというコントロール・ブロックで管理され共通域に展開されていましたが、現在ではGRS(Global Resource Serialization)というコンポーネントによって管理され、ENQ情報もGRS空間にあります。そのため、従来のように共通域の制御表チェインをたどってENQされている資源を調べるような方法は採れなくなりました。代わりにGQSCANというサービスが提供されており、こちらを使用してシステム内のENQ情報を得ることができます。
GQSCANサービス
GQSCANは、OS内で発行されているENQに関する情報を返します。GQSCANを使うことによって、データセットなどシステム内のどの資源を誰が使用しているのか、誰が排他制御待ちになっているかなどを調べることができます。
発行されているENQの資源名リストを作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
OPEN (SYSPRINT,OUTPUT) OPEN SYSPRINT DATASET SPACE , * *----------------------------------* * * ISSUE GQSCAN TO EXTRACT * * * ENQ RESOURCES * * *----------------------------------* GQSCAN DS 0H GQSCAN AREA=(RIBAREA,4096), EXTRACT ENQ RESOURCES DATA + SCOPE=ALL,TOKEN=TOKEN STM RF,R0,RETCD SAVE RETURN CODE AND RIB LENGTH CH RF,=H'8' SUCCESSFUL ? BH GQSERROR NO, OCCURED UNEXPECTED ERROR CH RF,=H'4' NO RESOURCES ? BE NORESRCE YES, HANDLE IT SPACE , * *----------------------------------* * * EXTRACT QNAME/RNAMES FROM * * * RIB STORED AREA * * *----------------------------------* LA R2,RIBAREA LOAD RIB STORED AREA USING RIB,R2 ADDRESS TO RIB LR R4,R1 SET NUM OF RETURNED RIBS RIBLOOP DS 0H L R3,RIBNRIBE LOAD NUM OF RIBE MVC RESINFO+0(8),RIBQNAME SET QNAME LH RF,RIBVLEN LOAD RNAME LENGTH AH R2,RIBLEN LOCATE TO RNAME PART USING RIBVAR,R2 ADDRESS TO RIB VARIABLE PART MVC RESINFO+9(52),=CL52' ' CLEAR RNAME BCTR RF,0 FOR EX OPERATION EX RF,*+4+4 SET RNAME B *+4+6 (SKIP MODEL INSTRUCTION) MVC RESINFO+9(0),RIBRNAME (MODEL INSTRUCTION) LA R2,1(RF,R2) LOCATE TO 1ST RIBE USING RIBE,R2 ADDRESS TO RIBE RIBELOOP DS 0H MVC RESINFO+62(8),RIBEJBNM SET REQUESTOR JOBNAME MVC RESINFO+71(8),RIBESYSN SET REQUESTOR SYSNAME PUT SYSPRINT,RESINFO PUT RESOURCE INFO TO SYSPRINT : : : 必要なら何らかの処理を追加する : : AH R2,RIBELEN LOCATE TO NEXT RIBE BCT R3,RIBELOOP LOOP FOR NEXT RIBE BCT R4,RIBLOOP LOOP FOR NEXT RIB RIBDONE DS 0H ICM RF,B'1111',RETCD ALL RESOURCES ARE LISTED ? BNZ GQSCAN NO, CONTINUE : : : : : NORESRCE DS 0H GQSERROR DS 0H : : GQSCANの復帰コードをそのまま完了コードにして終了 : エラーの場合は何もせずに終了する : CLOSE SYSPRINT CLOSE SYSPRINT DCB L RF,RETCD COMPLETION CODE AS GQSCAN RETCD SVC 3 PROGRAM DONE... : : * *----------------------------------* * * LOGGING DATASET DCB * * *----------------------------------* SYSPRINT DCB DDNAME=SYSPRINT, SYSPRINT DATASET DCB(QSAM) + MACRF=PM,DSORG=PS,RECFM=FB,LRECL=120 RESINFO DC CL120' ' GQSCAN RESOURCE INFOMATION : : * *----------------------------------* * * GQSCAN WORKAREA * * *----------------------------------* RETCD DC F'0' GQSCAN RETURN CODE RIBLEN DC H'0' GQSCAN RIB FIXED PART LENGTH RIBELEN DC H'0' GQSCAN RIBE LENGTH TOKEN DC F'0' GQSCAN RESUME TOKEN SPACE , : : LTORG , USER LITERAL PLACE AT HERE DS 0D RIBAREA DC 4096X'00' 4KB RIB AREA : : ISGRIB , : : |
ENQされているすべてのリソース(Q名とR名)およびENQ元ジョブ名を印刷するサンプルです。AREAパラメーターで返されるENQ情報を格納する領域を指定します。ENQ情報は、RIBおよびRIBEという制御表の形式で返されます(元の情報はGRS空間内にあります)。システム内でどれだけのENQが発行されているかはわかりません。そのため、RIB返答領域は適当な大きさで用意します。サンプルでは4KBですが、IBMの推奨最小サイズは1KBです。用意した領域に入りきらない場合、GQSCANは復帰コード8で完了します。この時、TOKENパラメーターで指定したフルワードに再開用のトークン値がセットされるので、次のGQSCANで続きのENQ情報を得ることができます。最後のRIBが返されると復帰コードは0になります。
1 2 |
GQSCAN AREA=(RIBAREA,4096), EXTRACT ENQ RESOURCES DATA + SCOPE=ALL,TOKEN=TOKEN,WAITCNT=1 |
GQSCANのパラメーター設定によって、競合しており排他制御待ちのタスクがいるリソース(データセットなど)だけを戻すようにすることもできます。それらの情報は、D GRS,CコマンドやISRDDN(DDLIST)ツールなどを利用すればプログラムを作るまでもありませんが、GQSCANを利用すれば似たようなツールを作ることも決して難しくはありません。
RIBとRIBE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
+---------------------+ RIB I A(QCB) I このRIBに関連する制御表のアドレス 固定部 I : I I : I I F(返されたRIBE数) I I AL2(可変部の長さ) I 固定部の長さはx28バイト I XL1(SCOPEフラグ) I I AL1(RNAMEの長さ) I I CL8'QNAME' I +---------------------+ 可変部 I CLnn'RNAME' I 可変部の長さはR名長に依存する +---------------------+ RIBE I CL8'JOBNAME' I 1つ目のRIBE I : I I XL2(要求フラグ) I I XL1(状況フラグ) I I : I +---------------------+ RIBE I CL8'JOBNAME' I 2つ目のRIBE I : I I XL2(要求フラグ) I I XL1(状況フラグ) I I : I +---------------------+ 次のRIB I A(0) I このフィールドが0ならここはRIBではない。 固定部 I : I 続きのGQSCANを出す。 I : I I I |
RIBにはENQされている資源に関する情報、RIBEにはその資源を排他制御しているタスク(ジョブ)に関する情報が入ります。1つのENQリソースには、1つのRIBが作られます。共用ENQで複数のジョブやタスクがENQを保持していたり、排他ENQでも他のジョブやタスクがENQを要求して待ち状態になっている場合は、1つのRIBに複数のRIBEが作られます。AREAパラメーターで指定した領域に返されたRIBとRIBEの組み合わせをたどれば、ENQ情報を得ることができます。RIBとRIBEは、ISGRIBマクロによってマッピングすることができます。詳細はマニュアル「z/OS MVS:プログラミング:アセンブラー・サービスガイド」のリソース管理の章に記載されています。
Q名とR名で資源名リストをフィルターする
1 2 3 4 5 6 7 8 9 10 |
GQSCAN AREA=(RIBAREA,4096), EXTRACT ENQ RESOURCES DATA + RESNAME=(SCANQNAM), + SCOPE=ALL,TOKEN=TOKEN GQSCAN AREA=(RIBAREA,4096), EXTRACT ENQ RESOURCES DATA + RESNAME=(SCANQNAM,SCANRNAM,4,GENERIC), + SCOPE=SYSTEM,TOKEN=TOKEN : : SCANQNAM DC CL8'SYSDSN' SCANNING ENQ QNAME SCANRNAM DC CL44'USR1' SCANNING ENQ RNAME |
Q名のみ、もしくはQ名とR名の組み合わせでフィルターすることもできます。R名に関しては完全一致か、先頭が合っていればよいかの指定ができます。他にも、SCOPE(STEP、SYSTEM、SYSTEMS)、発行元システム名などでフィルターすることもできます。
ISGQUERYサービス
z/OS V1R6から提供されているGQSCANに代わる新たなサービスです。GQSCANは、非逐次化探索なので返答されたENQ情報は要求元によって変更されてしまっている場合がありますが、ISGQUERYではCMSEQDQロックを保持したまま発行できます。その他、GQSCANより機能や返される情報が増え、64ビット・アドレッシング・モードもサポートされています。GQSCANに相当するのがISGQUERY REQINFO=QSCANです。IBMは、GQSCANに代わりISGQUERYを推奨していますが、APIとしてはGQSCANより複雑です。最初はGQSCANで試してもいいでしょう。