他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.30. pg_prewarm

pg_prewarmはオペレーティングシステムのバッファキャッシュまたはPostgreSQLのバッファキャッシュいずれかにリレーションデータをロードするための便利な方法を提供します。 プレウォームはpg_prewarm関数を使って手動で行うこともできますし、pg_prewarmshared_preload_librariesに含めることで自動でも実行できます。 後者の場合には、システムは、定期的にautoprewarm.blocksという名前のファイルに共有バッファの内容を記録するバックグラウンドワーカーを実行し、再起動後には2つのバックグラウンドワーカー使って同じブロックを再ロードします。

F.30.1. 関数

pg_prewarm(regclass, mode text default 'buffer', fork text default 'main',
           first_block int8 default null,
           last_block int8 default null) RETURNS int8

第1引数はプレウォーム(あらかじめロード)したいリレーションを指定します。 第2引数はプレウォームに使用する方法を指定します。詳細は以下でさらに説明します。第3引数はプレウォームされるリレーションフォークを指定します、これは通常mainです。 第4引数は、プレウォームを開始するブロックを指定します(NULLはゼロとみなされます)。 第5引数は終了ブロックを指定します(NULL はリレーションの最後のブロックまで指定したとみなされます)。 返り値は、プレウォームされたブロック数です。

プレウォームに使用する方法としては以下の3種類が使用可能です。 prefetchは、オペレーティングシステムに非同期のプレフェッチをリクエストします。もしオペレーティングシステムやビルド時にプレフェッチをサポートしていない場合はエラーとなります。 readは、ブロックの要求された範囲を読み込みます。prefetchとは違って、すべてのプラットフォームにサポートするようにビルドされていますが、速度が遅くなります。 bufferは、データベースのバッファキャッシュに要求された範囲を読み込みます。

これらの方法のいずれかでもキャッシュ出来るよりも多くのブロックをプレウォームしようとすると注意が必要です。prefetchreadのようなOSのキャッシュを使用する場合、または PostgreSQLbufferにキャッシュする場合、高い番号のブロックが読み込まれると低い番号のブロックが追い出されます。 プレウォームは、キャッシュに対して特別な保護をしていないので、それが他のシステムにとって可能であるように、それらが読み込まれた直後に、新しいプレウォームによって追い出すことが可能です。逆に、プレウォームはキャッシュから他のデータを追い出すこともあります。 これらの理由から、プレウォームはキャッシュが主に空のとき、一般的には起動時にもっとも有用です。

autoprewarm_start_worker() RETURNS void

自動プレウォームワーカーを起動します。 通常これは自動的に行なわれますが、サーバーのスタート時に自動プレウォームが設定されておらず、後でワーカーを起動したい場合に有用です。

autoprewarm_dump_now() RETURNS int8

直ちにautoprewarm.blocksを更新します。 これは、自動プレウォームワーカーが動いていなくて、次の再起動後に自動プレウォームワーカーを動かそうと考えているときに有用かもしれません。 戻り値はautoprewarm.blocksに書き込まれたブロック数です。

F.30.2. 設定パラメータ

pg_prewarm.autoprewarm (boolean)

サーバーが自動プレウォームワーカーを起動すべきかどうかを制御します。 デフォルトはonです。 このパラメータはサーバ起動時のみ設定可能です。

pg_prewarm.autoprewarm_interval (integer)

これはautoprewarm.blocksを更新する間隔です。 デフォルトは300秒です。 0に設定すると、このファイルは定常間隔では更新されず、サーバーが停止する時にだけ更新されます。

これらのパラメータはpostgresql.confで設定しなければなりません。 典型的な使用法は以下の通りです。

# postgresql.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

F.30.3. 作者

Robert Haas