pg_buffercacheモジュールは、共有バッファキャッシュで何が起きているかをリアルタイムに確認する方法を提供します。
また、テスト目的で、低レベルでデータを取り出す方法も提供します。
このモジュールは、pg_buffercache_pages()関数(pg_buffercacheビューでラップされています)、pg_buffercache_numa_pages()関数(pg_buffercache_numaビューでラップされています)、pg_buffercache_summary()関数、pg_buffercache_usage_counts()関数、pg_buffercache_evict()関数、pg_buffercache_evict_relation()関数、およびpg_buffercache_evict_all()関数を提供します。
pg_buffercache_pages()関数は、各行が1つの共有バッファエントリの状態を記述するレコード集合を返します。
pg_buffercacheビューは、簡単に利用できるようにこの関数をラップしています。
pg_buffercache_numa_pages()関数は、共有バッファエントリのNUMAノードマッピングを提供します。
この情報は、pg_buffercache_pages()自体の一部ではありません。なぜなら、取得に時間がかかるからです。
pg_buffercache_numaビューは、簡単に利用できるようにこの関数をラップしています。
pg_buffercache_summary()関数は、共有バッファキャッシュの状態を要約した1行を返します。
pg_buffercache_usage_counts()関数は、各行が対応する使用カウントを持つバッファの数を記述するレコード集合を返します。
デフォルトでは、上記関数の使用はスーパーユーザとpg_monitorロールの権限を持つロールに限定されています。
他のユーザに対してはGRANTを使用してアクセス権を付与できます。
pg_buffercache_evict()関数は、バッファ識別子を指定して、ブロックをバッファプールから退避させることができます。
この関数の使用はスーパーユーザのみに制限されています。
pg_buffercache_evict_relation()関数は、リレーション識別子を指定して、ピン留めされていないすべての共有バッファをバッファプールから退避させることができます。
この関数の使用はスーパーユーザのみに制限されています。
pg_buffercache_evict_all()関数は、ピン留めされていないすべての共有バッファをバッファプール内で退避させることができます。
この関数の使用はスーパーユーザのみに制限されています。
pg_buffercacheビュー #ビューによって公開されている列の定義を表 F.14に示します。
表F.14 pg_buffercacheの列
列 型 説明 |
|---|
1から |
リレーションのファイルノード番号 |
リレーションのテーブル空間OID |
リレーションのデータベースOID |
リレーション内のフォーク番号。 |
リレーション内のページ番号 |
ダーティページかどうか? |
Clock-sweepアクセスカウント |
このバッファをピン留めしているバックエンドの数 |
共有キャッシュ内の各バッファに対して、1行が存在します。
未使用のバッファは、bufferidを除き、すべてのフィールドがNULLになります。
共有システムカタログは、OIDがゼロのデータベースに属するものとして表示されます。
キャッシュはすべてのデータベースで共有されているため、現在のデータベースに属さないリレーションのページも表示されます。
これは、一部の行に対して一致するpg_classの結合行が存在しない、間違った結合をしてしまう可能性すらあることを意味します。
pg_classに対して結合しようとする場合、現在のデータベースのOIDまたは0と等しいreldatabaseを持つ行に限定して結合することをお勧めします。
ビューが表示するバッファ状態データのコピーのために、バッファマネージャのロックを取得しません。このため、pg_buffercacheビューへのアクセスは、通常のバッファ処理への影響がより小さくなりますが、バッファすべてに渡る矛盾のない結果を提供しません。
しかしながら、各バッファの情報に自己矛盾がないことは保証されます。
pg_buffercache_numaビュー #ビューによって公開されている列の定義を表 F.15に示します。
表F.15 pg_buffercache_numaの列
列 型 説明 |
|---|
1から |
このバッファのOSメモリページの数 |
NUMAノードのID |
各ページのNUMAノードID照会は、メモリページをページインする必要があるため、この関数の最初の実行にはかなりの時間がかかることがあります。 いずれの場合も(最初の実行の有無にかかわらず)、この情報の取得にはコストがかかり、高い頻度でビューを照会することはお薦めしません。
NUMAノードを決定する場合、ビューは共有メモリセグメントのすべてのメモリページにアクセスします。 これにより、共有メモリがまだ割り当てられていない場合は強制的に割り当てられ、メモリは単一のNUMAノードに割り当てられる可能性があります(システム構成によります)。
pg_buffercache_summary()関数 #関数によって公開されている列の定義を表 F.16に示します。
表F.16 pg_buffercache_summary()出力列
列 型 説明 |
|---|
使用中の共有バッファの数 |
未使用の共有バッファの数 |
ダーティ共有バッファの数 |
ピン留めされた共有バッファの数 |
使用中の共有バッファの平均使用カウント |
pg_buffercache_summary()関数は、すべての共有バッファの状態を要約した単一の行を返します。
同様の、より詳細な情報はpg_buffercacheビューによって提供されますが、pg_buffercache_summary()はかなり安価です。
pg_buffercacheビューと同様に、pg_buffercache_summary()はバッファマネージャのロックを取得しません。
そのため、同時実行中の処理によって結果に小さな不正確さが生じる可能性があります。
pg_buffercache_usage_counts()関数 #関数によって公開されている列の定義を表 F.17に示します。
表F.17 pg_buffercache_usage_counts()出力列
列 型 説明 |
|---|
取り得るバッファ使用カウント |
その使用カウントのバッファの数 |
その使用カウントのダーティバッファの数 |
その使用カウントのピン留めされたバッファの数 |
pg_buffercache_usage_counts()関数は、すべての共有バッファの状態を要約した行の集合を返します。これは、取り得る使用カウント値に基づいて集計されます。
同様の、より詳細な情報はpg_buffercacheビューによって提供されますが、pg_buffercache_usage_counts()はかなり安価です。
pg_buffercacheビューと同様に、pg_buffercache_usage_counts()はバッファマネージャのロックを取得しません。
そのため、同時実行中の処理によって結果に小さな不正確さが生じる可能性があります。
pg_buffercache_evict()関数 #
pg_buffercache_evict()関数は、pg_buffercacheビューのbufferid列に示されるバッファ識別子を取ります。
バッファが退避され、フラッシュされたかどうかに関する情報を返します。
buffer_evicted列は成功時にtrueを返し、バッファが無効であった場合、ピン留めされているために退避できなかった場合、または書き出しを試みた後に再びダーティになった場合にfalseを返します。
buffer_flushed列は、バッファがフラッシュされた場合にtrueを返します。
これは、バッファが私たちによってフラッシュされたことを必ずしも意味するわけではなく、他の誰かによってフラッシュされた可能性があります。
同時アクティビティのためにバッファがいつでも再び有効になる可能性があるため、結果は返却時にすぐに古くなります。
この関数は、開発者のテストのみを目的としています。
pg_buffercache_evict_relation()関数 #
pg_buffercache_evict_relation()関数はpg_buffercache_evict()関数と非常によく似ています。
違いは、pg_buffercache_evict_relation()がバッファ識別子の代わりにリレーション識別子を取ることです。
この関数は、そのリレーションのすべてのフォークのすべてのバッファを排除しようとします。
排除されたバッファの数、フラッシュされたバッファの数、および排除できなかったバッファの数を返します。
フラッシュされたバッファは、必ずしも私たちによってフラッシュされたわけではありません。
他の誰かによってフラッシュされた可能性があります。
同時アクティビティのためにバッファがすぐに読み戻される可能性があるため、結果は返却時にすぐに古くなります。
この関数は、開発者のテストのみを目的としています。
pg_buffercache_evict_all()関数 #
pg_buffercache_evict_all()関数はpg_buffercache_evict()関数と非常によく似ています。
違いは、pg_buffercache_evict_all()関数が引数を取得しないことです。
代わりに、バッファプール内のすべてのバッファを排除しようとします。
排除されたバッファの数、フラッシュされたバッファの数、および排除できなかったバッファの数を返します。
フラッシュされたバッファは、必ずしも私たちによってフラッシュされたわけではありません。
他の誰かによってフラッシュされた可能性があります。
同時アクティビティのためにバッファがすぐに読み戻される可能性があるため、結果は返却時にすぐに古くなります。
この関数は、開発者のテストのみを目的としています。
regression=# SELECT n.nspname, c.relname, count(*) AS buffers
FROM pg_buffercache b JOIN pg_class c
ON b.relfilenode = pg_relation_filenode(c.oid) AND
b.reldatabase IN (0, (SELECT oid FROM pg_database
WHERE datname = current_database()))
JOIN pg_namespace n ON n.oid = c.relnamespace
GROUP BY n.nspname, c.relname
ORDER BY 3 DESC
LIMIT 10;
nspname | relname | buffers
------------+------------------------+---------
public | delete_test_table | 593
public | delete_test_table_pkey | 494
pg_catalog | pg_attribute | 472
public | quad_poly_tbl | 353
public | tenk2 | 349
public | tenk1 | 349
public | gin_test_idx | 306
pg_catalog | pg_largeobject | 206
public | gin_test_tbl | 188
public | spgist_text_tbl | 182
(10 rows)
regression=# SELECT * FROM pg_buffercache_summary();
buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg
--------------+----------------+---------------+----------------+----------------
248 | 2096904 | 39 | 0 | 3.141129
(1 row)
regression=# SELECT * FROM pg_buffercache_usage_counts();
usage_count | buffers | dirty | pinned
-------------+---------+-------+--------
0 | 14650 | 0 | 0
1 | 1436 | 671 | 0
2 | 102 | 88 | 0
3 | 23 | 21 | 0
4 | 9 | 7 | 0
5 | 164 | 106 | 0
(6 rows)
Mark Kirkwood <markir@paradise.net.nz>
設計協力: Neil Conway <neilc@samurai.com>
デバッグのアドバイス: Tom Lane <tgl@sss.pgh.pa.us>