
- PostgreSQL
- EDB
アシストがPostgreSQLグローバル開発グループのSponsor一覧に掲載されたので、中の人に話を聞いてみた!(前編)
アシストは2009年からPostgreSQLのプロダクトサポートを開始、2010年に日本PostgreSQLユーザー会への協賛会員として参画、2012年にPostgreSQL エンタープライズ・コンソーシアムに参画しています。現在JPUGで活躍する田中・喜田の両名がどのような活動をしているのか2回にわたってお届けします。
|
PostgreSQL/EDB Postgres Advanced Server(以降、EPAS)11にて、PostgreSQL/EPAS停止前の共有バッファ(shared buffers)の内容を復元する autoprewarm機能が実装されました。今回は、そのautoprewarm機能についてご紹介します。
autoprewarmは、PostgreSQL/EPAS11でpg_prewarmに追加された再起動前の共有バッファを自動的に復元する機能です。
pg_prewarmでは、ユーザが手動でテーブルやインデックスを指定することで共有バッファにキャッシュさせることができますので、初回アクセス時のI/Oによるパフォーマンスダウンを防げます。だだし、再起動後には共有バッファの内容がクリアされてしまいます。
autoprewarmでは、停止前の共有バッファの内容が起動時に自動で復元されるため、PostgreSQL再起動後の性能劣化を予防できます。autoprewarmの機能を有効にするには、postgresql.confのpg_prewarm.autoprewarmパラメータをon(デフォルトはon)にした上でshared_preload_libraries = 'pg_prewarm'を設定し、pg_ctl restartコマンドで設定内容を反映させる必要があります。
共有バッファの内容は、autoprewarm.blocksファイルにて保持し、PostgreSQL/EPAS起動時にこのファイルを読み、共有バッファを復元します。このファイルにはデータベースのoidやオブジェクトのfilenode、テーブルスペースのoid等が記録されており、バックグラウンドワーカプロセス:autoprewarm masterによって定期的に更新されます。
また、検証結果からautoprewarm機能によりDB再起動前後の共有バッファ上のオブジェクトが同一であることが確認できます。
--postgresql.confの shared_preload_librariesに pg_prewarmを追加 $ cat postgresql.conf | grep shared_preload_libraries shared_preload_libraries = 'pg_prewarm' --PostgreSQLを再起動して、設定内容を反映 $ pg_ctl restart --shared_preload_librariesが適切に設定されていることを確認 postgres=# show shared_preload_libraries; shared_preload_libraries -------------------------- pg_prewarm (1 行) --pg_buffercacheを使用してtest表のデータがキャッシュされていないことを確認 postgres=# SELECT c.relname, count(*) AS buffers postgres-# FROM pg_buffercache b INNER JOIN pg_class c postgres-# ON b.relfilenode = pg_relation_filenode(c.oid) AND postgres-# b.reldatabase IN (0, (SELECT oid FROM pg_database postgres(# WHERE datname = current_database())) postgres-# GROUP BY c.relname postgres-# having c.relname = 'test' postgres-# ORDER BY 2 DESC; relname | buffers ---------+--------- (0 行) --test表を参照後は、test表のデータがキャッシュされていることを確認 postgres=# select * from test; col ----- AAA (1 行) postgres=# SELECT c.relname, count(*) AS buffers postgres-# FROM pg_buffercache b INNER JOIN pg_class c postgres-# ON b.relfilenode = pg_relation_filenode(c.oid) AND postgres-# b.reldatabase IN (0, (SELECT oid FROM pg_database postgres(# WHERE datname = current_database())) postgres-# GROUP BY c.relname postgres-# having c.relname = 'test' postgres-# ORDER BY 2 DESC; relname | buffers ---------+--------- test | 1 (1 行) --PostgreSQLを再起動 $ pg_ctl restart --停止前のバッファの状態を復元できるか確認 postgres=# SELECT c.relname, count(*) AS buffers postgres-# FROM pg_buffercache b INNER JOIN pg_class c postgres-# ON b.relfilenode = pg_relation_filenode(c.oid) AND postgres-# b.reldatabase IN (0, (SELECT oid FROM pg_database postgres(# WHERE datname = current_database())) postgres-# GROUP BY c.relname postgres-# having c.relname = 'test' postgres-# ORDER BY 2 DESC; relname | buffers ---------+--------- test | 1★ (1 行) --explain analyzeを実行して、キャッシュヒットするか確認 postgres=# explain (analyze,buffers) select * from test; QUERY PLAN ----------------------------------------------------------------------------------------------- Seq Scan on test (cost=0.00..1.01 rows=1 width=32) (actual time=0.031..0.033 rows=1 loops=1) Buffers: shared hit=1★ Planning Time: 0.120 ms Execution Time: 0.060 ms (4 行)
autoprewarm機能を有効にしたとしても、VACUUM FULLが実行された場合はバッファのデータがクリアされてしまうので、該当データに再度アクセスする等してキャッシュし直す必要があります。
今回は、PostgreSQL11から追加された autoprewarm機能をご紹介しました。autoprewarmを有効にすることで、例えば夜間に定期的にバックアップやメンテナンスのために 再起動を行っても、翌朝のパフォーマンス低下防止に効果が期待できます。 PostgreSQLの再起動後のパフォーマンスに不安がある方は、
PostgreSQL/EPAS11にバージョンアップ
することをご検討ください。
![]() |
---|
アシスト北海道
2016年入社。Oracle Database、PostgreSQL/EDB Postgresのサポートエンジニアとして活動中。このブログでは、お客様から日々寄せられる多くのご質問のうち、お役立ていただけそうなテーマを選定してご紹介していきます。
■本記事の内容について
本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。
■商標に関して
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
アシストは2009年からPostgreSQLのプロダクトサポートを開始、2010年に日本PostgreSQLユーザー会への協賛会員として参画、2012年にPostgreSQL エンタープライズ・コンソーシアムに参画しています。現在JPUGで活躍する田中・喜田の両名がどのような活動をしているのか2回にわたってお届けします。
2022年5月26日~6月3日に開催される「Cloud Database Days 2022」。その中でも10個に分かれた技術セッションについて、ポイントを押さえてそれぞれご紹介いたします!
2022年4月22日(金)に開催する「アシスト流 EDB活用術 on AWS」の内容をチラ見せ。「EDBって何?」という方から「EDBは知ってるけどクラウド上でもEDB??」という方まで、ぜひお申し込みください。