Running out of ASIDs
z/OSでASIDの数が枯渇するという話です。
2年くらい前に開発環境構築後に経験したことを
今の知識で補足して書いてみようと思う。
ASIDの数は有限で、再利用出来るのと、再利用出来ないのがある。
WAS for z/OSを導入後、MQをBINDINGS MODEで繋ぐため、
JCLからREUSASID=YESを取り除いていた。
何度も再起動を繰り返すうちにASIDが枯渇して、
ついにはTSOユーザーのログインに支障をきたすまでに至った。
最終的に設定値の変更を反映させるためにRe-IPLが必要になった。
WASからMQにBINDINGS MODEで繋ぐには、
REUSASID=YESを取り除くのは必須です。
これをWASにおこなうために、私は手作業で数カ所直しましたが、
updateZOSStartArgs scriptというのが提供されているので、
取り外したい時は-removeオプションを使います。
Re-IPLする前に行った変更は何だったか?
自分が変更したわけではありませんが、
IEASYSxxメンバのパラメータを変更しているはずです。
関係するパラメータは3つあります。
Statements/parameters for IEASYSxx
MAXUSER
RSVNONR
RSVSTRT
念のためDIAGxxメンバのREUSASIDパラメータにも目を通しましょう。
V1R9からREUSASID=NOがデフォルトになっているので、
このパラメータが見つからない場合はREUSASID=NOになってます。
別の切り口になりますが、
z/OS上ではMQクライアントはBINDINGS MODEでしか接続できません。
ただしWAS for z/OSのみがCLIENT MODEも使えます。
JZOS Batch Launcherを使ったJavaアプリケーションが、
MQクライアントでBINDINGS MODEを使っていると、
そのASIDは果たしてどうなるのだろうか。
それをずいぶん前から気にしているが確認するまでに至ってなかった。
そこで今日ようやく思い立って、確認する方法を考えた。確認はしてない(笑
始めは何かコマンドが無いのかと探した。
結局、そういうコマンドを見つけられず、少々面倒臭いやり方を考えた。
ダンプから読めばいいじゃない(笑
さて、ここからアセンブラなこと言い始めます。
ASVTというマッピングマクロがある。
Address Space Vector Tableの略です。
これを読めば、ASIDの残数が分かると考えました。
z/OS V1R12.0 MVS Data Areas, Vol1 (ABEP-DCCB)等に収録されてます。
ASVTはIPCSでアドレスの代わりとして使えるようなので、
IP LIST ASVT
とやれば見れるはず。
通常は長さを指定しないといけないが、
なんか勝手に長さ測ってPOSITION(X'1E0')でリストしてくれてた。
ASVTのSTRUCTUREのフォーマットはサポートされていないので
CBFでフォーマットして見るのは無理です。ほんと面倒臭いですね。
見たい項目に関してIPCSコマンドをこんな感じでこさえました。
面倒臭いながらもPOSITIONを使えば少しは楽になる。
ASVTAAV
IP LIST ASVT ASID(X'0001') POSITION(X'+1E0') LENGTH(X'4') AREA
ASVTAST
IP LIST ASVT ASID(X'0001') POSITION(X'+1E4') LENGTH(X'4') AREA
ASVTANR
IP LIST ASVT ASID(X'0001') POSITION(X'+1E8') LENGTH(X'4') AREA
ASVTSTRT
IP LIST ASVT ASID(X'0001') POSITION(X'+1Ec') LENGTH(X'4') AREA
ASVTNONR
IP LIST ASVT ASID(X'0001') POSITION(X'+1F0') LENGTH(X'4') AREA
ASVTMAXI
IP LIST ASVT ASID(X'0001') POSITION(X'+1F4') LENGTH(X'4') AREA
ASVTMAXU
IP LIST ASVT ASID(X'0001') POSITION(X'+204') LENGTH(X'4') AREA
ASVTMDSC
IP LIST ASVT ASID(X'0001') POSITION(X'+208') LENGTH(X'4') AREA
・IEASYSxxのMAXUSER=ASVTMAXI
=ORIGINAL MAX USERS COUNT AS INPUT TO IEAVNP09.
・IEASYSxxのRSVNONR=ASVTNONR
=ORIGINAL SIZE OF NON-REUSABLE REPLACEMENT QUEUE
・IEASYSxxのRSVSTRT=ASVTSTRT
=ORIGINAL SIZE OF START/SASI QUEUE
・ASVTMAXU = ASVTMAXI + ASVTNONR + ASVTSTRT っぽい。
ASVTMAXUの式は私の予想だが、以下の注意書きがIEASYSxxにあることからも
この式は妥当なのではないかと考えられる。
Note that the sum of the values specified for the RSVSTRT, RSVNONR, and MAXUSER system parameters cannot exceed 32767.
各々の空きについては以下の箇所で管理している模様。
ASVTAAV=NUMBER OF FREE SLOTS ON THE ASVT AVAILABLE QUEUE
ASVTAST=NUMBER OF FREE SLOTS ON THE START/SASI QUEUE
ASVTANR=NUMBER OF FREE SLOTS ON THE NON-REUSABLE REPLACEMENT QUEUE
ASVTMDSCはMAXUSER DEFICIT SLOT COUNTで、
これにはしっかりと計算式が載っている。
ASVTMDSC = ASVTMAXI - ASVTAAV - NUMBER OF ACTIVE A.S.
INCREMENTED WHEN WE TRY TO TAKE A REPLACEMENT SLOT BUT THERE AREN'T ANY. DECREMENTED WHEN NON-ZERO AND A NONREUSEABLE ASID BECOMES REUSEABLE AND WE ADD A SLOT TO THE MAXUSER POOL WHEN AN ADDRESS SPACE BECOMES REUSEABLE.
つまり、ASVTANRに空きが無い状態で+1される。
ASID=0ではない再利用不可なASIDが再利用可能になった時に-1される。
ASVTMDSCはMAXUSER DEFICIT SLOT COUNTと書いてあり、
MAXUSERの負債スロット 数と直訳出来る。
まあ、MAXUSERのスロットが浸食されているということだろう。
平常時はこのカウントは0になってるようだ。
先にASVTANRの空きがなくなっていく。
再利用不可なASIDが再利用可能になった時という禅問答が残っているな。
それに対する答えはこれだと思う。
In effect, the ASID is "lost from use" for the duration of the IPL, or until all connected address spaces have terminated.
Re-IPLするか、Cross-Memoryで繋いでた全てのアドレス空間が終了するまで、
そのASIDは使いまわしが出来ないということのようだ。
Cross-Memoryというと、JDBCのType2接続でも同じな気がする。
MQやらDB2やらを停止しないといけないということは、
ほぼRe-IPLしているようなもの。ほんとに恐ろしい。
実際にMQクライアントでASIDが枯渇するのか確かめたいところだ。
監視という点では次のメッセージがある。
IEA059E ASID SHORTAGE HAS BEEN DETECTED
IEA060I ASID SHORTAGE HAS BEEN RELIEVED
IEA061E REPLACEMENT ASID SHORTAGE HAS BEEN DETECTED
IEA062I REPLACEMENT ASID SHORTAGE HAS BEEN RELIEVED
出来れば見たくないメッセージだけどね。