問題プログラムが原因でもシステムは落ちる

By 神居 - Posted: 2008/10/24 Last updated: 2010/06/17 - Leave a Comment

ちょっと驚かれるタイトルだったかも知れません。これは私の実体験から来ています。
MVSのJCLではREGION=0M(No Limit)っていうのが指定できます。バーチャル2GB一杯まで使えるだけ使うってことです。Authorizeされたプログラムの場合、いくつかの条件を満たしている時、仮想メモリーをバンバンとGETMAINして、LOCALページデータセットをFULLにしてしまうとMVSはDisable WAIT(コード03C)してしまいます。

    その条件とは、
  1. JCLでREGION=0Mを指定すること。
  2. APFプログラムとして実行されること。
  3. SYSEVENTマクロまたはPPT登録で空間をスワップ禁止状態にすること。
  4. GETMAINした領域には書き込みすること(ページの内容が変わること)。

この条件でGETMAINを延々と繰り返すと(LOOPすると)、ページデータセットを使い切った時点でコード03CでDisableWAITとなります。もちろんAux Storageが足らなくなってきたぞと警告だけはきちんと出ますが、それでも放っとくと最後は落ちます。APFは問題プログラムとは言わないだろうと思う人もいるかも知れませんが、ここでいう問題プログラムとはPSWの走行モード(SUPまたはPROBLEM)で言ってます。条件さえ満たせばPSW=問題プログラム、キー8の状態で起きます。
しかしスワップ禁止状態でなければ、AUX Storage Shortageになったらこのプログラムが動かなくなるだけです。OS自身は処理を継続します。ジョブをキャンセルすればStorage Shortageは解消します。またGETMAINだけしても書き込みしないでページの内容を変えなければページアウトされないのでAUX Storage不足にはなりません。

このケースは以前自分が担当してたサーバー系のソフトでサポートする端末台数の現実的な限界値をテストしようとして起こしたものです。その時は想定してなかったので結構あせりました。条件4はプログラムとしておかしくない、条件2と3はソフトの仕様ですからこれもおかしくないです。問題は条件1。安直に使ってしまったんですよねぇ、REGION=0Mを。REGION=nnMを切っとけばS878でガード掛かったんですけど…
それにしても長年MVSでシステムプログラマーやってましたが、まさかローカル・ページデータセットを一杯にしたらシステムダウンになるとは知らなかった…確かOS390のR8だったと思います。それ以来自分のプログラムでは基本的にREGION=0Mを使わなくなったのは言うまでもありません。

アセンブラー・プログラムでシステムを止めるって言うと、キー0で動くプログラムが間違ってOSの領域を壊してしまった時などのイメージがありますが、キー0でもなくSUPモードでもなくても時と場合によっては起こせるってことです。それにしても2GB分のページをしまって、さらに他のジョブ用に余裕を持たせるページデータセットのサイズってどの位必要なんだろう…

Posted in システムプログラマーのための手引きいろいろ • • Top Of Page