IBM i のメインメモリ管理について説明します。
基本的な動作
・通常、メインメモリにロードされ実行中のプログラムは、プログラムコード全てがメインメモリ上にロードされている訳ではありません。
・プログラムがメインメモリ上に存在しないページに記憶されている命令を実行しようとした場合、ページ不在 となります。
・このとき、もしメインメモリ上の全てのページが使用中であった場合、不在ページをメインメモリ上にコピーするために(ページ・インするために)上書きしてもよいページを決定します。このときLRU(Least Recently Used)アルゴリズムで上書きするメインメモリ上のページを決定します。
上書きされる対象となったページがストレージから読み込まれて以降、変更されているならば不在ページを読み込む前にストレージに書き出しを行います。この処理を ページング と呼びます。
・ページ不在となると、実行中のタスクは制御権を喪失し、他のタスクが実行を開始します。実行優先順位に基づき、ページインしたいページがメインメモリ上にコピー完了したか、一定時間経過後(タイムスライス値経過後)、制御権を失ったタスクが再び制御権を獲得しプログラム実行が再開(継続)されます。
・LRUアルゴリズムでは、最も使用頻度の高いページは常にメインメモリ上にあるのでパフォーマンスがよくなります。ですが、メインメモリのサイズに比較して過剰な大量タスクがページを取り合うと、比較的新しいメモリ・ページが上書きされ始め、制御を受け取ったタスクはそれ自身ですぐページ不在になってしまう現象が発生します。この活動中のタスクによって新しく使われたページの循環的な取り合いを スラッシング と呼びます。
・スラッシングは本来のプログラム実行に消費するべきCPU,ディスクをページイン・ページアウト処理のために占有してしまいパフォーマンス悪化をもたらします。
・スラッシングの根本的な解決策はメインメモリサイズを処理負荷に応じて適正に追加することだと思われますが、IBM i OSのアクティビティーレベル(活動レベル)を適正に調整することでも改善できる場合があります。IBM i OSのシステム値QPFRADJ(パフォーマンス自動調整)を1, 2, 3のいずれかにすることでアクテビティーレベルを適正に調整することが出来ます。一般にQPFRADJシステム値は2または3にしておくのがよいと思います。
※QPFRADJシステム値による調整は小刻みに行われ、それはWRKSYSSTS画面のプールの箇所を観察するとよくわかります。プールサイズや最大活動(数)が刻々変化(自動調整)するので機会があれば観察してみてください。
※参考: パフォーマンス・システム値: 記憶域プールと活動レベルの自動調整 https://www.ibm.com/docs/ja/i/7.5?topic=svpo-performance-system-values-automatically-adjust-memory-pools-activity-levels
■IBM i のクラス *CLSオブジェクト のPURGEパラメーターとページング動作
IBM i にはクラス *CLS というオブジェクトがあります。クラスはすべてのジョブ(プログラム)で使用されます。以下はIBM i OSデフォルト提供のクラス *CLSオブジェクトの一つ(QSYS/QBATCH クラスオブジェクト)でバッチジョブのデフォルトです。
前の章で説明した、プログラムからの要求に基づいてストレージから必要ページをメモリに移送するページング方式を 要求ページング と呼びます。
・上のクラス *CLS の除去可能(PURGE)パラメーターで NO が指定されたクラスを使用するタスク(ジョブ)においては、ページングが実行されるのは要求ページングが発生したときだけになります。
バッチジョブでは例えばユーザー端末(5250端末ほか)からの応答待ちは殆ど無く長時間実行されるので要求ページング以外は実行させたくない、ということになります。
・ところでもしCLSクラス・オブジェクトのPURGEパラメーターが *YESの場合、要求ページング以外にもタスク(ジョブ)が長時間の待ち(ロング・ウェイト)または *CLSのタイム・スライス値に達した場合、異なるページング方式が実行されます。
ロング・ウェイトの代表例は以下です。
- 5250端末でのユーザーからの入力待ち
- メッセージキュー *MSGQ へのメッセージ到着待ち
- プログラムやその他オブジェクトのロック待ち、データベースレコードのロック待ち
- プリンターなど低速な装置へのデータ送信
※ストレージへの入出力待ちはロング・ウェイトには含まれません。
・ロングウェイトが発生すると、タスクのページは直ちに開放され、他のタスクで利用可能となります。ロング・ウェイトが完了したとき(例:5250端末でユーザーが実行キーを押したとき)、プログラムの再活化に必要なタスクのページが一度にメインメモリにコピーされます。この操作を スワッピング と呼びます。
・PURGE *YES は対話型ジョブなどロング・ウェイトの発生が予想されるジョブに適している、とも言えます。実際、対話型ジョブでデフォルト使用される *CLSクラスオブジェクト QINTERでは、PURGE *YESが指定されています。