PostgreSQLのベンチマーク試験ツールであるpgbenchについて調べる機会があったので備忘録も兼ねて残しておきます。
pgbenchとは
- PostgreSQL上でベンチマーク試験を行うツール
- PostgreSQLに同梱されている
- デフォルトでTPC-Bに基づいたシナリオを実行できる
pgbenchで実行されるシナリオ
TPC-Bに基づいた下記のシナリオ(トランザクション)がデフォルトで実行される。
※カスタムファイルを使用することでオリジナルのシナリオにすることも可能。
TPC-Bとは
Transaction Processing Performance Councilが制定したデータベースの性能を測定するためのベンチマークの一つ。
銀行の窓口業務をモデルにしたトランザクションを実行し、オンライン・トランザクション処理(OLTP)システムの性能を測定する。
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
シナリオで使用されるテーブル
pgbenchの初期化コマンドを実行すると自動で下記のテーブルが作成される
- pgbench_accounts : 顧客の銀行口座情報
- pgbench_tellers : 銀行の窓口情報
- pgbench_branches : 銀行の支店情報
- pgbench_history : 取引履歴情報
テーブルの初期データ
table | # of rows |
---|---|
pgbench_branches | 1 |
pgbench_tellers | 10 |
pgbench_accounts | 100000 |
pgbench_history | 0 |
pgbench実行手順
1. 初期化
pgbench -i [ other-options ] dbname
dbnameの部分はリモートサーバーから接続する場合はpsqlと同様に-h(ホスト名), -p(ポート), -U(接続ユーザ)を指定する。
- 主な実行時オプション
- -s (scale_factor) : 生成するデータのレコード数を倍率で指定。指定しない場合のテーブルの初期データは上記の通りだが、例えば-sで2を指定すると各テーブルの初期データ数が2倍になる。
初期化時の考慮事項
デフォルトのTPC-Bのような試験シナリオでは、初期倍率(-s)を試験予定のクライアント数(-c)の最大値と同程度にしなければなりません。 pgbench_branchesテーブルには-s行しかありません。
また、前トランザクションはその内の1つを更新しようとします。 ですので、-c値を-sより大きくすると、他のトランザクションを待機するためにブロックされるトランザクションが多くなることは間違いありません。
(公式マニュアルより抜粋)
→ つまり-sで指定する倍率はテスト実行時に指定するクライアント数と同じかそれより大きくする必要がある
2. 実行
pgbench [ options ] dbname
- 主な実行時オプション
- -c (clients) : 模擬するクライアント数、つまり、同時に実行されるデータベースセッション数。 デフォルトは1。
- -C (connect) : 各クライアントセッションが一度だけ接続を確立するのではなく、各トランザクションが新しい接続を確立する。 接続オーバーヘッドを測定する場合に有用。
- -t (transaction) : 各クライアントが実行するトランザクション数。 デフォルトは10。大文字の-Tオプションを使用するとトランザクション数ではなく指定秒数の間テストを実行することができる
- -j (threads) : pgbench内のワーカスレッド数。 複数のスレッドを使用することはマルチCPUマシンで有用。
- -l (log) : 各トランザクションで費やした時間をログファイルに書き出す。
その他のオプションは公式ドキュメントを参照
3. 実行結果
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 1
maximum number of tries: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
number of failed transactions: 0 (0.000%)
latency average = 11.013 ms
latency stddev = 7.351 ms
initial connection time = 45.758 ms
tps = 896.967014 (without initial connection time)
補足
-
query mode
実行時に-Mオプションで指定したモード。デフォルトではsimple(簡易問い合わせプロトコル)になる。 -
number of transactions actually processed
完了トランザクション数/予定トランザクション数