pg_prewarmはオペレーティングシステムのバッファキャッシュまたはPostgreSQLのバッファキャッシュいずれかにリレーションデータをロードするための便利な方法を提供します。
プレウォームはpg_prewarm関数を使って手動で行うこともできますし、pg_prewarmをshared_preload_librariesに含めることで自動でも実行できます。
後者の場合には、システムは、定期的にautoprewarm.blocksという名前のファイルに共有バッファの内容を記録するバックグラウンドワーカーを実行し、再起動後には2つのバックグラウンドワーカー使って同じブロックを再ロードします。
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は、ブロックの要求された範囲を読み込みます。プレフェッチとは違って、すべてのプラットフォームにサポートするようにビルドされていますが、速度が遅くなります。
bufferは、データベースのバッファキャッシュに要求された範囲を読み込みます。
これらの方法のいずれかでもキャッシュ出来るよりも多くのブロックをプレウォームしようとすると注意が必要です。prefetchやreadのようなOSのキャッシュを使用する場合、または PostgreSQLのbufferにキャッシュする場合、高い番号のブロックが読み込まれると低い番号のブロックが追い出されます。
プレウォームは、キャッシュに対して特別な保護をしていないので、それが他のシステムにとって可能であるように、それらが読み込まれた直後に、新しいプレウォームによって追い出すことが可能です。逆に、プレウォームはキャッシュから他のデータを追い出すこともあります。
これらの理由から、プレウォームはキャッシュが主に空のとき、一般的には起動時にもっとも有用です。
autoprewarm_start_worker() RETURNS void
自動プレウォームワーカーを起動します。 通常これは自動的に行なわれますが、サーバーのスタート時に自動プレウォームが設定されておらず、後でワーカーを起動したい場合に有用です。
autoprewarm_dump_now() RETURNS int8
直ちにautoprewarm.blocksを更新します。
これは、自動プレウォームワーカーが動いていなくて、次の再起動後に自動プレウォームワーカーを動かそうと考えているときに有用かもしれません。
戻り値はautoprewarm.blocksに書き込まれたブロック数です。
Robert Haas <rhaas@postgresql.org>