pgbenchを利用したベンチマークテスト実施方法

どんなデータベースでもそうですがインストール直後の設定で性能要件を満たせることはまずないと思います。
実運用前の導入試験においては必ず性能要件を確認するためにベンチマークテストを行うと思います。

PostgreSQLにはpgbenchというベンチマークツールがあるのでこれを利用する手順と、メモリ周辺の設定に関する個人的な見解を簡単にメモします。

今回示すのは基本的な利用手順だけにとどめます。
細かなことはマニュアルを見ればわかるし、システムの特性によってどのようなベンチマーク試験を行うか異なるし、そもそもの用途は自分用のメモなので。
(PCの突然の故障により過去の調査記録を失うのはもう嫌なので・・・)

pgbenchはPostgreSQL9.2の場合postgresql92-contribパッケージに含まれているので事前にインストールしていることが前提です。

ベンチマーク用のユーザとデータベースの作成


createuser -P [ベンチマークユーザ]
createdb -O [ベンチマークユーザ] [ベンチマークDB]

postgresql.confの設定
DBのボトルネックとなるのはやはりI/O待ちによる要因が一番大きく、検索、更新を行うデータのメモリヒット率がカギになってくると思います。
また、チェックポイント処理の間隔や、PostgreSQLは追記型のデータベースであり、HOTが導入されてたとはいえバキューム処理も考慮する必要があるのではないかと思います。
個人的にはまず入り口として以下の項目を中心に見ればいいのではないかなと思います。(自分はデータベースのスペシャリストではないので、間違いもあると思います。もし指摘があればコメント願います。)


・max_connections
→デフォルトは100コネクション(規模に合わせて適切に設定)。
・shared_buffers
→デフォルトは32MBと数GBメモリが主流の現在のシステムでは小さすぎる。利用可能な実メモリの1/4〜1/2程度
・temp_buffers
→一時テーブルにアクセスする際に利用される。(デフォルト値は8MB)巨大な一時テーブルを利用する場合は適切に設定
・work_mem
→ソートなどで利用される。(大体2048〜4096KB? 大量データを頻繁にソートするなどによって変わるかと。explainでクエリを要確認・・・)
・wal_buffers
→shared_buffersの1/32程度(?)
・checkpoint_segments
→1トランザクションファイルあたり16MBでデフォルト値が3のため、16*3で48MBとなりチェックポイント処理が頻発する可能性がある。
(規模にもよるが64〜256ぐらい?)
・wal_keep_segments
→8〜32が妥当らしい(?)
・effective_cache_size
→利用可能な実メモリの1/4〜1/2程度(?)
・maintenance_work_mem
→バキューム処理などで利用されるメモリ。更新などが多い場合に値を大きめに設定すると良い(?)

■pgbenchの利用方法
postgresql.confの設定が完了するといよいよ性能試験を行うわけですが、まずは最初に作成したベンチマークDBを初期化してベンチマーク用のテーブルを作成します。


pgbench -i -U [ベンチマークユーザ] [ベンチマークDB]

上記コマンドを実行すると、スケーリングファクタ1で指定ユーザのデータベースにベンチマーク用のテーブルとデータが作成されます。
スケーリングファクタ1で10万件のデータが作成されます。従って100だと1000万件です。デフォルト以外のスケーリングファクタを設定する場合は"-s"オプションの後に値を設定してください。

データベースの初期化が完了したら、あとはベンチマークを取るのみです。pgbenchを利用したもっとも基本的なベンチマーク試験を実行するには以下のコマンドを実行します。


pgbench -c 100 -t 100 -U [ベンチマークユーザ] [ベンチマークDB]

上記コマンドは指定したユーザのDBに対して100コネクション同時接続(-c)し、1コネクションあたり100トランザクションの処理(-t)を実行します。

ちなみにデータベース初期化時、及びベンチマーク実行時に-Uでユーザ名を指定しないとpostgresユーザで実行されます。ここでは、ベンチマーク用のユーザで実行したかったのであえて指定しましたが管理ユーザで実施する場合は不要です。

pgbenchはユーザ定義スクリプトなども利用可能なため興味がある方はマニュアルなどを見ていろいろ試してみてください。