PostgreSQL 8 全体的なチューニング tuning

postgres 8.3

共通

max_connections = 100
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_messages = info
log_error_verbosity = verbose
log_line_prefix = '%t:%r[%p-%v]'
log_autovacuum_min_duration = 0
autovacuum = on
default_statistics_target = 100 # range 1-1000
log_min_duration_statement = 500ms
log_lock_waits = on
deadlock_timeout = 30s

メモリ:4GB の場合

shared_buffers = 1GB
work_mem = 16MB
wal_buffers = 256KB
checkpoint_segments = 16
random_page_cost = 3.0
effective_cache_size = 1GB

http://doruby.kbmj.com/o2_Ruby_On_Rails/20090916/PostgreSQL_8.3___postgresql.conf__

こんにちは、O2 です。
今回は、postgresql の設定ファイル(postgresql.conf) に関しての、私が最近設定しているデフォルト値を公開しようと思います。

実際、インストール直後の設定では、「ロースペックのマシン環境でも動作する」設定の為最近のサーバースペックにあった、デフォルト値を記述してみようと思います。
とは言っても、私が扱っている最近のサーバーのメモリは、8GB、16GB、32GB で、さらにPostgreSQL 8.3以降を使用しているので、PostgreSQL 8.3以降での、メモリ3パターンでのデフォルト値を紹介します。
注意.あくまでも、私が割り出したデフォルト値ですので、どのように使用するかによってチューニングは必要になりますので、参考にご使用ください。

説明の前に

 PostgreSQL 8.2 以降かな?(間違っていたらだれか指摘してね)、設定値関して shared_buffers などのメモリ設定が、MB(メガバイド)や、GB(ギガバイト)という単位で設定できるようになっている為、設定しやすくなっています。

共通
 max_connections = 200
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_messages = info
log_error_verbosity = verbose
log_line_prefix = '%t:%r[%p-%v]'
log_autovacuum_min_duration = 0
autovacuum = on
log_lock_waits = on
deadlock_timeout = 30s

メモリ:8GB の場合
shared_buffers = 2GB
work_mem = 32MB
wal_buffers = 512KB
checkpoint_segments = 16
random_page_cost = 3.0
effective_cache_size = 2GB

メモリ:16GB の場合
shared_buffers = 3GB
work_mem = 32MB
wal_buffers = 512KB
checkpoint_segments = 16
random_page_cost = 3.0
effective_cache_size = 3GB

メモリ:32GB の場合
shared_buffers = 8GB
work_mem = 64MB
wal_buffers = 512KB
checkpoint_segments = 32
random_page_cost = 3.0
effective_cache_size = 8GB

※今回の設定は、サーバーをDB専用にした場合を想定して書いてます。

log_lock_waits

19.8. エラー報告とログ取得

log_lock_waits (boolean)

セッションがロックの獲得までの間にdeadlock_timeoutより長く待機する場合にログメッセージを生成するかどうかを制御します。 これは、ロックが待たされ性能がでていないのかどうか決める時に有用です。 デフォルトはoffです。

maintenance_work_mem

14.4. データベースへのデータ投入

14.4.5. maintenance_work_memを増やす

大規模なデータをロードする時maintenance_work_mem設定変数を一時的に増やすことで性能を向上させることができます。 これは、CREATE INDEXコマンドとALTER TABLE ADD FOREIGN KEYの速度向上に役立ちます。 COPY自体には大して役立ちませんので、この助言は、上述の技法の片方または両方を使用している時にのみ有用です。

16M → 64M

http://nhh.mo-blog.jp/ttt/2008/05/freebsd_postgre_e31a.html

wal_buffers

(8.3) デフォルトは 64kB

PostgreSQL関連情報

checkpoint_segments

(8.3) デフォルトは 3

random_page_cost

(8.3) デフォルトは 4.0

random_page_cost = 3.0 or 2.0

インデックスを使うようになる。

default_statistics_target

19.7. 問い合わせ計画

default_statistics_target(整数)

ALTER TABLE SET STATISTICSで列特定の目的セットを所有していなかったテーブル列に対し、デフォルトの統計対象を設定します。 より大きい値はANALYZEに必要なの時間を増加させますが、プランナの予測の品質を向上させます。 デフォルトは100です。 PostgreSQLの問い合わせプランナによる統計情報の使用法に関するより詳細な情報は、項14.2を参照してください。

Selectively Setting Statistics Sample Size

The default for this is 100 (as of 8.4). If you're on 8.3, I'd recommend setting it to 100; the old default size of 10 is good enough only for very small or very consistent databases.

default_statistics_target = 100 # range 1-1000

8.3 は デフォルト10 なので 100 にする
8.4 は デフォルト100

temp_buffers

一時テーブル用

Sets the maximum number of temporary buffers used by each database session. These are session-local buffers used only for access to temporary tables. The default is eight megabytes (8MB).
http://www.postgresql.org/docs/current/interactive/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-MEMORY

参考

Tuning Your PostgreSQL Server/ja - PostgreSQL wiki

PostgreSQLの設定 チューニング — そこはかとなく書くよん。

PgDay 2012 Japan | 日本PostgreSQLユーザ会
実践!PostgreSQL運用
http://www.postgresql.jp/events/pgday12files

work_memを柔軟に運用すると、設計・運用に幅がでる

BEGIN;
SET LOCAL work_mem to ‘64MB’;

    • SQLs that needs memory;

COMMIT;