PostgreSQLのベンチマークツール pgbenchを試す

PostgreSQLのシンプルなベンチマークツールのpgbenchを触ってみたので、その時のメモです。

ちなみに、pgbenchは下記のサイトにとても詳しく使い方が載っています。(作者の石井さんの記事)

PostgreSQLは、下記記事でインストールしたものを使っています。

pgbenchのインストール

PostgreSQL本体と同様に、公式サイトのRPMリポジトリからインストールします。(リポジトリの登録は、CentOS 6 に PostgreSQL 8.4 をインストール - Enjoy*Study をご参照ください)

postgresql-contrib に pgbenchが含まれています。

[root@localhost ~]# yum install postgresql84-contrib

pgbenchを試す

pgbench では、TPC-Bに基づいたシナリオを簡単に実行できるようになっています。(スクリプトを書くことで、他のシナリオも作れます)

ということで、TPC-Bを試してみます。

テスト用のテーブルおよびデータを作成します。-i で指定したDBに対して初期化するようなイメージです。(今回はtestというDBに対して作成しています)

-bash-4.1$ /usr/pgsql-8.4/bin/pgbench -i test
NOTICE:  table "pgbench_branches" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_history" does not exist, skipping
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_branches_pkey" for table "pgbench_branches"
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_tellers_pkey" for table "pgbench_tellers"
NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_accounts_pkey" for table "pgbench_accounts"
vacuum...done.
-bash-4.1$

10クライアントから1000回のトランザクションを発行します。(-c がクライアント数、-t がトランザクション数)

-bash-4.1$ /usr/pgsql-8.4/bin/pgbench -c 10 -t 1000 test
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 897.797595 (including connections establishing)
tps = 899.648930 (excluding connections establishing)

とても簡単ですね。

独自スクリプトを指定しての実行

独自のスクリプトを書いてみます。

1行1SQLで書きます。あと、メタコマンドとして、変数や乱数、sleepなどが使えます。使えるコマンドは、PostgreSQLのマニュアルに書いてありますので、そちらが参考になります。

-bash-4.1$ emacs test.sql
BEGIN;
\setrandom aid 10 1000

SELECT * FROM pgbench_accounts WHERE aid > :aid ORDER BY aid LIMIT 10;
SELECT * FROM pgbench_accounts WHERE aid < :aid ORDER BY aid DESC LIMIT 10;

END;

スクリプトを指定して実行します。

-bash-4.1$ /usr/pgsql-8.4/bin/pgbench -f test.sql -c 10 -t 1000 test
starting vacuum...end.
transaction type: Custom query
scaling factor: 1
query mode: simple
number of clients: 10
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 3359.933930 (including connections establishing)
tps = 3383.181124 (excluding connections establishing)

複雑なシナリオは難しそう(取り出したデータを使って、何か行うなど)ですが、アプリ側の動作に基づくシナリオを用意しておいて、DBのチューニングの際に繰り返し実行したりするのに使えそうに思えました。

PostgreSQLのログに一連のクエリを出力して、そこからpgbenchのシナリオ作れたりすると捗りそうですが、プリペアドステートメントが入るとちょっと難しいかな…