Natural バッファプール

このドキュメントでは、次のトピックについて説明します。


全般的な情報

Natural バッファプールは、同じコンピュータ上のオブジェクトにアクセスする複数の Natural プロセス間で Natural オブジェクトを共有するために使用されます。これは、コンパイルした Natural プログラムを実行に備えて配置するストレージエリアです。Natural ユーザーからの Natural オブジェクト要求に応じて、プログラムはバッファプールにまたはバッファプールから移動されます。

Natural ではリエントラントな Natural オブジェクトコードが生成されるため、Natural プログラムの 1 つのコピーを複数のユーザーが同時に実行できます。この目的のため、各オブジェクトは、呼び出し元が呼び出すたびにロードされるのではなく、システムファイルから Natural バッファプールに 1 回だけロードされます。

以下では次のトピックについて説明します。

バッファプール内のオブジェクト

バッファプール内のオブジェクトは、プログラムやマップなど、あらゆる実行可能なオブジェクトです。ローカルデータエリア、パラメータデータエリア、およびコピーコードの実行可能なオブジェクトは、コンパイル目的でのみバッファプールに配置されます。

Natural オブジェクトがバッファプールにロードされると、ディレクトリエントリと呼ばれるコントロールブロックがそのオブジェクトに割り当てられます。このコントロールブロックには、オブジェクトの名前、オブジェクトが属するライブラリやアプリケーション、オブジェクトの取得元のデータベース ID および Natural システムファイル番号などの情報と、特定の統計情報(プログラムを同時に実行しているユーザーの数など)が含まれます。

UNIX での調整

リソース共有では、バッファプールへのアクセスをすべてのユーザー間で調整する必要があります。これを実現するには、いくつかのシステムリソースが必要です。例えば、UNIX オペレーティングシステム上の共有メモリは、オブジェクトとその管理情報を格納するために使用されます。これらのオブジェクトへのアクセスを同期するには、一連のセマフォを使用します。使用可能な共有メモリの量とセマフォの数はオペレーティングシステムでスタティックに設定されます。そのため、システムパラメータの変更やインストール用のオペレーティングシステムカーネルの再作成が必要になる場合があります。これらのトピックの詳細はシステムに依存し、お使いの UNIX コンピュータのインストールドキュメントに記載されています。

複数のバッファプール

個々の要件に応じて、同じコンピュータ上で同じ Natural バージョンの異なるバッファプールを同時に実行することができます。

バッファプールにオブジェクトを保存する

ユーザーがプログラムを実行すると、バッファプールマネージャへの呼び出しが行われます。ディレクトリエントリが検索され、プログラムがすでにバッファプールにロードされているかどうかが確認されます。まだバッファプールに存在しない場合は、適切なライブラリからコピーが取得され、バッファプールにロードされます。

Natural オブジェクトがバッファプールにロードされると、このプログラムを識別するために新しいディレクトリエントリが定義され、また新しくロードするオブジェクトを収容するために、現在実行中ではない 1 つまたは複数の他の Natural オブジェクトがバッファプールから削除されることがあります。

この目的のために、バッファプールは、現在どのユーザーがどのオブジェクトを使用しているかを記録し、すべてのオブジェクトを解放することなくユーザーが Natural を終了する状況を検出します。他のアプリケーションに属する新しいオブジェクトに対応できるよう、使用されていないオブジェクトや古いオブジェクトをダイナミックに削除します。

読み取り専用バッファプール

読み取り専用バッファプールとは、読み取りアクセスのみを許可する特殊なバッファプールです。オブジェクトが読み取り専用のバッファプールにない場合、Natural はエラー 82(オブジェクトが見つかりません)を発行します。システムファイルで見つからないオブジェクトの取得は試行されないため、システムファイルおよびバッファプール上のすべてのロック操作はスキップされます。アカウントデータは収集されません。読み取り専用バッファプールにアクセスできるユーザー数に制限はありません。

読み取り専用バッファプールは、コンフィグレーションユーティリティで定義されます(下記の「バッファプールの設定」も参照)。バッファプールが読み取り専用バッファプールとして定義されている場合、ユーザーの最大数に対して定義された値は無視されます。

このユーティリティ NATBPSRV は、読み取り専用バッファプールにセマフォを割り当てません。ただし、これはローカルコンフィグレーションファイル(インストールの割り当て)内で定義された Natural パラメータファイルの場所にある <bufferpool-name>.PRL という名前のファイルのプリロードリストを想定しています。例えば、読み取り専用バッファプールの名前が "ROBP" である場合、ファイル名は ROBP.PRL である必要があります。

プリロードリストは、Natural ユーティリティ CRTPRL を使用して生成できます。このユーティリティはバッファプールの内容を抽出し、バッファプールの既存のプリロードデータとマージします。

PRL ファイルのプリロードリストには、コンマで区切られた次の形式のデータを持つレコードが含まれています。

database-IDfile-numberlibraryobject-namekindtype

ファイル内のキーワードは、NATBPMON ユーティリティの DIR コマンドで示されるキーワードと同じ意味を持ちます。

ディレクトリを記述するレコード(オブジェクトが FILEDIR.SAG の一部であることを示すオブジェクトの種類 D)を除き、値はすべてのキーワードに割り当てる必要があります。例:

Keywords NATBPSRV でバッファプールに以下をロードします
222,111,MY_LIB,PGM1,G,P データベース 222 およびファイル番号 111 にあるライブラリ MY_LIB からのプログラム PGM1のオブジェクトコード。
222,113,*,*,D LIBDIR.SAG は、FNAT=222,113 に存在します。
222,111,MY_LIB,*,D FILEDIR.SAGFUSER=222,111 に存在するライブラリ MY_LIB にあります。

読み取り専用バッファプールには、アプリケーションを詳細に把握する必要があるという短所があります(存在しないオブジェクトはロードできないため)。つまり、アプリケーションが必要とするすべてのオブジェクトをプリロードリストで指定する必要があります。まれに、アプリケーションに必要な完全なオブジェクトセットを事前に決定できます。

セカンダリ読み取り/書き込みバッファプール

Natural はプライマリバッファプールとして読み取り専用バッファプールで実行できます。このようなバッファプールは変更できません。読み取り専用バッファプールに存在しないオブジェクトはロードできません。オブジェクトが読み取り専用のバッファプールにない場合、Natural はエラー 82(オブジェクトが見つかりません)を発行します。これを回避するには、Natural を実行時にセカンダリ標準バッファプール(読み取り/書き込みアクセス可能)に接続し、そこで不明オブジェクトをアクティブにします。プライマリバッファプール内のオブジェクトの検索コールに失敗した場合、セカンダリバッファプールはバックアップバッファプールとして動作します。ダイナミックパラメータ BPID2 はセカンダリバッファプールを識別します。

読み取り専用バッファプール以外に、セカンダリバッファプールに接続できるユーザーの最大数は決まっており、セマフォによるオブジェクトのロックは、セカンダリバッファプールにアクセスするたびに実行されます。

読み取り専用バッファプールのプリロードリストは、ユーティリティ CRTPRL を使用して、セカンダリ読み取り/書き込みバッファプールの内容を読み取り専用バッファプールのプリロードリストにマージすることにより、更新/拡張できます。

代替の読み取り専用バッファプール

読み取り専用バッファプールの場合、コンフィグレーションユーティリティで代替バッファプールの名前を定義できます(下記の「バッファプールの設定」も参照)。

読み取り専用バッファプールでのみ使用可能な NATBPMON ユーティリティの SWAP コマンドを使用して、読み取り専用バッファプールを "廃止" としてタグ付けできます。廃止バッファプールに接続された Natural セッションはすべてこのバッファプールから切断され、代替バッファプールに接続されます。ただし、代替バッファプールも読み取り専用バッファプールである場合に限ります。Natural で新しいオブジェクトをロードしようとしたり(例えば CALLNAT または RETURN ステートメントを実行したとき)、スタックに配置されたコマンドを Natural で解釈しようとすると、別のバッファプールへの切り替えが発生します。廃止としてタグ付けされたバッファプールの IPC リソース(共有メモリセグメント)は、NATBPMON ユーティリティの SWAP コマンドを発行した後で削除できます。この機能を使用すると、Natural セッションを停止することなく、更新されたコンテンツを含む別の読み取り専用バッファプールでバッファとその内容を交換できます。

既知の問題:NATBPMON ユーティリティの IPCRM コマンドは、読み取り専用バッファプールに関連付けられたセマフォを削除しようとするエラーをレポートします。

CRTPRL ユーティリティを使用したプリロードリストの作成

ライブラリ SYSBPM にある Natural ユーティリティ CRTPRL は、読み取り専用バッファプールのプリロードリストを作成するために使用します。

このユーティリティは、プリロードリストのベースとしてソースバッファプールの内容を使用し、プリロードリストが読み取り専用(ターゲット)バッファプールにすでに存在するかどうかをチェックします。

  • プリロードリストが存在する場合、プリロードリストにある既存のデータはソースバッファプールのデータとマージされ、プリロードリストは新しい内容で保存されます。

  • プリロードリストが存在しない場合は、ソースバッファプールの内容を使用して作成されます。

結果のプリロードリストの内容により、読み取り専用バッファプールの内容が決定します。プリロードリストは、対応するオブジェクトを読み取り専用バッファプールにロードするユーティリティ NATBPSRV によって読み取られます。

制限

Natural バッファプールを使用する場合は、最低限の制限のみを考慮する必要があります。

  • Natural セッションがハングアップした場合は、UNIX コマンド kill -KILL(および kill -9)、端末コマンド break または中断用キーを使用して終了しないでください。

    このセッションでバッファプール内部データ構造の変更を実行している場合、更新が完全に完了していない段階で中断する可能性があります。バッファプールの内部データ構造が矛盾している場合は、悪影響を与えることがあります。

    代わりに、UNIX コマンド kill -TERM(または kill -15)を使用してハングアップセッションを終了します。

    注意:
    これは、Natural ニュークリアスがバッファプールルーチンを実行している場合にのみ発生します。

  • すべてのリソースは、1 つの Natural バッファプールのすべてのユーザー間で共有する必要があります。プロセスのグループメンバーシップは、バッファプールのアクセス権を付与するために使用されます。つまり、共有メモリはすべてのグループメンバーが変更できますが、他のユーザーは変更できません。同様のことがセマフォにも当てはまります。

    注意:
    同じ Natural バッファプールのすべてのユーザーは、UNIX オペレーティングシステム上の同じユーザーグループに属している必要があります。

バッファプールの設定

バッファプールの割り当ては、ローカルコンフィグレーションファイルに格納されます。バッファプールを設定するには、コンフィグレーションユーティリティを使用してローカルコンフィグレーションファイルに特定の値を指定する必要があります。これらの値のリストについては、『コンフィグレーションユーティリティ』ドキュメントの「バッファプール割り当て」を参照してください。

バッファプールを作成するためのユーティリティ NATBPSRV の使用

バッファプールは、ユーティリティ NATBPSRV を使用して作成されます。

注意:
ユーティリティ NATBPSRV は、他のバッファプールユーザーの作業に損傷を与える可能性があるため、アクセスできる Natural ユーザーを限定する必要があります。

NATBPSRV は、バッファプールに必要なリソースを割り当て、バッファプールに使用される恒久的な通信機能(共有メモリおよびセマフォ)を作成します。リソースと機能に必要な仕様は、コンフィグレーションユーティリティを使用して作成します(「バッファプールの設定」を参照)。

NATBPSRV ユーティリティは、起動手順 natstart.bsh

デフォルトでは、バッファプール NATBP が起動します。別のバッファプールを開始する場合は、次の NATBPSRV コマンド行オプションを使用して名前を指定します。

NATBPSRV BP = buffer-pool-name

NATBPSRV により、同じ名前のバッファプールがすでにアクティブになっていることがバッファプールの作成プロセスで検出された場合、すでにアクティブなバッファプールが削除されます。削除に失敗した場合、NATBPSRV により、適切なエラーメッセージが表示され、終了します。

NATBPSRV エラーメッセージ

NATBPSRV は、作成するバッファプールが読み取り専用バッファプールであることを意図している場合は、次のエラーメッセージを発行することがあります。

Unable to attach to buffer pool. Return code ... received from bp_init.
説明

プリロードリストで説明されているオブジェクトをロードするには、ユーザーとして NATBPSRV を以前に作成されたバッファプールに関連付けます。関連付けのプロセスに失敗しました。

処置

Software AG 技術サポートに連絡してください。


Unable to get parameter path.
説明

Natural のパラメータファイルを識別するローカルコンフィグレーションファイルで定義されたパスを確立できませんでした。

処置

Software AG 技術サポートに連絡してください。


File ... is not accessible.
説明

プリロードリストにアクセスできないか、存在しません。

処置

アクセス権を改訂するか、プリロードリストを作成します。


Unable to open file ...
説明

プリロードリストを読み取れません。

処置

プリロードリストを再度作成します。


Skipped erroneous record: '...'. Buffer pool may not operate correctly.
説明

プリロードリストに無効なレコードが見つかりました。レコードがスキップされ、ロードプロセスが続行されます。オブジェクトが見つからないために、アプリケーションでエラーが発生する可能性があります。

処置

レコードが手動で作成されている場合は修正するか、Software AG 技術サポートに連絡してください。


Unable to retrieve LIBDIR.SAG in FNAT(...,...). Application will not run.
説明

LIBDIR.SAG が見つかりませんでした。FNAT(...,...) に依存するアプリケーションは実行されません。

処置

レコードが手動で作成されている場合は修正するか、Software AG 技術サポートに連絡してください。


Buffer pool manager returned with error code ... . Buffer pool is not operational.
説明

FILEDIR.SAG バッファプールにロードすることができませんでした。バッファプールが小さすぎて FILEDIR.SAG を保持できないか、FILEDIR.SAG が破損しています。上記のメッセージは、どの FILEDIR.SAG が問題の原因であるかを示しています。

処置

レコードが手動で作成されている場合は修正するか、Software AG 技術サポートに連絡してください。


Buffer pool manager returned with error code ... . Error ... occurred.
説明

バッファプールへのオブジェクトのロード中にエラーが発生しました。

処置

通常、バッファプールのサイズが小さすぎることが原因です。サイズを大きくして、操作を繰り返します。問題が解決しない場合は、Software AG 技術サポートに連絡してください。


Object ... in library ... on system file (...,...) not found. Application may not run.
説明

処理されたプリロードレコードが、見つからなかったオブジェクトを参照しています。これは通常、アプリケーションが変更され、対応するプリロードリストが更新されていない場合に発生します。

処置

問題のプリロードレコードを除外/改訂します


Preload executed. Buffer pool is ready to run.
説明

すべてのプリロードレコードが処理されました。バッファプールはロック解除されており、Natural でそのバッファプールにアクセスできます。


バッファプールのモニタリング

バッファプールモニタは、バッファプールの動作を監視するために使用されます。バッファプールモニタを使用して、コンピュータ上で Natural を停止する必要がある場合にバッファプールをシャットダウンすることもできます。

バッファプールモニタは、Natural バッファプールの現在の状態に関する情報を収集します。

同じコンピュータ上で複数のバッファプールがアクティブになっており、複数のバッファプールにロードされているオブジェクトが Natural プロセスによって変更された場合、そのオブジェクトは、変更する Natural プロセスが付加されるバッファプールからのみ削除されます。

バッファプールモニタの使用方法の詳細については、「バッファプールモニタの使用(NATBPMON」を参照してください。

トラブルシューティング

このセクションでは、Natural バッファプールの使用時に発生する可能性のある問題とその解決方法について説明します。

ここでは、UNIX コマンド ipcs および adb について理解していることを前提としています。

一般的なコマンド出力の例と、実行中の間違いについての説明を以下に示します。

問題 1

Natural または Natural バッファプールモニタ(NATBPMON ユーティリティ)を起動できません。

以下の例では、Natural 管理者またはユーザーが直面する可能性のある最も一般的な問題を示しています。これらの問題は Natural または Natural バッファプールモニタを起動する際、バッファプールがアクティブではない場合に発生します。

  • 以下のコマンドで Natural を起動しようとします。

    natural bp = sag

    次のメッセージが表示されます。

    Natural Startup Error:    16
    Unable to open Buffer Pool, 
    Buffer Pool error:   "unexpected system call error occurred "  (20) 
    Global shared memory could not be attached.:   shmkey = 11111111
     
    Operating System Error 2 - No such file or directory
  • 次のコマンドで Natural バッファプールモニタの起動を試みます。

    natbpmon bp = sag

    NATBPMON プロンプトで WHO コマンドを入力すると、次のメッセージが表示されます。

    Buffer Pool error:   unexpected system call error occurred  (20) 
    Global shared memory could not be attached.:   shmkey = 11111111
    Operating System Error 2 - No such file or directory

解決策

  1. バッファプールを作成するためのユーティリティ NATBPSRV の使用」の説明に従って、バッファプールサービスを開始します。

  2. UNIX コマンド ipcs を使用して、必要なセマフォおよび共有メモリの存在を確認します。

    ipcs -m -s

    この出力結果は次のとおりです。

    IPC status from /dev/kmem as of Mon 23-MAY-2005 12:03:24.30 
    T     ID     KEY        MODE       OWNER    GROUP     
    Shared Memory: 
    m    807 0x4e425031 --rw-rw----      sag  natural     
    Semaphores:                         
    s     85 0x4e425031 --ra-ra----      sag  natural

    注意:
    上記の出力は、Natural バッファプールに属さないメモリセグメントおよびセマフォを除外するために編集されました。

    割り当てたキーで共有メモリセグメントまたはセマフォセットが見当たらない場合、バッファプールは開始されませんでした。

問題 2

Natural バッファプールと Natural ユーティリティが同じ Natural バージョンではありません。

ユーティリティでバッファプールを使用しようとすると、ユーティリティとバッファプールのバージョンが同一であるかチェックされます。バージョンが異なる場合、アクセスは拒否され、エラーメッセージが出力されます。

  • Natural を起動しようとすると、次のメッセージが表示されます。

    Natural Startup Error 16: Unable to open buffer pool.
    Buffer pool error: "Buffer pool does not correspond with your version of Natural"(25).
    Internal version of buffer pool is 0 but requested internal version is 1. 
  • Natural バッファプールモニタを起動しようとすると、次のメッセージが表示されます。

    Buffer pool error: Buffer pool does not correspond with your version of Natural (25).
    Internal version of buffer pool is 0 but requested internal version is 1.

解決策

使用している Natural バージョンがバッファプールバージョン番号に対応しており、内部バッファプールバージョン(BP バージョン)も正しいことを確認します。Natural と同じバージョンでバッファプールを再スタートしますが、他のユーザーがアクティブでないことを確認してください。

重要:
内部バッファプールバージョン番号(BP バージョン) は、サービスパックのリリース(製品バージョン番号の3 桁目)によって異なる可能性があります。例えば、Natural バージョン vrs で開始されたバッファプールは Natural バージョン vr(s+1) では使用できず、その反対も同じです。

バッファプールをシャットダウンして再起動する

通常、バッファプールをシャットダウンして再起動する必要はありません。これは、バッファプール内の重大な内部エラーによりバッファプールが使用不可能になった場合(発生することはまれです)、またはバッファプール構造を定義するパラメータが古くなったためにバッファプールが使用不可になった場合にのみ必要です。

NATBPMON ユーティリティがまだバッファプールにアクセスできる場合は、次の手順に従います。

  1. NATBPMON ユーティリティの SHUTDOWN コマンドを使用してバッファプールをシャットダウンします。

    SHUTDOWN コマンドが実行されると、新しいユーザーはバッファプールへのアクセスを拒否されます。

    ヒント:
    アクティブなバッファプールユーザーは、NATBPMON ユーティリティの WHO コマンドおよび STATUS コマンドを発行することで監視できます。

  2. 最後のユーザーがバッファプールへのアクセスを停止したら、NATBPMON ユーティリティの IPCRM コマンドを発行してバッファプールリソースを削除できます。

  3. バッファプールを再起動するには、十分な権限のあるアカウントからファイル natstart.bsh を呼び出します。

スーパーユーザー権限がある場合は、SHUTDOWN コマンドの FORCE オプションを使用できます。

  1. NATBPMON ユーティリティの SHUTDOWN FORCE grace-period コマンドを使用してバッファプールをシャットダウンします。

    このコマンドは、オプションを指定しない SHUTDOWN コマンドと同様に、新しいユーザーによるバッファプールへのアクセスを拒否します。ただし、終了シグナル SIGTERM はすべてのアクティブな Natural セッションに送信され、バッファプールから強制的にログオフされます。

    オプションのパラメータ grace-period を省略すると、このコマンドはすべてのアクティブセッションがシャットダウン処理を実行するまで待機した後、NATBPMON ユーティリティの IPCRM コマンドを実行します。

    オプションのパラメータ grace-period が指定されている場合、NATBPMON は、バッファプールにログオンしているセッションのクローズダウンステータスに関係なく、IPCRM コマンドを実行する前に、指定された秒数待機します。したがって、猶予時間として定義された値は、セッションが時間内に終了できるよう十分に長くする必要があります。

    注意:
    SHUTDOWN FORCE 0SHUTDOWN FORCE と同様です(パラメータ grace-period を指定しない)。

  2. SHUTDOWN FORCE コマンドを正常に実行した後にバッファプールを再起動するには、十分な権限のあるアカウントからファイル natstart.bsh を呼び出します。

NATBPMON ユーティリティがバッファプールのクリーンシャットダウンを実行できない場合は、オペレーティングシステムのコマンドを使用してバッファプールを削除する必要があります:

  1. UNIX コマンド ipcs を使用して、バッファプールの共有メモリおよびセマフォのステータスを検出します。

    ipcs -a -m

    ipcs -m -a コマンドの出力列 NATTCH には、現在共有メモリセグメントに接続されているプロセスの数が表示されます。例えば、次のようになります。

    IPC status from /dev/kmem as of Mon May 23 12:15:38.39 2002   
    T        ID    KEY      ...  OWNER  GROUP  ... NATTCH    SEGSZ 
    Shared Memory:                                             
    m        707 0x4e425031  ... sag    natural ...      7   153600
  2. 共有メモリに接続されているプロセスの数に、Natural ニュークリアスまたは現在実行中の NATBPMON ユーティリティが含まれていると思われます。これらのプロセスを実行しているユーザーに通知し、自分で終了するように依頼するか、ps コマンドを使用してプロセス ID を検出した後、UNIX コマンド kill を使用してセッションを終了します。

  3. 重要な作業にバッファプールを使用しているユーザーがいないことを確認したら、UNIX コマンド ipcrm を使用してリソースを削除できます。例えば、次のようになります。

    ipcrm -M 0x4e425031 -S 0x4e425031

    -M および -S オプションに指定される値は、バッファプールの起動に使用されるパラメータファイル内で指定された値である必要があります。

    UNIX コマンド ipcrm を使用して共有メモリおよびセマフォを削除する場合は注意してください。誤って間違ったリソースを削除してしまった場合、コンピュータ上で実行されている他のソフトウェア製品に重大な影響を与える可能性があります。

  4. 削除の結果は、UNIX コマンド ipcs を再度使用して確認できます。

    メモリセグメントまたはメッセージキューの一部がまだ表示されている場合は、他のソフトウェアに属しているか、他のプロセスが依然として接続しているために削除のためのマークが付けられている可能性があります。

共有メモリおよびセマフォを削除した後にバッファプールを起動できない場合は、コンピュータの再起動または Software AG サポートへの問い合わせを検討する必要があります。