patorashのブログ

方向性はまだない

pgbenchをとりあえず使ってみた

勉強をしているので、pgbenchを使ってみた。pgbenchはPostgreSQLベンチマークツール。

lets.postgresql.jp

ただし、pgbenchは厳密な意味でのベンチマークツールではありません。TPC(http://www.tpc.org)などで「公式」に認められているような性能測定を行う目的には向いていません。その点はご注意下さい。

とあるので、あくまでも公式ではない点に注意。

yumpostgresql-contribをいれてあるので、pgbenchはもう使える状態になっていた。入ってない場合は入れること。

sudo yum install postgresql-contrib

pgbenchを試す

データベースを作成する

pgbenchを実行するためのデータベースを作成する。postgresユーザになってから作業すると楽。

sudo -i -u postgres

データベースを作る

createdb benchdb

pgbench用にデータベースを初期化する

-iオプションで、初期化される。-sオプションに数字を渡すと、サンプルデータ量が増える。デフォルトで10万件なので、-s 10にすると100万件入る。-fでフィルファクターの値も指定できるらしい。とりあえず最初なので、素のままにする。

pgbench -i benchdb

以下のように、テーブルを再作成してデータを突っ込んで完了。

-bash-4.2$ pgbench -i benchdb
dropping old tables...
creating tables...
generating data...
100000 of 100000 tuples (100%) done (elapsed 0.11 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.

測定する

以下のコマンドで測定可能。ただし、オプションがない状態だと、ほとんど参考にならない(らしい)。今回はpgbenchがちゃんと動くことを確認するために一旦何もなしで動かす。

pgbench benchdb

結果は以下の通り。

-bash-4.2$ pgbench benchdb
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
latency average = 3.660 ms
tps = 273.251220 (including connections establishing)
tps = 319.517166 (excluding connections establishing)

TPS(一秒あたりのトランザクション数)の値が、性能を表す。これが高ければ高いほど良い。

項目 項目の説明
scaling factor 1 DBを初期化したときのデータ量。-sの値。デフォルトで1(10万件)
query mode simple クエリモード(simple | extends | prepared)
number of clients 1 同時接続クライアント数
number of threads 1 接続スレッド数
number of transactions per client 10 1クライアント辺りのトランザクション
number of transactions actually processed 10/10 正常終了したトランザクション
latency average 3.660ms 遅延時間
tps(including connections establishing) 273.251220 PostgreSQLに対する接続を確立する時間を含んだTPS
tps(excluding connections establishing) 319.517166 PostgreSQLに対する接続を確立する時間を含まないTPS

オプションを渡すことで様々な条件で検証できる。更新を含むトランザクションを発行するが、更新を含まないようにするオプションもある。参照用DBの場合には有効だ。

また、デフォルトだとpgbenchの条件で作られたテーブル構造でしかテストできないが、テーブル定義と発行したいクエリさえ準備できれば、pgbench経由で検証することが可能らしいので、実際のテーブル定義などを準備して本番に近い形で負荷試験をすることも可能っぽい。ただ、それは準備が相当大変になるだろう…。

どういうふうに検証を進めていけばいいのか?

これが正直わからない。 恐らく、

  1. 想定接続数とトランザクション数を徐々に増やしつつ、トランザクションが全て成功した上で最もTPSが出たところを基本にする。
  2. postgresql.confの項目を1つ修正する。
  3. ベンチマークを取り直す。
  4. TPSが上がったら設定を生かす。そうでなければ違う値にするか元に戻す。

を地道に繰り返すのかなぁ~と思う。

いい方法があれば教えていただきたい。

後日、postgresql.confを修正してからやったものなどを書いてみようと思う。