勉強をしているので、pgbenchを使ってみた。pgbenchはPostgreSQLのベンチマークツール。
ただし、pgbenchは厳密な意味でのベンチマークツールではありません。TPC(http://www.tpc.org)などで「公式」に認められているような性能測定を行う目的には向いていません。その点はご注意下さい。
とあるので、あくまでも公式ではない点に注意。
yumでpostgresql-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経由で検証することが可能らしいので、実際のテーブル定義などを準備して本番に近い形で負荷試験をすることも可能っぽい。ただ、それは準備が相当大変になるだろう…。
どういうふうに検証を進めていけばいいのか?
これが正直わからない。 恐らく、
- 想定接続数とトランザクション数を徐々に増やしつつ、トランザクションが全て成功した上で最もTPSが出たところを基本にする。
- postgresql.confの項目を1つ修正する。
- ベンチマークを取り直す。
- TPSが上がったら設定を生かす。そうでなければ違う値にするか元に戻す。
を地道に繰り返すのかなぁ~と思う。
いい方法があれば教えていただきたい。
後日、postgresql.confを修正してからやったものなどを書いてみようと思う。