Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 解説


4.4.1 DAMファイル(TP1/FS/Direct Access)

DAMファイルサービスを使うと,OpenTP1ファイルシステム上のOpenTP1ファイルに直接編成ファイルとしてアクセスでき,トランザクションと同期してOpenTP1ファイルの状態を管理できます。OpenTP1でDAMファイルを使う場合には,TP1/FS/Direct Accessが必要です。

DAMファイルは,DAMサービス定義で,物理ファイル名論理ファイル名を指定します。物理ファイル名とは,OpenTP1ファイルを示す完全パス名のことです。論理ファイル名とは,物理ファイルと対応した論理的な名称です。論理ファイル名は,UAPからAPIでDAMファイルにアクセスするときや,コマンドで物理ファイル名と論理ファイル名の対応を変更するときに使います。論理ファイル名を使うことで,物理的な構造を意識しないでDAMファイルへアクセスできます。論理ファイル名と物理ファイル名は,1対1で対応づけます。

DAMファイルの構造を次の図に示します。

図4‒14 DAMファイルの構造

[図データ]

〈この項の構成〉

(1) DAMファイルの特長

DAMファイルの特長を次の表に示します。

表4‒10 DAMファイルの特長

説明する内容

特長

ファイル構成とレコード形式

DAMファイルは,直接編成ファイルです。事前にOpenTP1ファイルとして割り当てたファイルを使います。

レコード形式は固定長の非ブロック形式です。

アクセス形態

相対ブロック番号を使った直接アクセス法で,ブロックを参照または更新します。

連続した複数のブロックを一括して入出力することもできます。

トランザクションとの関係

トランザクション処理中に更新したブロックの内容は,次に示す場合にファイルに出力されます。

  • トランザクションがコミットしたとき

  • DAMサービス定義に指定した最大ブロック数に達したとき

トランザクションがロールバックした場合は,トランザクションを開始する以前の状態に回復されます。

ファイルのバックアップとリストア

DAMファイルのバックアップとリストアには,次のコマンドを使います。

  • dambkupコマンド

  • damrstrコマンド

バックアップファイルとバックアップ取得時点以降の回復用ジャーナルを基にDAMファイルの内容を最新の状態に回復できます。DAMファイルを回復する機能をDAM FRCといいます。

オンライン中のファイルの追加

オンライン中にファイルを追加する場合は,追加する物理ファイルを作成してから,damaddコマンドを使います。

オンライン中のファイルの削除

オンラインで使っているファイルを切り離す場合はdamrmコマンドを,切り離したDAMファイルの物理ファイルを削除する場合はdamdelコマンドを使います。オンライン中にファイルを削除する場合は,damrmコマンドで論理ファイルを切り離してから,物理ファイルをdamdelコマンドで削除します。

(2) DAMファイルの作成方法

OpenTP1ファイルシステム上に割り当てられたOpenTP1ファイルを物理ファイルといいます。オフラインでのDAMファイルへのアクセスは物理ファイルに対して行います。オンライン中のDAMファイルへのアクセスは,物理ファイルと1対1に対応した論理ファイルに対して行います。

OpenTP1ファイルシステムを作成したあと,DAMファイルを作成します。作成方法には,OpenTP1のコマンドによる方法と,OpenTP1で提供する関数による方法があります。

  1. コマンドを使ったDAMファイルの作成

    damloadコマンドで,物理ファイルを割り当てたあと,物理ファイルへ初期データを出力します。

  2. UAPを使ったDAMファイルの作成

    オフライン環境でdc_dam_create関数(ファイルの割り当て,初期データの出力)をUAPから呼び出して,DAMファイルを作成できます。

(3) DAMファイルの入出力関数

OpenTP1のUAPでは,DAMファイルにアクセスする関数(dc_dam_××××関数)を使用できます。UAPで使用できるDAMファイルサービスについては,マニュアル「OpenTP1 プログラム作成の手引」を参照してください。

(4) DAMファイルの排他制御

(a) 排他の単位

DAMファイルの排他には,ファイル単位で排他をかけるファイル排他と,ブロック単位で排他をかけるブロック排他があります。DAMファイルにファイル排他をかけるか,ブロック排他をかけるかを,DAMファイルをオープンするときに関数(dc_dam_open関数)の引数に指定します。通常は,ブロック単位で排他します。実際にファイルやブロックに排他をかけるのは,オープンしたDAMファイルのブロックを,更新したり,更新するために参照しようとしたときです。

DAMファイルをオープンしようとしたとき,そのファイルがすでにほかのトランザクションからファイル排他をかけられていた場合には,DAMファイルをオープンできないで,エラーリターンします。

(b) トランザクションと排他の単位

DAMファイルにアクセスするときは,トランザクションブランチ単位で排他制御します。また,グローバルトランザクション単位で排他制御することもできます。グローバルトランザクション単位で排他制御すると,同一グローバルトランザクションに属する複数のトランザクションブランチから同一ブロック,または同一ファイルにアクセスしても,排他エラーになりません。排他制御の単位は,DAMサービス定義の指定で変更できます。

グローバルトランザクション単位で排他制御する場合,トランザクションブランチごとにDAMファイルへアクセスしても,並列にアクセスできないで順次アクセスとなります。そのため,トランザクションの性能が下がる場合があります。トランザクションブランチごとのDAMファイルへのアクセスを並列に処理させる場合は,トランザクションブランチ単位で排他制御する指定をしてください。

排他制御の単位については,マニュアル「OpenTP1 プログラム作成の手引」および「OpenTP1 システム定義」を参照してください。

(c) 資源の排他解除待ちの設定

オープンしたDAMファイルのブロックを,更新したり,更新するために参照したりしようとしたとき,そのブロックがすでに排他をかけられていた場合に,排他が解放されるのを待つかどうかを,関数のパラメタで指定します。排他解除を待つ時間(排他待ち限界経過時間)を,ロックサービス定義で指定します。この排他待ち限界経過時間が経過しても排他が解放されない場合には,エラーリターンします。

(5) DAMファイルのディファード更新

トランザクションで更新したDAMファイルのブロックを,同期点の取得とは非同期に更新できます。この機能をディファード更新といいます。ディファード更新指定のDAMファイルは,トランザクションの同期点取得時には更新されないで,一定間隔で起動される出力専用プロセスから実更新されます。DAMファイルにディファード更新をする指定をしておくと,トランザクションの入出力回数を削減できるので,単位時間当たりのトランザクションのスループットを向上できます。

ディファード更新指定のDAMファイルと通常更新のDAMファイルを,一つのトランザクションから更新出力した場合には,どちらのDAMファイルも同期点で実更新します。

(a) ディファード更新するDAMファイルの指定方法

DAMファイルをディファード更新するかどうかは,DAMファイルごとに,DAMサービス定義で指定します。

出力専用プロセスが実行されるまでの間,ブロックを退避しておくバッファ領域と,出力専用プロセスから更新を実行する時間間隔を指定します。この実行間隔時間が長過ぎたり,バッファ領域の値が小さ過ぎる場合は,バッファ領域のオーバフローや,領域の空き待ち時間が発生する場合があります。ディファード更新の指定では,DAMサービス定義に指定するバッファ領域,および時間間隔の値の算出に注意してください。

(b) ディファード更新指定のDAMファイルを使用するときの注意

システム障害によるOpenTP1の異常終了が発生した場合,ディファード更新指定のDAMファイルでは,障害前に完了していたトランザクションのアクセスがDAMファイル上に反映されていないことがあります。この場合,トランザクションとDAMファイルの更新内容を保証するために,OpenTP1の再開始処理(全面回復処理)をしたあと,必ず正常に終了させてください。

また,障害以前に完了したトランザクションでも,出力専用プロセスの処理が障害前に完了していないと,全面回復後にロールバックとなることがあります。障害以前に完了済みのトランザクションをロールバックさせたくない場合には,アクセスするDAMファイルにディファード更新を指定しないでください。

ディファード更新指定のDAMファイルにディスク障害が発生した場合は,ファイル回復機能(DAM FRC)を必ず実行してください。

(6) DAMファイルのオンラインバックアップ

DAMファイルのバックアップを,OpenTP1のオンライン中に取得できます。これをオンラインバックアップといいます。DAMファイルのバックアップを取得するコマンド(dambkupコマンド)に-oオプション指定して実行すると,オンライン中にDAMファイルをバックアップできます。

オンラインバックアップしたファイルでDAMファイルを回復すると,回復に使用するアンロードジャーナルファイルの量が少なくて済みます。そのため,-oオプションを指定しないでバックアップしたファイルを使用してDAMファイルを回復する場合と比べて,DAMファイルの回復処理に掛かる時間が少なくて済みます。

なお,DAMファイルの回復処理は,対象となるDAMファイルをUAPが使用していると実行できません。その場合,対象となるDAMファイルをオープンしているUAPをいったん停止するか,またはOpenTP1を停止してください。

-oオプションを指定しない場合は,オフライン状態でバックアップすることになります。この場合,次の手順でバックアップしてください。

  1. damholdコマンドを実行して,論理ファイルを論理閉塞します。

  2. damrmコマンドを実行して,論理閉塞した論理ファイルをオンラインから切り離します。

  3. -oオプションを指定しないdambkupコマンドを実行して,DAMファイルをバックアップします。

(7) ユーザデータの抽出

DAMファイルの管理情報を除いたユーザデータだけを抽出できます。抽出したユーザデータをDAMファイルの初期データとして,damloadコマンドで割り当てることができます。ただし,抽出したユーザデータをdamrstrコマンドでリストアすることはできません。ユーザデータを抽出するには,dambkupコマンドに-dオプションを指定して実行します。

(8) ブロック長拡張機能

dambkupコマンドでバックアップしたファイルをリストアするとき,ブロック長を拡張してリストアできます。これをブロック長拡張機能といいます。ブロック長拡張機能を使うことで,ブロック長の異なるDAMファイルにデータを移行できます。

ブロック長拡張機能の方式には,バックアップ元DAMファイルのブロック構成を維持する方式とブロック構成を維持しない方式があります。各方式について次に示します。

ブロック長拡張機能を使用する場合は,次の点に注意してください。

(9) 標準入出力を使ったDAMファイルのバックアップとリストア

DAMファイルのバックアップ先に標準出力を,リストアの入力ファイルに標準入力を使えます。標準入出力を使うことで,コマンドのリダイレクトができるようになります。

標準入出力を使う場合には,dambkupコマンドおよびdamrstrコマンドに-sオプションを指定して実行します。

(10) 回復対象外のDAMファイルへのアクセス

トランザクションによる整合性の管理や障害時の回復を保証しないDAMファイルを作成できます。このようなDAMファイルを回復対象外のDAMファイルといいます。回復対象外のDAMファイルへは,トランザクションでない処理からブロックを更新したり出力したりできます。

回復対象外にするDAMファイルには,DAMサービス定義の定義コマンドdamfileに-nオプションを付けて指定します。

回復対象外のDAMファイルへのアクセスでエラーが起こった場合,ファイルデータの障害は回復できません。

(11) キャッシュブロックの処理

DAMサービスは一度読み込んだDAMファイルのブロックデータをDAMサービス専用共用メモリにためます。同じブロックに対して参照要求がある場合,DAMサービス専用共用メモリ上にあるブロックデータをUAPへ返すことによって,ファイルI/Oの実行回数を削減しています。

DAMサービス専用共用メモリ内では,DAMファイルごとにブロックデータをチェイン管理しています。このブロックデータが格納されているDAMサービス専用共用メモリ中の領域をキャッシュブロックといいます。

UAPがDAMファイルにアクセスするとき,DAMサービスは次に示す処理順序でキャッシュブロックを確保します。この処理をキャッシュブロック確保処理といいます。

キャッシュブロック確保処理の流れを次に示します。

  1. アクセスされたDAMファイルのキャッシュブロックチェインに,該当するブロックに対応するキャッシュブロックがつながれているか検索します。つながれている場合は,そのキャッシュブロックのデータをUAPへリターンします。

  2. キャッシュブロックチェインにつながれていない場合は,キャッシュブロック用領域からキャッシュブロックを確保します。

  3. キャッシュブロック用領域に空き領域がない場合は,アクセスしたDAMファイルのキャッシュブロックチェインの中で,実行中トランザクションで参照されていないキャッシュブロックを再利用します。このとき,キャッシュブロックチェインの末尾,つまり最も古くキャッシュブロックチェインにつながれたキャッシュブロックから再利用します。なお,再利用するキャッシュブロックは,DAMサービス定義のdam_cache_reuse_fromオペランド指定値によって決まります。デフォルトは,末尾から再利用します。

  4. 2.および3.でキャッシュブロックを確保できない場合は,ほかのDAMファイルのキャッシュブロックチェインの中で,実行中トランザクションで使用されていないすべてのキャッシュブロックをいったん解放し,再度,キャッシュブロック用領域からキャッシュブロックを確保します。ここでキャッシュブロックを解放する処理をクリーンアップ処理といいます。

  5. 確保したキャッシュブロックにDAMファイルのブロックデータをコピーし,キャッシュブロックチェインの先頭につなぎます。

キャッシュブロックチェインにつながれているキャッシュブロック数や,DAMサービス専用共用メモリの全体使用率は,damchinfコマンドで取得できます。

キャッシュブロックチェインの概要を次の図に示します。

図中の番号は上記の番号に対応します。

図4‒17 キャッシュブロックチェインの概要

[図データ]

(12) キャッシュブロック数しきい値指定機能

特定のDAMファイルに対してアクセスが集中する場合,そのDAMファイルが管理するキャッシュブロック数は増大します。その結果,「4.4.1(12)(b) 適用例」に示すとおり,しきい値を適切に指定していないと,該当するキャッシュブロックの検索や解放に時間が掛かるようになり,トランザクション性能が大幅に低下するおそれがあります。

DAMサービス定義のdamchlmt定義コマンドを指定すると,一つのDAMファイルで管理するキャッシュブロック数に上限を設けることができます。この上限となる値をしきい値といいます。しきい値に達するまではキャッシュブロックが確保され,しきい値に達すると,新たにキャッシュブロックを確保しないで,該当するDAMファイルの未使用状態のキャッシュブロックが再利用されます。しきい値を指定しない場合は,共用メモリ資源がなくなるまで,キャッシュブロックが確保されます。

DAMサービス定義のdamchlmt定義コマンドの指定値は,オンライン中にdamchdefコマンドを使用して動的に変更できます。

(a) キャッシュブロックの計算式

キャッシュブロック用に使用できる領域のサイズは次に示す計算式で求めます。

キャッシュブロック用領域サイズ
= M−(M / 576)×34 (単位:バイト)

個々のキャッシュブロックのサイズは次に示す計算式で求めます。

キャッシュブロックサイズ
= (Ab + 8)+ 64 (単位:バイト)
(凡例)

M:DAMサービス専用共用メモリサイズ

Ab:アクセスするDAMファイルのブロック長

(b) 適用例

この機能は,特定のDAMファイルに集中してアクセスするような形態で効果があります。適用例の前提となる条件を次に示します。

  • DAMサービスが確保するキャッシュメモリには,100000個のキャッシュブロックを確保できます。

  • オンライン開始後,damfileAだけを集中的にアクセスします。

  • damfileAのブロック数は100000ブロックです。

  • キャッシュブロック一つの検索時間を0.1ミリ秒とします。

  • 1ブロックのファイルI/O時間を500ミリ秒とします。

注※

ハードウェアやプロセスの状態によって異なります。説明のため,単純な値を使用しています。

  • 適用例1:キャッシュブロック数しきい値を指定しない場合

    キャッシュブロック数しきい値を指定しない場合,damfileAのキャッシュブロックチェインには,キャッシュブロック用領域に空き領域がある範囲で,キャッシュブロックがつながれます。ここでは,100000個のキャッシュブロックがdamfileAのキャッシュブロックチェインにつながれます。

    この状態で,キャッシュブロックチェインの末尾にあるブロックデータを検出するのに必要なチェイン走査時間は0.1ミリ秒×100000ブロック=10秒となり,直接ファイルI/Oした方が相対的なトランザクション性能は良くなります。また,キャッシュメモリ内に確保できる全キャッシュブロックをdamfileAが占有していることから,ほかのDAMファイルへアクセスする場合,damfileAに対してクリーンアップ処理が実行されます。クリーンアップ処理が実行されると,100000個のキャッシュブロックの解放処理を実行することから,さらにトランザクション性能を低下させてしまいます。

  • 適用例2:キャッシュブロック数しきい値として4000を指定する場合

    キャッシュブロック数しきい値に4000を指定すると,damfileAのキャッシュブロックチェインには,最大4000個のキャッシュブロックがつながれます(DAMサービス定義の各指定値によっては,4000個以上のキャッシュブロックがつながれることがあります)。

    この状態で,キャッシュブロックチェインの末尾にあるブロックデータを検出するのに必要なチェイン走査時間は,0.1ミリ秒×4000ブロック=400ミリ秒となり,直接ファイルI/Oした場合よりもトランザクション性能が良くなります。また,4000個のキャッシュブロックチェインになるため,残り96000個のキャッシュブロックは未確保状態となり,ほかのDAMファイルへアクセスした場合にクリーンアップ処理が実行されません。

    ただし,各DAMファイルのキャッシュブロックチェインにつながれるキャッシュブロック数に制限があることから,キャッシュブロック用領域に対するキャッシュブロック数が減少し,DAMサービス専用共用メモリ内に使われない領域が発生することがあります。

  • 適用例3:キャッシュブロック数しきい値として0を指定する場合

    キャッシュブロック数しきい値に0を指定する場合,damfileAのキャッシュブロックチェインにつながれるキャッシュブロック数は,トランザクションブランチ内でアクセスするブロック数,およびDAMサービス定義の設定値に依存します。

    ここではDAMサービス定義の設定値を次に示すとおりとします。

    set dam_update_block = 10
    set dam_tran_process_count = 5
    • すべてのトランザクションブランチでdamfileAだけをアクセスする場合

      アクセスするブロックに重複がないとすると,10×5=50個のキャッシュブロックがdamfileAのキャッシュブロックチェインにつながれます。これは,トランザクション実行中にほかのプロセスから,最新のブロックデータおよびトランザクション決着前の更新後データを参照されないようにするため,キャッシュメモリ中にデータをスタックしているからです。

    • 一つのトランザクションブランチだけがdamfileAをアクセスする場合

      アクセスするブロックに重複がないとすると,上記の場合同様に,キャッシュメモリ中にスタックしておくために,10個のキャッシュブロックがdamfileAのキャッシュブロックチェインにつながれます。

    上記のとおり,キャッシュブロック数しきい値として0を指定する場合では,キャッシュブロックチェインにつながれるキャッシュブロック数は,UAPでのアクセス形態やDAMサービス定義の設定値に依存します。この現象は,キャッシュブロック数しきい値に小さな値を指定する場合も発生します。小さな値とは,UAPで実行するトランザクション内でアクセスするブロック数よりも小さな値を意味します。

    このときも,適用例2の場合と同様にDAMサービス専用共用メモリ内に使われない領域が発生します。

(c) UAPのアクセス形態に応じた設定

damchinfコマンドを実行した結果,次に示す情報が出力されたとします。

CleanUP Count:1  Next CleanUP FILE-No:1  Using Rate:80%
FileNo FileName BlkLen BlkNum CchBlkNum PreservNum LimitNum ReUse
     1 damfile1    504  10000      7900          0       -1 Exist
     0 damfile0    504  10000       100          0       -1 Exist
     2 damfile2    504  10000         0          0       -1  None

UAPのアクセス形態ごとに,この状況でキャッシュブロック数しきい値にどのような値を指定するとよいか説明します。

  • damfile1には,以降ほとんどアクセスしない場合

    "Using Rate:80%"と出力されているので,damfile0およびdamfile2に割り当てることのできるキャッシュブロック領域は20%しかありません。damfile1には以降ほとんどアクセスしないので,damfile1のキャッシュブロックチェインにつながれている7900個分のキャッシュブロック用領域は,確保されたままの状態になります。そこで,damfile1のしきい値に小さな値を指定することによって,確保されたままの状態のキャッシュブロック用領域を小さくし,damfile0およびdamfile2に割り当てるキャッシュブロック領域を大きくできます。

    また,damfile1のキャッシュブロックチェインにキャッシュブロックが多数つながれているため,キャッシュブロック用領域が不足するとクリーンアップ処理が実行されます。ここでは"Next CleanUP FILE-No:1"と出力されていることから,damfile1のキャッシュブロックチェインがクリーンアップ対象となります。7900個のキャッシュブロック解放処理が実行されると,急激に性能が劣化します。この現象を抑止するためにも,damfile1にしきい値を指定することが重要になります。

  • damfile1に頻繁にアクセスする場合

    damfile1に頻繁にアクセスすると,damfile1のキャッシュブロックチェインの検索処理が頻繁に実行されます。この場合,しきい値を指定することで,キャッシュブロックチェインを短くでき,その結果,チェイン検索時間が短縮されます。ただし,しきい値が小さ過ぎる場合,キャッシュ効率が悪化するため,かえって性能が劣化します。しきい値設定値を変更しながら最適な値を決定してください。

  • すべてのDAMファイルに平均的にアクセスする場合

    すべてのDAMファイルに平均的にアクセスするため,各DAMファイルに割り当てられるキャッシュブロック用領域は平均化していることが望まれます。各DAMファイルのしきい値に同等の値を設定すると,各DAMファイルが使用するキャッシュブロック用領域は平均化されます。

(d) 注意事項

この機能を使用するときの注意事項を次に示します。

  • キャッシュブロック数しきい値を指定しない場合は,DAMサービス専用共用メモリが満杯になるまでキャッシュブロックが確保されます。しかし,しきい値を指定すると途中でキャッシュブロック確保処理は抑止されます。そのため,使用されない共用メモリ領域が発生します。

  • 各DAMファイルのキャッシュブロックチェインにつながれるキャッシュブロック数は,しきい値に設定した値を超えることがあります。

  • DAMサービス定義のdamchlmt定義コマンドに指定範囲外のしきい値を指定した場合,不正な指定のある個所がKFCA00219-Eメッセージに出力されます。また,省略値の採用がKFCA01644-Iメッセージに出力されます。この場合,該当するDAMファイルで管理するしきい値は設定されないで,共用メモリ資源のある限りキャッシュブロックが確保されます。

(13) キャッシュブロック再利用時の検索順序指定機能

DAMサービス定義のdam_cache_reuse_fromオペランドを指定すると,DAMファイルをアクセスするトランザクションで新しくキャッシュブロックが必要となった場合に,キャッシュブロックチェインのどのキャッシュブロックから優先的に再利用対象として検索するか指定できます。

lastを指定すると最も古くキャッシュブロックチェインにつながれたキャッシュブロックから再利用します。

firstを指定すると最も新しくキャッシュブロックチェインにつながれたキャッシュブロックから再利用します。

デフォルトはlastです。

(14) キャッシュブロック再利用境界値指定機能

DAMサービス定義のdamcache定義コマンドには,キャッシュブロック再利用境界値を指定できます。指定すると,キャッシュブロック確保処理で新しくキャッシュブロックを確保するときに,キャッシュブロック再利用境界値にキャッシュブロック数が達していない間は,アクセスするDAMファイルのキャッシュブロックではなく,ほかのDAMファイルのキャッシュブロックが優先して再利用されます。

なお,キャッシュブロック数がキャッシュブロック再利用境界値を超えている場合は,アクセスするDAMファイルのキャッシュブロックが再利用されます。したがって,キャッシュブロック再利用境界値に0を指定すると,通常の処理と同じように,アクセスするDAMファイルのキャッシュブロックから再利用されます。

DAMサービス定義のdam_default_cache_numオペランドには,damcache定義コマンドを指定しない論理ファイルのキャッシュブロック再利用境界値を指定できます。

この機能は,あるDAMファイルの多数ブロックを集中してアクセスしたあと,別のDAMファイルを頻繁にアクセスする場合,つまり少数のDAMファイルがキャッシュブロックを占有してしまい,ほかの頻繁にアクセスするDAMファイルに割り当てられるキャッシュブロックが少なくなってしまう場合に有効です。

これに対して,複数のDAMファイルをランダムにアクセスする場合,つまり各DAMファイルにキャッシュブロックが均等に使用されている場合には,キャッシュブロック再利用境界値に小さな値を指定するとキャッシュブロックの解放処理が頻繁に実行され,メモリ確保およびファイルからのデータ読み込み処理が従来よりも増加することによって,性能が劣化することがあります。

(a) 性能向上が見込まれる例

説明のため,使用するDAMファイルは2ファイルとし,同一ブロック長であるとします。また,システム全体で確保可能な最大キャッシュブロック数を100個とし,DAMファイルAを98ブロック参照したあと,DAMファイルBのアクセスが実行されるとします。

DAMファイルBのアクセスは,次に示すとおり回数が増えるたびに1ブロックずつ参照するブロックが増加し,50ブロックまで参照するとします。

1回目:ブロック1および2を参照

2回目:ブロック1,2,および3を参照

3回目:ブロック1,2,3,および4を参照

        :

49回目:ブロック1,2,3,…および50を参照

この条件のとき,damcache定義コマンドを指定しない場合と,指定する場合の処理の違いを次に示します。

  • damcache定義コマンドを指定しない場合

    1. DAMファイルBを最初にアクセスするとき,共用メモリからキャッシュブロック用領域を確保します。このとき,DAMファイルAで98個のキャッシュブロックが確保されているため,二つだけ確保できます。そのキャッシュブロックに,ブロック1および2のデータを読み込み,DAMファイルBのキャッシュブロックチェインにつなぎます。

    2. ブロック1,2,および3を参照するとき,ブロック1および2はキャッシュヒットするため,ファイルI/Oが実行されません。しかし,ブロック3は初めてのアクセスであるため,キャッシュブロックを確保し,データを読み込もうとしますが,1.の段階で共用メモリ中の空き領域がなくなっているため,DAMファイルBのキャッシュブロックの再利用処理が実行されます。再利用処理では,ブロック1のデータが設定されているキャッシュブロックをキャッシュブロックチェインから切り離し,ブロック3のデータを読み込み,キャッシュブロックチェインの先頭につなぎます。

    3. ブロック1,2,3,および4を参照するとき,2.と同様にキャッシュブロックの再利用処理が実行され,ブロック2のキャッシュブロックを解放し,ブロック1を読み込み,キャッシュブロックチェインの先頭につなぎます。さらに,ブロック2のデータを読み込むため,ブロック3のキャッシュブロックを再利用し,ブロック2を読み込みます。この処理をブロック3および4のときにも繰り返します。

    4. 3.を繰り返すと,DAMファイルBのキャッシュブロックの再利用処理,つまり,チェインからの解放,およびデータ読み込みのためのファイルI/Oが頻繁に実行されます。チェインからの解放処理,およびファイルI/Oの回数は,約1275回ずつ実行されます。

  • damcache定義コマンドを指定する場合

    DAMファイルAのキャッシュブロック再利用境界値を50とし,DAMファイルBのキャッシュブロック再利用境界値を90とします。

    1. damcache定義コマンドを指定しない場合の1.と同様に,余っているキャッシュブロックを二つ確保し,ブロック1および2のデータを読み込み,キャッシュブロックチェインにつなぎます。

    2. ブロック1,2,および3を参照するとき,ブロック1および2はキャッシュヒットするため,ファイルI/Oが実行されません。また,ブロック3のデータを読み込むためのキャッシュブロックは,DAMファイルBのキャッシュブロック数がキャッシュブロック再利用境界値を超えていないため,ほかのDAMファイルの内,キャッシュブロック数がキャッシュブロック再利用境界値を超えているDAMファイル(この場合はDAMファイルA)のキャッシュブロックを解放し確保します。確保したキャッシュブロックにブロック3のデータを読み込みキャッシュブロックチェインにつなげます。これによって,DAMファイルBのキャッシュブロックチェインには,三つのキャッシュブロックがつながることになります。

    3. ブロック1,2,3,および4を参照するとき,ブロック1,2,および3はキャッシュヒットするため,ファイルI/Oは実行されません。また,ブロック4のデータ読み込み時には,DAMファイルAの未使用キャッシュブロックを再利用するため,ファイルI/Oが1回だけ実行されます。

    4. 3.をDAMファイルAのキャッシュブロック数がキャッシュブロック再利用境界値を超えるまで繰り返します。キャッシュブロックチェインからの解放処理,およびファイルI/Oの回数は,約50回ずつとなり性能が向上します。

(b) 性能が劣化する例

DAMファイルのブロック長などの条件は上記と同じとします。ただし,各ファイルのアクセス形態を次に示すとおりとします。

1回目:DAMファイルAの1〜50ブロックを参照

2回目:DAMファイルBの1〜50ブロックを参照

3回目:DAMファイルAの51〜100ブロックを参照

4回目:DAMファイルBの1〜50ブロックを参照

        :

以降,DAMファイルAのブロックを50ブロックずつずらしながら,DAMファイルAとBを交互に参照します。

キャッシュブロックの最大が100個であるため,2回目でDAMファイルAとBともに,50個のキャッシュブロックがつながります。3回目以降の処理で,damcache定義コマンドを指定しない場合と,指定する場合の処理の違いを次に示します。

  • damcache定義コマンドを指定しない場合

    3回目では,ブロック1〜50のキャッシュブロックを解放し,ブロック51〜100のデータに置き換えたあとチェインにつなげます。

    4回目では,すべてのブロックがキャッシュヒットするため,キャッシュブロックの解放処理,およびファイルI/Oは実行されません。

    以降,DAMファイルAでは,3回目のときと同様にすべてのキャッシュブロックの解放とファイルI/Oが実行されますが,DAMファイルBについては,キャッシュブロックの解放,およびファイルI/Oは実行されません。DAMファイルAの参照ブロックが1000ブロックまでとすると,キャッシュブロックの解放処理回数は950回,ファイルI/Oの回数はDAMファイルAとB合わせて1050回です。

  • damcache定義コマンドを指定する場合

    DAMファイルAのキャッシュブロック再利用境界値を100,DAMファイルBのキャッシュブロック再利用境界値を50とします。

    3回目では,DAMファイルAのブロック51〜100を参照するとき,50個分のキャッシュブロックを確保する必要があります。このとき,DAMファイルAのキャッシュブロック数がキャッシュブロック再利用境界値を超えていないため,ほかのDAMファイルのキャッシュブロックを再利用します。このとき,DAMファイルBのキャッシュブロック数はキャッシュブロック再利用境界値を超えていなくても,共用メモリ内の空き領域がないため,強制的に再利用します。そのため,DAMファイルBのブロック1〜50のデータが設定されているキャッシュブロックが解放され,DAMファイルAのブロック51〜100までのデータに置き換えられ,DAMファイルAのキャッシュブロックチェインの先頭につながれます。このため,3回目が終了した時点では,DAMファイルAのキャッシュブロックチェインには,ブロック1〜100までのキャッシュブロックがつながれ,DAMファイルBのキャッシュブロックはなくなります。

    4回目では,DAMファイルBのブロック1〜50を参照するとき,50個分のキャッシュブロックを確保する必要があります。3回目と同様にDAMファイルAのキャッシュブロックを強制的に再利用し,DAMファイルAのブロック1〜50のデータが設定されているキャッシュブロックを解放し,DAMファイルBのブロック1〜50のデータを設定したあと,DAMファイルBのキャッシュブロックチェインにつなぎます。

    以降,3回目および4回目と同様の処理を繰り返し,DAMファイルAの参照ブロックが1000ブロックまでとすると,キャッシュブロックの解放処理回数は1900回,ファイルI/Oの回数はDAMファイルAとB合わせて2000回となり,damcache定義コマンドを指定しない場合と比較して性能が劣化します。

(c) 注意事項

この機能を使用するときの注意事項を次に示します。

  • アクセスするDAMファイルのキャッシュブロック数がキャッシュブロック再利用境界値を超えていない場合,ほかのDAMファイルのキャッシュブロックを優先して再利用します。このとき,ほかのDAMファイルの全キャッシュブロックがアクセス中の場合,アクセスするDAMファイルのキャッシュブロックに対して再利用処理を実行します。そのため,キャッシュブロック再利用境界値を超えていなくても,再利用されることがあります。

  • damaddコマンドに-lオプションを指定しないで実行すると,そのDAMファイルのキャッシュブロック再利用境界値は,DAMサービス定義のdam_default_cache_numオペランドの指定値に依存しないで0となります。

  • DAMサービス定義の各キャッシュブロック再利用境界値に指定範囲外の値を指定した場合,次に示すとおり動作します。

    • dam_default_cache_numオペランドに指定範囲外の値を指定するとき

      KFCA00216-Eメッセージを出力して,指定の不正な個所を表示します。さらに,KFCA01644-Iメッセージを出力して省略値の採用を表示します。この場合,damcache定義コマンドでキャッシュブロック再利用境界値を指定していないDAMファイルのキャッシュブロック再利用境界値として0を使用します。

    • damcache定義コマンドに指定範囲外の値を指定するとき

      KFCA02529-Eメッセージを出力して,指定の不正な個所を表示します。さらに,KFCA01644-Iメッセージを出力して省略値の採用を表示します。この場合,該当するDAMファイルのキャッシュブロック再利用境界値として,dam_default_cache_numオペランドで指定した値を使用します。dam_default_cache_numオペランドの指定がない場合,または指定範囲外の値を指定した場合は,0を使用します。

(15) 回復対象外DAMファイルのキャッシュレスアクセス

4.4.1(11) キャッシュブロックの処理」で説明したように,DAMサービスは,一度読み込んだDAMファイルのブロックデータをDAMサービス専用共用メモリにため,ファイルI/Oの実行回数を削減しています。

回復対象外のDAMファイルに限り,直接ファイルI/Oを実行してディスク上のブロックデータをUAPへ返せます。この方式をキャッシュレスアクセスといいます。回復対象外のDAMファイルをキャッシュレスアクセスにする場合は,DAMサービス定義のdamfile定義コマンドの-fオプションで指定します。

キャッシュレスアクセスを指定すると,参照,更新ごとにファイルI/Oが実行されます。

キャッシュレスアクセス指定のDAMファイルを使用する場合,最適なDAMサービス専用共用メモリサイズを算出し,DAMサービス定義のdam_cache_size_fixオペランドに指定すると,不要なメモリを削減できます。詳細については,マニュアル「OpenTP1 システム定義」のDAMサービス定義のdam_cache_size_fixオペランドの説明を参照してください。