分散トランザクション処理機能 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ファイルの特長
(2) DAMファイルの作成方法
(3) DAMファイルの入出力関数
(4) DAMファイルの排他制御
(5) DAMファイルのディファード更新
(6) DAMファイルのオンラインバックアップ
(7) ユーザデータの抽出
(8) ブロック長拡張機能
(9) 標準入出力を使ったDAMファイルのバックアップとリストア
(10) 回復対象外のDAMファイルへのアクセス
(11) キャッシュブロックの処理
(12) キャッシュブロック数しきい値指定機能
(13) キャッシュブロック再利用時の検索順序指定機能
(14) キャッシュブロック再利用境界値指定機能
(15) 回復対象外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ファイルが管理するキャッシュブロック数は増大します。その結果,該当するキャッシュブロックの検索や解放に時間が掛かるようになり,トランザクション性能が低下します。

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

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

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

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

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

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

 
キャッシュブロックサイズ
= (Ab + 8)+ 64 (単位:バイト)
 
(凡例)
M:DAMサービス専用共用メモリサイズ
Ab:アクセスするDAMファイルのブロック長
(b) 適用例

この機能は,特定の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のアクセス形態ごとに,この状況でキャッシュブロック数しきい値にどのような値を指定するとよいか説明します。

(d) 注意事項

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

(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定義コマンドを指定しない場合と,指定する場合の処理の違いを次に示します。

(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定義コマンドを指定しない場合と,指定する場合の処理の違いを次に示します。

(c) 注意事項

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

(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オペランドの説明を参照してください。