[InterDB] [著者HP] [PREVIOUS][UP][NEXT]

Copyright @ 2009, Suzuki Hironobu @ InterDB


■2-02■ メモリ構造


メモリモデル

PostgreSQLは起動時に、データ処理の効率化と信頼性向上のため、共有メモリ上に3つのメモリ領域を確保します(補足 1)。
また、バックエンドプロセスごとにソートメモリ領域(sort_mem)とVACUUMメモリ領域(vacuum_mem)を確保します(【図.2-2】参照)。

図.2-2 メモリモデル


これらバッファとメモリ領域の大きさは、設定ファイル“postgresql.conf”で設定します。

共有メモリ上に確保するメモリ領域


    (1)共有バッファ(shared buffer)
    PostgreSQLは共有バッファ上にデータを読み込み、更新や検索などのデータ操作を行います。つまり、共有バッファはキャッシュとして機能するわけです。

    (2)WALバッファ(WAL buffer)
    万が一のトラブルに備えて、PostgreSQLにはトランザクションログ(補足 2)を保存する機構:WAL(Write Ahead Logging)が実装されています。WALバッファはトランザクションログをバッファリングするために用意されています。共有バッファやWALバッファのデータがどのようにハードディスクに書き込まれるかは、【2-09】で解説します。

    (3) 空き領域マップ(Free Space Map)
    PostgreSQLは追記型のデータ管理方式を採用しているため、定期的にデータ領域中の不要領域を回収(または開放)する必要があります(補足 3)。空き領域マップは、不要となったデータ領域を記録するためのものです。


バックエンドプロセスが確保するメモリ領域

バックエンドプロセスごとに、ソートメモリ領域(sort_mem)とVACUUM メモリ領域(vacuum_mem)が確保されます。
これらのメモリ領域は常時確保されるのではなく、動的に確保されます。ソートメモリ領域は問い合わせを実行するとき、VACUUMメモリ領域はVACUUM処理を実行するときにそれぞれ確保され、実行後は開放されます。


    (1)ソートメモリ領域(sort_mem)
    プランナが問い合わせ実行計画を作成するときに使う、マージソート結合とハッシュ結合のためのメモリ領域です。大きなテーブルを処理する場合、このメモリ領域を大きく設定する必要があります。
    複数のバックエンドプロセスが同時に問い合わせ処理を実行すると、メモリが不足する場合もありますので、サーバマシンには充分な実メモリを搭載するようにしてください。

    (2)VACUUMメモリ領域(vacuum_mem)
    これは、VACUUM処理実行時に一時的に確保するメモリ領域です。


補足


(1)
PostgreSQLに限らず多くのマルチプロセスシステムは、共有メモリを使って複数のプロセス間のデータ共有や排他制御を行います。

(2)
トランザクションログ: データ操作履歴のこと。

(3)
この処理は“VACUUM処理”とよばれることがあります。

[PREVIOUS][UP][NEXT]