IBM Support

[Db2] Db2 のメモリー管理 - 3.各メモリー・プールの役割

Question & Answer


Question

Db2 はオペレーティング・システムから割り当てたメモリーを、独自の方法で管理して使用しています。 Db2 のメモリーの管理方法およびモニター方法を教えてください。

Cause

Db2 9.5 以降のメモリー管理について、以下の文書で解説します。

Answer

このページでは、各メモリー・プールの役割およびモニター方法を、以下6項目の観点から説明します。
  • 利用の目的
  • 割り当てのタイミング
  • 使用されるタイミング
  • 制御するパラメーター
  • 所属するメモリー・セット
  • ヒープ使用量のモニター方法

3. メモリー・プールとは

各コンポーネントはメモリー・ブロックという単位で必要なメモリーを要求し、Db2 のメモリー・マネージャーは、メモリー・セットからメモリーを割り振ります。
このメモリー・ブロックを役割ごとにまとめた論理的な単位をメモリー・プールと呼び、利用の目的、揮発性、使用量増加時の制約などの共通の属性が定義されています。
データベース・セットとアプリケーション・セットに含まれる主なメモリー・プールには以下のものがあります。
  1. BP (bph)  バッファー・プール・ヒープ
  2. PACKAGE_CACHE (pckcacheh) パッケージ・キャッシュ・ヒープ
  3. CAT_CACHE (catcacheh) カタログ・キャッシュ・ヒープ
  4. DATABASE (dbh) データベース・ヒープ
  5. LOCK_MGR (lockh) ロック・マネージャー・ヒープ
  6. UTILITY (utilh) ユーティリティー・ヒープ
  7. SHARED_SORT (shsorth) 共有ソート・ヒープ
  8. APPLICATION (apph) アプリケーション・ヒープ
  9. STATEMENT (stmth) ステートメント・ヒープ
  10. STATISTICS (stath) 統計ヒープ
 
  1. BP バッファー・プール・ヒープ 利用の目的
    バッファー・プールは、表および索引のデータがディスクから読み取られるときに、それらをキャッシュに入れるために使用されます。データベース・マネージャーによって割り振られるメイン・メモリーの領域です。

    割り当てのタイミング
    データベース活動化時に設定されたサイズが割り当てられます。
    STMM で自動調整している場合は、前回非活動化した時点のサイズが割り当てられます。

    使用されるタイミング
    SQL 要求などに応じて、表や索引などのオブジェクトがアクセスされると、該当データが含まれるページがバッファー・プールに固定されます。 固定されたページは、データベースがシャットダウンされるか、別のページを固定するために固定解除されるまで、バッファー・プール内に留まります。

    制御するパラメーター
    データベース構成パラメーターはありません。
    新規データベースごとに、デフォルトのバッファー・プール (IBMDEFAULTBP) が定義されます。
    追加のバッファー・プールを CREATE BUFFERPOOL、DROP BUFFERPOOL および ALTER BUFFERPOOL ステートメントを使用して、作成、ドロップおよび変更できます。 SYSCAT.BUFFERPOOLS カタログ・ビューで、データベース内に定義されたバッファー・プールの情報がリストできます。詳細はバッファー・プールを参照してください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -bufferpool でデータベースに存在する各バッファー・プールのサイズが表示できます。
      $ db2pd -db sample -bufferpool
      
      Database Member 0 -- Database SAMPLE -- Active -- Up 0 days 00:00:13 -- Date 2023-03-17-20.37.14.654397
      
      Bufferpools:
      First Active Pool ID      1
      Max Bufferpool ID         1
      Max Bufferpool ID on Disk 1
      Num Bufferpools           5
      
      Address            Id   Name               PageSz     PA-NumPgs  BA-NumPgs  CurrentSz  PostAlter  SuspndTSCt Automatic
      0x00007FEE4D534120 1    IBMDEFAULTBP       8192       1000       0          1000       1000       0          False
      0x00007FEE4D4FFF20 4096 IBMSYSTEMBP4K      4096       16         0          16         16         0          False
      0x00007FEE4D50CFA0 4097 IBMSYSTEMBP8K      8192       16         0          16         16         0          False
      0x00007FEE4D51A020 4098 IBMSYSTEMBP16K     16384      16         0          16         16         0          False
      0x00007FEE4D5270A0 4099 IBMSYSTEMBP32K     32768      16         0          16         16         0          False
      
    • db2pd -pages summary の Total number of pages はバッファー・プールの使用量を示します。 バッファープールが複数ある場合は、BUFFERPOOL ID を指定して使用量を確認できます。
      バッファー・プールが複数あり BUFFERPOOL ID を指定しない場合は合計値が戻されます。
      データベース全体の合計:
      $ db2pd -db sample -pages summary
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:03:41 -- Date 10/10/2012 19:17:20
      
      Bufferpool Pages:
      First Active Pool ID      1
      Max Bufferpool ID         2
      Max Bufferpool ID on Disk 2
      Num Bufferpools           6
      
      Total number of pages: 597
      BUFFERPOOL ID を指定した場合
      $ db2pd -db sample -pages summary 1
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:04:23 -- Date 10/10/2012 19:18:02
      
      Bufferpool Pages:
      First Active Pool ID      1
      Max Bufferpool ID         2
      Max Bufferpool ID on Disk 2
      Num Bufferpools           6
      
      Total number of pages: 124
      
      $ db2pd -db sample -pages summary 2
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:06:13 -- Date 10/10/2012 19:19:52
      
      Bufferpool Pages:
      First Active Pool ID      1
      Max Bufferpool ID         2
      Max Bufferpool ID on Disk 2
      Num Bufferpools           6
      
      Total number of pages: 473
  2. PACKAGE_CACHE パッケージ・キャッシュ・ヒープ 利用の目的
    パッケージ・キャッシュはデータベース上の静的および動的 SQL および XQuery ステートメントのセクションをキャッシュするために使用されます。

    割り当てのタイミング
    データベースの活動化時に最低限のサイズが割り当てられます。

    使用されるタイミング
    SQL の実行オブジェクト (セクションまたはバリエーション) をパッケージ・キャッシュに保持することにより、システム・カタログからの取り出し (静的 SQL) や SQL のコンパイル (動的 SQL) のオーベーヘッドを低減します。
    このため、動的および静的 SQL 要求により、キャッシュ・エントリーが挿入されるたびに単調増加します。
    追加のキャッシュ挿入によってキャッシュの論理サイズが PCKCACHESZ を超える場合にキャッシュのクリーンアップが試行され、追加のキャッシュ挿入後も PCKCACHESZ を超えないように管理されます。使用中のキャッシュ・エントリーが多いなどの理由で、クリーンアップを行っても PCKCACHESZ を超えてしまった場合は、パッケージ・キャッシュ・オーバーフロー (ADM4500W) が記録されます。
    SQL で参照する表の ALTER や統計更新などにより、無効化されたキャッシュ・エントリーは自動的に除去されます。

    制御するパラメーター
    pckcachesz - パッケージ・キャッシュ・サイズ構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -mempools で LogSz がプール・メモリー要求の現在の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
      0x0700000040001910 SAMPLE   utilh      5     0          4800        20512768    50164       65536       20512768    65536       Ovf 20     UTIL_HEAP_SZ
      0x0700000040001680 SAMPLE   pckcacheh  7     63584      1258985     Unlimited   1278407     1376256     Unlimited   1376256     Ovf 359    PCKCACHESZ
    • db2pd -dynamic/-static の出力では、Current Memory Used がパッケージ・キャッシュによって使用されるバイト数を示します。
      $ db2pd -alldbs -dynamic
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:51:31 -- Date 10/10/2012 14:19:01
      
      Dynamic Cache:
      Current Memory Used           1258985 
      
       
      $ db2pd -alldbs -static
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:54:02 -- Date 10/10/2012 14:21:32
      
      Static Cache:
      Current Memory Used           1258985
  3. CAT_CACHE カタログ・キャッシュ・ヒープ 利用の目的
    カタログ・キャッシュはデータベース共用メモリーから割り振られ、システム・カタログ情報をキャッシュに入れる場合に使用されます。パーティション・データベース・システムでは、それぞれのデータベース・パーティションごとにカタログ・キャッシュが 1 つずつあります。

    割り当てのタイミング
    データベースの活動化時に最低限のサイズが割り当てられます。

    使用されるタイミング
    SQL のコンパイル時や権限のチェック時に、システム・カタログの内容を検索した結果がキャッシュされます。
    パッケージ・キャッシュと同様の方法で管理され、キャッシュがいっぱいになるまで単調増加します。

    制御するパラメーター
    catalogcache_sz - カタログ・キャッシュ・サイズ構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -mempools で LogSz がプール・メモリー要求の現在の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
      0x0700000040001910 SAMPLE   utilh      5     0          4800        20512768    50164       65536       20512768    65536       Ovf 20     UTIL_HEAP_SZ
      0x0700000040001680 SAMPLE   pckcacheh  7     63584      1258985     Unlimited   1278407     1376256     Unlimited   1376256     Ovf 359    PCKCACHESZ
      0x07000000400013F0 SAMPLE   catcacheh  8     32640      267430      Unlimited   292126      327680      Unlimited   393216      Ovf 52     CATALOGCACHE_SZ
    • db2pd -catalogcache の Current Size でも確認できます。
      -catalogcache は各キャッシュ・エントリーの詳細やロック名も表示します。
      $ db2pd -alldbs -catalogcache
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:48:02 -- Date 10/10/2012 14:15:32
      
      Catalog Cache:
      Configured Size         819200
      Current Size            279934  #カタログ・キャッシュで使用される現在のバイト数。
  4. DATABASE データベース・ヒープ
    利用の目的
    データベース・ヒープはデータベースごとに 1 つ存在します
    このヒープには、表、索引、表スペース、およびバッファー・プールのコントロール・ブロック情報が含まれます。また、ログ・バッファー (logbufsz)、およびユーティリティーによって使用される一時メモリー用のスペースも含まれます。
    さらに、上記以外の文書化されていない様々なメモリー要求を満たすためにも使用されます。

    割り当てのタイミング
    データベース活動化時に、ログ・バッファーを含む基本的なサイズが割り当てられます。

    使用されるタイミング
    データベース・ヒープは様々な目的に利用されるため、各利用目的に応じて適宜使用されます。

    制御するパラメーター
    dbheap - データベース・ヒープ構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -mempools で LogSz がプール・メモリー要求の現在の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
        *中略*
      0x0700000040000348 SAMPLE   dbh        2     173024     35362853    49086464    35392259    36044800    49086464    36044800    Ovf 1912   DBHEAP
  5. LOCK_MGR ロック・マネージャー・ヒープ
    利用の目的
    ロック・リストは該当のオブジェクトのロックを保留、記録するのに使われます。
    データベースごとに 1 つのロック・リストが存在し、ロック・リストにはデータベースに同時に接続しているすべてのアプリケーションが保持しているロックが含まれます。

    割り当てのタイミング
    データベースが活動化されたときに LOCKLIST で指定されたサイズが確保されます。

    使用されるタイミング
    トランザクションによってロック要求が行われると使用され、ロック期間が過ぎた場合やトランザクションの完了で解放されます。
    現在どの程度使用されているかは、lock_list_in_use (単位:バイト) モニター・エレメントを参照します。

    制御するパラメーター
    locklist - ロック・リスト用最大ストレージ構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    MON_GET_DATABASE 表関数を使用して、使用中のロック・リスト・メモリーの合計サイズ (バイト) を確認できます。
    MON_GET_DATABASE 表関数 - データベース・メトリックの取得
    lock_list_in_use - 使用中のロック・リスト・メモリーの合計 : モニター・エレメント
    • $ db2 "select lock_list_in_use from table(mon_get_database(-1)) as t"
      
      LOCK_LIST_IN_USE
      --------------------
                     64000
      
      1 レコードが選択されました。
        
  6. UTILITY ユーティリティー・ヒープ
    利用の目的
    BACKUP、RESTORE、および LOAD (ロード・リカバリーを含む) ユーティリティーによって同時に使用されます。

    割り当てのタイミング
    データベース活動化時にヒープ管理用の最低限のサイズが割り当てられます。

    使用されるタイミング
    BACKUP、RESTORE および LOAD ユーティリティーの実行時に使用され、ユーティリティーの終了で解放されます。

    制御するパラメーター
    util_heap_sz - ユーティリティー・ヒープ・サイズ構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -mempools の LogSz が現在のプール・メモリー要求の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
      0x0700000040001910 SAMPLE   utilh      5     0          4800        20512768    50164       65536       20512768    65536       Ovf 20     UTIL_HEAP_SZ
  7. SHARED_SORT 共有ソート・ヒープ
    利用の目的
    ソートの他にも、ハッシュ結合、索引 ANDing、ブロック索引 ANDing、マージ結合、およびメモリー内の表などのソート・メモリー・コンシューマーがあります。
    共用ソート・メモリー・コンシューマーの共用メモリーの合計が限界値 sheapthres_shr に近づくと、メモリー・スロット機構が活動化され、将来の共用ソート・メモリー・コンシューマー要求に対して、その要求よりも少ない量のメモリーが付与される場合があります。

    割り当てのタイミング
    データベース活動化時にヒープ管理用の最低限のサイズが割り当てられます。

    使用されるタイミング
    共有ソートが行われるとき、エージェントによって要求されたサイズが使用されます。共有ソートの合計サイズは sheapthres_shr パラメーターで緩やかに制限されます。

    制御するパラメーター
    sheapthres_shr - 共用ソートのソート・ヒープのしきい値構成パラメーターを参照ください。

    所属するメモリー・セット
    DATABASE

    ヒープ使用量のモニター方法
    • db2pd -mempools で LogSz が現在のプール・メモリー要求の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
        *中略*
      0x07000000400005D8 SAMPLE   shsorth    18    0          0           20512768    354400      65536       20512768    524288      Ovf 0      SHEAPTHRES_SHR
  8. APPLICATION アプリケーション・ヒープ
    利用の目的
    このヒープは、そのアプリケーションに対して動作するすべてのデータベース・エージェントで共有されます。

    割り当てのタイミング
    アプリケーションが接続したとき、ヒープを管理する最低限のサイズが割り当てられます。

    使用されるタイミング
    宣言済み一時表の記述子や LOB 記述子が使用する領域など、アプリケーション接続に関連する多目的なヒープとして使用されます。

    制御するパラメーター
    applheapsz - アプリケーション・ヒープ・サイズ構成パラメーターを参照ください。

    所属するメモリー・セット
    APPLICATION

    ヒープ使用量のモニター方法
    • db2pd -mempools で LogSz が現在のプール・メモリー要求の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:49:37 -- Date 10/10/2012 14:17:07
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
      *中略*
      0x0700000030001160 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030001018 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000ED0 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000D88 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000C40 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000AF8 Appl     apph       1     0          92883       1048576     93387       196608      1048576     196608      Phy 1041   APPLHEAPSZ
      0x07000000300009B0 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000868 Appl     apph       1     0          10963       1048576     12947       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000720 Appl     apph       1     0          10963       1048576     10963       65536       1048576     65536       Phy 17     APPLHEAPSZ
      0x0700000030000490 Appl     apph       1     0          16597       1048576     52182       65536       1048576     65536       Phy 30     APPLHEAPSZ
      0x0700000030000348 Appl     appshrh    20    11552      669560      4096000     685208      851968      4128768     851968      Phy 267    application shared
  9. STATEMENT ステートメント・ヒープ
    利用の目的
    ステートメント・ヒープは、SQL または XQuery コンパイラーが SQL または XQuery ステートメントをコンパイルするためのワークスペースとして使用されます。
    この作業域は、動的 SQL または XQuery ステートメントの場合はプログラムの実行時に使用されるのに対して、静的 SQL または XQuery ステートメントの場合はバインド処理時に使用され、プログラム実行時には使用されません。

    割り当てのタイミング
    個々の SQL ステートメントのコンパイル、プリコンパイル、バインド時にコンパイラーが必要とするサイズが割り当てられます。コンパイルが終わると解放されます。

    制御するパラメーター
    stmtheap - ステートメント・ヒープ・サイズ構成パラメーターを参照ください。

    所属するメモリー・セット
    APPLICATION

    ヒープのモニター方法
    各 SQL の EXPLAIN を採取し、HEAPUSE : (Maximum Statement Heap Usage) を確認できます。
    stmtheap は(ヒープの存続期間が極めて短いため、通常 db2pd -memp や db2mtrk では確認できません。例えば以下の EXPLAIN の例では 32 ミリ秒しか存在しません。また、これらのツールで表示されて、該当コンパイルが使用した最大量を示す数値かどうかは確認できません。)
    • db2exfmt 出力より抜粋
      Plan Details:
      -------------
      
              1) RETURN: (Return Result)
             *中略*
                      Arguments:
                      ---------
                      BLDLEVEL: (Build level)
                              DB2 v9.7.0.5 : s111017
                      HEAPUSE : (Maximum Statement Heap Usage)
                              80 Pages
                      PREPTIME: (Statement prepare time)
                                      32 milliseconds
                      STMTHEAP: (Statement heap size)
                              8192
      
      EXPLAIN の採取方法は以下のページを参照してください。
      [Db2] SQL の実行計画 (Explain) を取得する方法
       
  10. STATISTICS 統計ヒープ
    利用の目的
    統計ヒープは RUNSTATS コマンドを使って統計を収集するときに使用されます。

    割り当てのタイミング
    RUNSTATS コマンドなどによる統計情報の収集時。統計情報の収集が終わると解放されます。

    制御するパラメーター
    stat_heap_sz - 統計ヒープ・サイズ構成パラメーターを参照ください。

    統計オプションが多ければ多いほど、使用されるメモリー量も多くなります (例えば、LIKE 統計または DETAILED 索引統計が収集される場合)。
    列統計が収集される場合、統計収集対象の列の数に応じて使用されるメモリー量も多くなります。
    分散統計が収集される場合、収集対象の頻出値および/または変位値の数に応じて、使用されるメモリー量も多くなります。(デフォルトの設定の AUTOMATIC が推奨値です。)

    所属するメモリー・セット
    APPLICATION

    ヒープ使用量のモニター方法
    • RUNSTATS 実行中の db2pd -mempools で LogSz が現在のプール・メモリー要求の合計を示します。
      $ db2pd -alldbs -mempools
      
      Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 00:31:06 -- Date 10/24/2012 10:58:03
      
      Memory Pools:
      Address            MemSet   PoolName   Id    Overhead   LogSz       LogUpBnd    LogHWM      PhySz       PhyUpBnd    PhyHWM      Bnd BlkCnt CfgParm
        *中略*
      0x07000000300012A8 Appl     stath      6     0          1376        17956864    1376        65536       17956864    65536       Phy 4      STAT_HEAP_SZ
運用上の考慮点
  • db2pd -mempools の LogSzPhySz の違い
    LogSz (論理サイズ) は、プール・メモリー要求の現在の合計で、割り当てられたメモリー・ブロックの合計値を示します。
    PhySz (論理サイズに必要な物理サイズ) には、実際にメモリー・プールに割り当てられたチャンクの合計値を示します。

    Db2 内部でプールにメモリーが割り振られる単位はバイト単位ではなく、64KB のチャンク単位です。 
    そのため、64KB より小さいメモリー・ブロックが要求されてもチャンク単位でプールに割り当てられるため、プールの PhySz は LogSz より大きくなります。


    たとえば、20KB のメモリー・ブロックを要求して 64KB の新しいチャンクから割り当てられたとき、論理サイズ は20KB 増えますが、物理サイズは 64KB 増えます。
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m0z000000GozAAAS","label":"Memory"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
23 August 2023

UID

swg21620787