Database Support Blog

Database Support Blog>【PostgreSQL/EPAS11 新機能】autoprewarmでPostgreSQL再起動後の性能劣化を予防しよう

  • PostgreSQL
  • EDB Postgres
2019.04.16

【PostgreSQL/EPAS11 新機能】autoprewarmでPostgreSQL再起動後の性能劣化を予防しよう

PostgreSQL/EDB Postgres Advanced Server(以降、EPAS)11にて、PostgreSQL/EPAS停止前の共有バッファ(shared buffers)の内容を復元する autoprewarm機能が実装されました。今回は、その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の注意点

autoprewarm機能を有効にしたとしても、VACUUM FULLが実行された場合はバッファのデータがクリアされてしまうので、該当データに再度アクセスする等してキャッシュし直す必要があります。


まとめ

今回は、PostgreSQL11から追加された autoprewarm機能をご紹介しました。autoprewarmを有効にすることで、例えば夜間に定期的にバックアップやメンテナンスのために 再起動を行っても、翌朝のパフォーマンス低下防止に効果が期待できます。 PostgreSQLの再起動後のパフォーマンスに不安がある方は、 PostgreSQL/EPAS11にバージョンアップ することをご検討ください。


筆者情報

アシスト北海道

2016年入社。Oracle Database、PostgreSQL/EDB Postgresのサポートエンジニアとして活動中。このブログでは、お客様から日々寄せられる多くのご質問のうち、お役立ていただけそうなテーマを選定してご紹介していきます。


データベースのサポートならアシスト

関連している記事

  • PostgreSQL
  • EDB Postgres
2018.12.12

レプリケーションスロットを使用する際の4つの注意点

レプリケーションスロットを使用する際の4つの注意点を紹介します。

  • PostgreSQL
  • EDB Postgres
2018.10.19

【PostgreSQL/EPAS11 新機能】バックアップと同時にデータ破損チェック!

pg_basebackupにチェックサムの検証機能が付きました。

  • PostgreSQL
  • EDB Postgres
2018.07.26

EPASやPostgreSQLをメジャーバージョンアップする方法(pg_dumpall編)

pg_dumpallを使用してEPASやPostgreSQLをメジャーバージョンアップする方法をご紹介します。

アシストサポートセンターのご紹介

ページの先頭へ戻る