IBM iの実行管理機能は、システムに対する操作やシステム上のワークロードを制御するために必要なコマンドおよび内部機能を提供する。またアプリケーションのリソースを管理して、システムがアプリケーションを処理するのに必要な機能が含まれている。
IBM i 実行管理機能はWindows、Linuxなどオープン系基盤と最も異なるアーキテクチャの1つである。オープン系基盤は、アーキテクチャ的には1機能・1VM稼働を想定しているとも言え、複数のワークロードの処理負荷(例としてアプリケーションサーバーとデータベースサーバー、5250OLTP、各種通信系処理、日中バッチ処理など)を同時実行するような設計を基本的に実装していない。
それに対してIBM i は、IBMメインフレーム(IBM Z)のアーキテクチャを手本に多様なワークロードを1つのOS(VM)上でバランスさせて、最大のパフォーマンスとスループットを実現できるアーキテクチャを実装している。その代表が、IBM i の実行管理機能である。
IBM i上の実行環境の概要は、図表1のようになる。
システム値
IBM i OSが管理するシステム全般に関連する設定は、システム値と呼ばれるパラメータで指定する。
システム値はIBM i OS全般に対するデフォルト値であり、実行時の要件に応じて、たとえば「特定のユーザーIDに対して」や「特定のジョブ実行時」などにシステム値の設定をオーバーライド(ファイル名やファイルに関連した装置名などのファイル属性を一時的に変更)し、ジョブを実行させることもできる。
たとえば「通常は実行優先順位が30のジョブを、実行優先順位20で実行する」「ジョブの処理日付を通常はシステム日付と同一日時で動作させるが、月次処理で処理日をまたぐ場合はジョブ投入時のシステム日付で実行させる」などである。
サブシステム
サブシステムは、共通の特性をもったジョブに最適化した処理環境を設定するものである。たとえばサブシステム内での同時実行ジョブ数最大値、ジョブ実行時に使用するプール(メインメモリの論理エリア)、実行優先順位、言語環境(日本語、英語ほか)などがある。
サブシステムは、サブシステム記述(*SBSD)と呼ばれるオブジェクトで定義する。サブシステム記述には、サブシステムの属性が記述されている。サブシステム記述を指定してSTRSBSコマンドを実行することで、メインメモリ上にサブシステム実行環境が展開される。
ユーザー(またはIBM iシステム)がジョブを実行する際は、何らかの形で実行するサブシステムを決定して、例外なくいずれかのサブシステム上で実行される。
サブシステムはQBATCH、QINTER、QUSRWRKのようにシステム提供のサブシステム記述のほかに、ユーザーが独自にサブシステム記述を作成、実行することもできる。たとえば東西の端末、ユーザーで実行するサブシステムを分割する、などがある。
ジョブ
ジョブは、IBM i上で実行するプログラムの識別単位である。ジョブにはそれぞれユニークな名前が割り振られる。
ジョブ名の基本的なネーミングルールはジョブ名、ユーザー名、番号の組み合わせで表現される。図表2の場合、ジョブ名は 639263/GOMA/QPQDEV0004 となっている。またこのジョブの実行サブシステムは、QINTERであることがログからわかる。
ジョブの投入方法には、ジョブキューにSBMJOBする、5250端末でサインオンする、ODBC/JDBCで接続要求するなど、さまざまな形態がある。ジョブをIBM iに投入した時点で、実行を命令したユーザーは暗黙または明示的にさまざまなジョブ実行属性を指定する。
ジョブ実行属性には、CPUタイムスライス秒数や1回のCPU処理の最長処理時間、各種デフォルト設定(OUTQ、メッセージ出力するMSGQなど)といったさまざまな属性がある。
サブシステム記述とジョブ待ち行列
前述したようにサブシステムの属性は、サブシステム記述と呼ばれるオブジェクトで定義する。サブシステムが作業を処理する空間を表すとすると、サブシステム記述はその空間の設計図に相当する。
サブシステム記述には、必ずと言っていいほど「ジョブ待ち行列」が併せて定義されている。ジョブ待ち行列は入力の順番待ちを司る仕組みであり、ここに投入されるのは、ユーザーから見た作業の単位となる「ジョブ」である。
ジョブ待ち行列にジョブが投入されると、サブシステムの定義に従って、そのジョブ待ち行列に連結した活動中のサブシステム上でジョブが動き出す。
ジョブが開始されるには、ジョブ待ち行列に入る必要があるが、このジョブ待ち行列はどのように決定されるのだろうか。ジョブ待ち行列の決定要素について、SBMJOBというバッチジョブを投入するためのCLコマンドを例に取り、以下に解説する(図表3)。
SBMJOBコマンドにおけるジョブ待ち行列の省略値は*JOBDであり、SBMJOBコマンドの別パラメータであるJOBD(ジョブ記述、後述)に指定されたものを使用する。
さらに、JOBDパラメータの省略値は*USRPRFであり、ユーザー・プロファイルに指定されたジョブ記述から指定される。SBMJOBコマンドにおけるJOBQパラメータに、特定のジョブ待ち行列名を直接指定する。あるいは特別なジョブ記述を指定して、間接的に指定することも可能である。
なおジョブ待ち行列の決定方法は、ADDJOBSCDEコマンドによるジョブスケジュール登録機能(WindowsのタスクスケジューラやUNIXのcrontabに相当する)でも同様である。
ジョブ待ち行列はCRTJOBQコマンドで作成でき、作成されたジョブ待ち行列はADDJOBQEコマンドによって特定のサブシステムに関連づけられる。
このADDJOBQEコマンドで重要なのが、MAXACTパラメータである。このコマンドを使って、ジョブ待ち行列に投入されたジョブの同時並行実行数を指定する。
たとえば10個のジョブがジョブ待ち行列に投入された場合、そのジョブ待ち行列のMAXACTが1ならば、サブシステム上で活動するジョブの数は1個、そのジョブの終了後に次の1個、さらにそれが終了したら次の1個という動きを10回繰り返すことになる。
またMAXACTが5の場合は、最初に5個のジョブが同時に処理され、その5個のジョブのうち1個終わるたびに、ジョブ待ち行列上の残りのジョブが1つ取り出されて、ジョブが順次活動状態になる(図表4)。
ジョブ待ち行列のMAXACTパラメータをうまく利用することで、一時点で順列に処理したいジョブ群と同時並行で処理したいジョブ群を分割したり、システム上のリソース状況から判断し、ユーザー側でジョブ実行の並行度数を制御することが可能になる。
ジョブ記述
画面を媒介する対話型ジョブにしても、SBMJOBコマンドによるバッチジョブ開始にしても、そのジョブを実行する環境や性質(ジョブ属性)を、何らかの方法で決定する必要がある。
このジョブ属性を決定する際のテンプレートが、ジョブ記述である。1つのジョブ記述を複数のユーザー・プロファイルで共有したり、複数のジョブから参照することも可能である。
ジョブ記述でとくに重要なキーワードは、以下のとおりである。
・ジョブ待ち行列(JOBQ):ジョブを投入するための入口
・出力待ち行列(OUTQ) :スプール化された印刷データが、プリンタからの印刷の順番待ちをする場所
・初期ライブラリー・リスト(INLLIBL):ジョブが開始された際に使用するライブラリー群の一覧(UNIXのパスに相当するもの)
・メッセージのロギング(LOG):ジョブの実行結果の出力有無やログ・レベルの詳細化を決定
前述のSBMJOBコマンドと、ジョブ記述を作成するCRTJOBDコマンドでは、多くの共通したパラメータが存在する。ジョブの投入や生成だけなら、SBMJOBコマンドでジョブ記述を指定することで、おおよそのジョブ属性を決定できる。
ただし特定の場面で柔軟性をもたせられるように、SBMJOBコマンドでは指定したジョブ記述の内容を変更して実行できる。ここでも、必要な部分だけをオーバーライドして指定するという発想が基本になっている。
記憶域プール
IBM iでは、物理メモリを複数のエリア(記憶域プール)に分割し、実行するジョブのタイプごとに各プールを使い分けられる。このプールは、サブシステム記述において各サブシステムと関連づけられ、あるジョブを他のジョブから切り離して(資源の影響を受けずに)実行できるようになっている。
ジョブ待ち行列を経由して投入されたジョブがサブシステム上で活動を開始すると、そのサブシステムと関連するプールという資源を活用して、ジョブが処理される。
標準では、以下の4つのプールがあらかじめ設定されている。
・マシンプール:SLICなどのシステムタスクが使用
・ベースプール:OS基本機能、サーバージョブ、バッチジョブが使用
・対話型プール:5250対話型ジョブが使用
・スプールプール:印刷ジョブが使用
上記以外に、アプリケーションが占有使用するプールをユーザー独自で設定することも可能であり、これらすべてのプールに対して、サイズ(MB)および活動レベルを動的に変更できる(ただしマシンプールの活動レベルだけはシステムが設定するため、ユーザー側では設定できない)。
サイズは大きさや容量そのものであるが、活動レベルとは、そのプールで同時に活動できるジョブ数を指定するものである。活動レベルを大きくすれば、同時活動ジョブが増加し、スループットが上がるように思えるかもしれないが、メモリ上でページ・フォールト(ページ不在)が多発して、ディスクI/Oが増加することになり、逆にパフォーマンスの劣化を招く場合もある。
プールサイズおよび活動レベルは、その時点におけるシステム上で実行されているアプリケーションの特性などを考慮して決める必要があるものの、システム上で実行されているジョブの数や負荷特性、OSへの割り当てメモリ量によって最適値が変動する。IBM i ではプールサイズ、活動レベルを動的に調整・最適化する機能が搭載されている。
この設定は、システム値QPFRADJで制御できる。この値をオンにすると、システムが自動的に最適値に調整する。
出力待ち行列
サブシステム上で処理されたジョブは、ユーザープログラムによる帳票の印刷出力や、そのジョブの処理経過を記録したジョブ・ログ出力など、関連するプリンタ出力ファイル(スプールファイル)を出力して終了する(もちろん処理内容によっては、何も出力せずに終わるジョブも多数ある)(図表5)。
出力待ち行列とは、これらのスプールファイルが処理され、プリンタに送信されるまで待機する領域である。スプールファイルは、システム、もしくは印刷ファイルを使用するユーザーのいずれかによって作成される。
印刷ファイルは、プリンタ出力のための属性のデフォルト値が設定されているテンプレートのようなものであり、出力待ち行列(OUTQ)パラメータおよびプリンタ(DEV)パラメータが含まれる。
デフォルト設定は通常、*JOBであり、実行されたジョブの属性(そのジョブの実行時に指定されたジョブ記述など)によってオーバーライドされるものが大半である。ただし、なかにはQPJOBLOG(ジョブ・ログのテンプレート)のように、OUTQパラメータにQEZJOBLOGというシステム提供のジョブ・ログ用出力待ち行列が特別に指定されている場合もある。
著者
佐々木 幹雄氏
日本アイ・ビー・エム株式会社
テクノロジー事業本部
IBM Power テクニカルセールス
新・IBM i入門ガイド[操作・運用編]
01 IBM iの実行環境
02 IBM iのストレージ管理
03 IBM iのログ
04 IBM iのユーザー管理
05 IBM iのセキュリティ
06 IBM iの印刷機能
07 IBM iの保管/復元
08 IBM iの基本操作 [コマンド編]
09 IBM iの基本操作 [ツール編]
10 IBM iの監視 基本
11 IBM iサービス
12 IBM iのトラブルシューティング
13 操作・運用編 FAQ
[i Magazine 2024 Winter号掲載]