pgbench — PostgreSQLに対してベンチマーク試験を行う
pgbench
-i
[option
...] [dbname
]
pgbench
[option
...] [dbname
]
pgbenchはPostgreSQL上でベンチマーク試験を行う単純なプログラムです。
これは同一のSQLコマンドの並びを何度も実行します。複数の同時実行データベースセッションで実行することもできます。
そして、トランザクションの速度(1秒当たりのトランザクション数)の平均を計算します。
デフォルトでpgbenchは、1トランザクション当たり5つのSELECT
、UPDATE
、INSERT
コマンドを含むおおよそTPC-Bに基いたシナリオを試験します。
しかし、独自のトランザクションスクリプトファイルを作成することで他の試験ケースを簡単に実行することができます。
pgbenchの典型的な出力を以下に示します。
transaction type: TPC-B (sort of) scaling factor: 10 query mode: simple number of clients: 10 number of threads: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 85.184871 (including connections establishing) tps = 85.296346 (excluding connections establishing)
最初の6行はいくつかの最重要パラメータの設定を表示しています。
次行が完了トランザクション数と予定トランザクション数です(後者は単なるクライアント数とクライアント毎のトランザクション数の積算結果です。)
実行が完了する前に失敗しない限りこれは等しくなります。
(-T
モードでは、トランザクションの実際の数が表示されます)
最後の2行は、データベースセッションを開始するための時間を含める場合と含めない場合の1秒当たりのトランザクション数を示します。
デフォルトのTPC-Bと似たトランザクション試験では、あらかじめ設定する特定のテーブルが必要です。
これらのテーブルを作成し、データを投入するためには、-i
(初期化)オプションを付けてpgbenchを呼び出さなければなりません。
(独自スクリプトを試験する場合、この手順は必要ありません。
しかし代わりに試験に必要な何らかの設定を行わなければならないでしょう。)
初期化は以下のようになります。
pgbench -i [other-options
]dbname
ここでdbname
は試験用に前もって作成されたデータベースの名前です。
(またデータベースサーバの接続方法を指定するために、-h
、-p
、-U
が必要になるかもしれません。)
pgbench -i
は4つのテーブルpgbench_accounts
、pgbench_branches
、pgbench_history
、pgbench_tellers
を作成します。
もしあればこうした名前のテーブルは破壊されます。
もし同じ名前のテーブルが存在する場合にはよく注意してください。
デフォルトの「倍数」の1では、テーブルは初期状態で以下の行数を含みます。
table # of rows --------------------------------- pgbench_branches 1 pgbench_tellers 10 pgbench_accounts 100000 pgbench_history 0
-s
(倍数)オプションを使用して行数を増加させることができます(また、ほとんどの目的ではおそらく増加させるべきです)。
また、-F
(フィルファクタ)オプションをここで使用しても構いません。
一度この必要な設定を行った後、以下のように-i
を持たないコマンドでベンチマークを行うことができます。
pgbench [options
]dbname
ほとんどすべての場合、有用な試験とするためにいくつかのオプションが必要になります。
最重要オプションは-c
(クライアント数)、-t
(トランザクション数)、-T
(制限時間)、-f
(独自スクリプトファイルの指定)です。
以下の全一覧を参照してください。
以下では、データベース初期化時に使用されるオプション、ベンチマーク実行時に使用されるオプション、どちらの場合でも使われるオプションの3つに分けて説明します。
pgbenchは以下の初期化用のコマンドライン引数を受け付けます。
-i
--initialize
初期化モードを呼び出すために必要です。
-F
fillfactor
--fillfactor=
fillfactor
指定したフィルファクタでpgbench_accounts
、pgbench_tellers
、pgbench_branches
テーブルを作成します。
デフォルトは100です。
-n
--no-vacuum
初期化の後にバキューム処理を行いません。
-q
--quiet
ログ処理を、5秒に1つの進行メッセージのみを生成する静寂モードに切り替えます。 デフォルトのログ処理では、10000行毎にメッセージを1つ出力し、(特に優れたハードウェアでは)1秒当たりに多くのメッセージを出力します。
-s
scale_factor
--scale=
scale_factor
この倍率で生成される行数を積算します。
例えば、-s 100
は pgbench_accounts
テーブルに10,000,000行を生成することを意味します。
デフォルトは1です。
この倍率が20000以上になると、アカウント識別子の範囲を保持できる程度に大きくなるように、アカウント識別子を保持するために使用される列(aid
列)はより大きな整数(bigint
)を使用するように切り替わります。
--foreign-keys
標準テーブル間で外部キー制約を作成します。
--index-tablespace=index_tablespace
デフォルトのテーブル空間ではなく、指定したテーブル空間の中にインデックスを作成します。
--tablespace=tablespace
デフォルトのテーブル空間ではなく、指定したテーブル空間の中にテーブルを作成します。
--unlogged-tables
永続テーブルではなくログを取らないテーブルとしてテーブルを作成します。
pgbenchは以下のベンチマーク用コマンドライン引数を受け付けます。
-c
clients
--client=
clients
模擬するクライアント数、つまり、同時に実行されるデータベースセッション数です。 デフォルトは1です。
-C
--connect
各クライアントセッションが一度だけ接続を確立するのではなく、各トランザクションが新しい接続を確立します。 これは接続オーバーヘッドを測定する場合に有用です。
-d
--debug
デバッグ用出力を表示します。
-D
varname
=
value
--define=
varname
=
value
独自スクリプト(後述)で使用される変数を定義します。
複数の-D
オプションを使用することができます。
-f
filename
--file=
filename
トランザクションスクリプトをfilename
から読み取ります。
詳細は後で説明します。
-N
、-S
、-f
は互いに排他的です。
-j
threads
--jobs=
threads
pgbench内のワーカスレッド数です。 複数のスレッドを使用することはマルチCPUマシンで有用になります。 各スレッドには管理するクライアントセッションを同じ数与えられますので、クライアント数はスレッド数の倍数でなければなりません。 デフォルトは1です。
-l
--log
各トランザクションで費やした時間をログファイルに書き出します。 後で詳細を説明します。
-L
limit
--latency-limit=
limit
limit
ミリ秒以上続くトランザクションが計数され、別途遅いトランザクションとして報告されます。
制限が使用されると(--rate=...
)、limit
ミリ秒以上遅延がスケジュールされたトランザクションは遅延制限を満たす可能性がないため、サーバに送信されることは決してありません。
これらのトラザクションは計数され、別途スキップされたとして報告されます。
-M
querymode
--protocol=
querymode
サーバへ問い合わせを送信するために使用するプロトコルです。
simple
: 簡易問い合わせプロトコルを使用します。
extended
: 拡張問い合わせプロトコルを使用します。
prepared
: プリペアドステートメントを伴う拡張問い合わせプロトコルを使用します。
デフォルトは簡易問い合わせプロトコルです。 (詳しい情報は50章フロントエンド/バックエンドプロトコルを参照してください)
-n
--no-vacuum
試験を実行する前にバキュームを行いません。
pgbench_accounts
、pgbench_branches
、pgbench_history
、
pgbench_tellers
標準テーブルを含まない独自試験シナリオを実行する場合、このオプションは必要です。
-N
--skip-some-updates
pgbench_tellers
とpgbench_branches
を更新しません。
これは両テーブル上の重度の更新の競合を防ぎますが、TPC-Bのような試験ケースを行わなくなります。
-P
sec
--progress=
sec
sec
秒毎の進捗レポートを表示します。レポートには起動からの経過時間、前回レポート時からのtps、前回レポート時からのトランザクションの平均待ち時間、標準偏差を含んでいます。
(-R
)オプションによる制限下では、待ち時間はトランザクションの実開始時間ではなく、予定開始時間で算出されていますので、平均予定遅延時間が含まれています。
-r
--report-latencies
ベンチマーク完了後の各コマンドにおけるステートメント毎の平均レイテンシ(クライアントから見た実行時間)を報告します。詳しくは下を参照してください。
-R
rate
--rate=
rate
トランザクションを可能な限り高速(デフォルト)で実行するのではなく、指定された目標レートで実行します。 レートは1秒あたりのトランザクション数で与えられます。目標レートが実施可能な最大レートを越えている場合、レート制限は結果に影響を与えません。
レートはトランザクションの開始予定タイムラインがポアソン分布に沿う事を目標としています。 期待される開始時刻の予定は、前トランザクションの終了時ではなくクライアントの初期起動時に基づいて動かします。 このアプローチはトランザクションがオリジナルの終了予定時刻を過ぎた場合でも、後でまた追い付けることを意味します。
制限がアクティブになると、実行終了時に報告されるトランザクション待ち時間は、予定開始時刻から計算されるので、 各トランザクションが前トランザクションの終了を待たねばならなかった時間を含んでいます。 この待ち時間はスケジュールラグタイムと呼ばれ、平均と最大値も別々に報告されます。 実トランザクション開始時刻についてのトランザクション待ち時間、つまりデータベース内でトランザクションの実行に要した時間は、報告された待ち時間からスケジュールラグタイムを減算することで算出することができます。
--latency-limit
が--rate
と一緒に指定された場合、トランザクションは、先行するトランザクションが終了した際にすでに遅延制限を超えていて、非常に遅れてしまうことがあり得ます。
そのようなトランザクションはサーバに送信さることなくスキップされ、別途カウントされます。
スケジュールラグタイムの高い値は、システムが選択されたクライアント数とスレッド数で、指定されたレートでトランザクションを処理できなかったことを示しています。 トランザクションの平均実行時間が各トランザクション間で予定されていた間隔より長い場合、各逐次トランザクションは更に遅くなり、 スケジュールラグタイムはテスト実行がより長く増加し続けます。 これが起こる場合、指定トランザクションレートを減らす必要があります。
-s
scale_factor
--scale=
scale_factor
pgbenchの出力で指定した倍率を報告します。
これは組み込みの試験では必要ありません。
正確な倍率がpgbench_branches
テーブルの行数を数えることで検出されます。
しかし、独自ベンチマーク(-f
オプション)を試験している場合、このオプションを使用しない限り、倍率は1として報告されます。
-S
--select-only
TPC-Bのような試験ではなく読み取りのみのトランザクションを実行します。
-t
transactions
--transactions=
transactions
各クライアントが実行するトランザクション数です。 デフォルトは10です。
-T
seconds
--time=
seconds
クライアントあたりのトランザクション数を固定で指定するよりも長くテストを実行したい場合、ここに指定した秒数でテストを実行します。
-t
と-T
は互いに排他的です。
-v
--vacuum-all
試験前に4つの標準テーブルすべてをバキュームを行います。
-n
も-v
もなければ、pgbenchはpgbench_tellers
とpgbench_branches
テーブルをバキュームし、pgbench_history
内のデータをすべて消去します。
--aggregate-interval=seconds
集約間隔の長さ(秒単位)です。 これは-lと一緒でのみ使用される可能性があります。 このオプションを付けると、ログには指定間隔単位の要約(トランザクション数、最大レイテンシ、最小レイテンシ、分散の推定に役に立つ2つの追加フィールド)が含まれます。
現在このオプションはWindowsではサポートされていません。
--sampling-rate=rate
データをログに書き出す際に使用される、生成されるログの量を減少するためのサンプリング割合です。 このオプションが指定された場合、指定された割合のトランザクションがログに残ります。 1.0はすべてのトランザクションが、0.05はトランザクションの5%のみがログに残ることを意味します。
ログファイルを処理する際にはこのサンプリング割合を考慮することを忘れないでください。 例えば、tps値を計算する際には、比例した数を掛け合わせなければなりません(例:サンプリング割合が0.01の場合実際のtpsの1/100を得るだけです。)
pgbenchは以下の共通コマンドライン引数を受け付けます。
-h
hostname
--host=
hostname
データベースサーバのホスト名
-p
port
--port=
port
データベースサーバのポート番号
-U
login
--username=
login
接続ユーザ名
-V
--version
pgbenchのバージョンを表示し、終了します。
-?
--help
pgbenchのコマンドライン引数の説明を表示し、終了します。
デフォルトのトランザクションスクリプトは、1トランザクションで以下の7コマンドを発行します。
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;
-N
を指定した場合、第4コマンドと第5コマンドはトランザクションに含まれません。
-S
を指定した場合、SELECT
のみが発行されます。
pgbenchは、ファイルから読み込んだトランザクションスクリプト(-f
オプション)でデフォルトのトランザクションスクリプト(上述)を置き換えて独自のベンチマークシナリオを実行する機能をサポートします。
この場合、「トランザクション」はスクリプトファイルの1回の実行として数えられます。
複数のスクリプトを指定する(複数の-f
オプション)ことさえ可能です。
この場合、クライアントセッションが新しいトランザクションを開始する時にランダムにスクリプトの1つが選択されます。
スクリプトファイルの書式は、1行1 SQLコマンドという形で、複数行に跨るSQLコマンドはサポートされません。
空行および--
から始まる行は無視されます。
スクリプトファイルの行には、pgbench自身が解釈する「メタコマンド」(後述)も記述することができます。
スクリプトファイル向けの簡単な変数置換機能があります。
上で説明したように変数を-D
コマンドラインオプションで設定することができます。
また、後で説明するようにメタコマンドで設定することもできます。
-D
コマンドラインオプションで設定された変数の他に、表222「自動変数」に記載されているように、自動的に設定される変数がいくつかあります。
-D
を使ってこれらの変数に設定された値は、自動設定の値より優先されます。
一度設定すると、変数の値は、:
variablename
と書かれてSQLコマンドに挿入されます。
1つ以上のクライアントセッションが実行される場合、セッション毎に独自の変数群を持ちます。
表222 自動変数
変数 | 説明 |
---|---|
scale | 現在のスケールファクタ |
client_id | クライアントセッションを識別する一意の数値(ゼロから始まる) |
スクリプトファイルメタコマンドはバックスラッシュ(\
)から始まります。
メタコマンドへの引数は空白文字で区切られます。
以下のメタコマンドがサポートされています。
\set varname
expression
varname
変数をexpression
から計算された整数値に設定します。
expression(式)は、 5432
のような定数、変数への参照 :
variablename
、通常の結合法則と括弧を伴う単項演算子(-
)または2項演算子(+
、-
、*
、/
、%
)から構成された式を含むことができます。
例
\set ntellers 10 * :scale \set aid (1021 * :aid) % (100000 * :scale) + 1
\setrandom varname
min
max
[ uniform | { gaussian | exponential } parameter
]
varname
変数をmin
からmax
までの範囲のランダムな整数値に設定します。
各範囲値は整数定数か整数値を持つ変数への:
variablename
参照のいずれかです。
デフォルトあるいはuniform
が指定された場合、範囲中のすべての値を採用する確率は等しくなります。
gaussian
あるいはexponential
オプションはこの挙動を変更します。
分布の形を正確に決定する各々のパラメータが必須となります。
ガウス分布では、区間は、左側が-parameter
、右側が+parameter
で切り取られる標準正規分布(古典的なつりがね型状のガウス曲線)にマップされます。
区間の中央値はより採用される可能性が高くなります。
正確に言うと、もしPHI(x)
が標準正規分布における累積分布関数なら、(max + min) / 2.0
で定義される平均値をmu
、
f(x) = PHI(2.0 * parameter * (x - mu) / (max - min + 1)) /
(2.0 * PHI(parameter) - 1.0)
として、min
からmax
(maxを含む)までの間にあるi
は確率f(i + 0.5) - f(i - 0.5)
で採用されるということです。
直感的には、parameter
が大きいほど、区間の中央値に近い値が採用され、min
あるいはmax
の上限に近い値ほど採用されにくいということです。
約67%の値は中央値1.0 / parameter
から採用されます。すなわち、相対的に平均値の0.5 / parameter
付近です。
95%の値は中央値2.0 / parameter
から採用されます。すなわち、相対的に平均値の1.0 / parameter
付近です。
たとえば、parameter
が4.0なら、67%の値は区間の中央値の1/4(1.0 / 4.0)です(すなわち、3.0 / 8.0
から5.0 / 8.0
)で、95%は
区間の中央の半分(2.0 / 4.0
)(第2と第3 四分位数)です。
parameter
の最小値は2.0で、その場合はボックス=ミュラー変換を実施することになります。
指数分布では、parameter
は、その地点で急速に減少する指数分布を切り取ることにより、分布を制御します。
そして境界値の間の整数に射影します。
正確には、
f(x) = exp(-parameter * (x - min) / (max - min + 1)) / (1.0 - exp(-parameter))
として、
min
とmax
の間(maxを含みます)で、値i
は確率: f(x) - f(x + 1)
で採用されます。
直感的には、parameter
が大きいほどmin
に近い値がアクセスされます。
parameter
が0に近づくほど、アクセスの分布はより平坦(より均一)になります。
分布の大雑把な近似は、範囲中のmin
に近い最頻1%の値は、時間のparameter
%で採用されます。
parameter
は正の値でなければなりません。
Example: 例
\setrandom aid 1 :naccounts gaussian 5.0
\sleep number
[ us | ms | s ]
スクリプトの実行をマイクロ秒(us
)、ミリ秒(ms
)、秒(s
)単位で指定した間待機させます。
単位を省略した場合、デフォルトは秒です。
number
は整数定数か整数値を持つ変数への:
variablename
参照のいずれかです。
例
\sleep 10 ms
\setshell varname
command
[ argument
... ]
command
シェルコマンドの結果をvarname
変数に設定します。
このコマンドは標準出力を通して整数値を返さなければなりません。
argument
は、テキスト定数または任意の型の変数を参照する:
variablename
とすることができます。
コロンから始まるargument
を使用したい場合、argument
の先頭にさらにコロンを付けなければなりません。
例:
\setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon
\shell command
[ argument
... ]
\setshell
と同じですが、結果は無視されます。
例:
\shell command literal_argument :variable ::literal_starting_with_colon
例えば、組込みのTPC-Bのようなトランザクションの完全な定義を示します。
\set nbranches :scale \set ntellers 10 * :scale \set naccounts 100000 * :scale \setrandom aid 1 :naccounts \setrandom bid 1 :nbranches \setrandom tid 1 :ntellers \setrandom delta -5000 5000 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;
このスクリプトにより、トランザクションを繰り返す度に異なる、ランダムに選ばれた行を参照することができます。 (この例はまた、各クライアントセッションがなぜ独自の変数を持つことが重要なのかも表しています。 これがないと、異なる行を独立して参照することができないのです。)
--aggregate-interval
を付けずに-l
オプションを使用すると、
pgbenchは各トランザクションで要した時間をログファイルに書き出します。
ログファイルの名前はpgbench_log.
です。
ここでnnn
nnn
はpgbenchプロセスのPIDです。
-j
オプションが2以上の場合、それぞれ独自のログファイルを持つ複数のワーカスレッドが生成されます。
最初のワーカは標準的な単一ワーカの場合と同じ名前を持つログファイルを使用します。
他のワーカ用の追加のログファイルはpgbench_log.
のように命名されます。
ここでnnn
.mmm
mmm
は1から始まる各ワーカの連番です。
ログの書式は以下の通りです。
client_id
transaction_no
time
file_no
time_epoch
time_us
[schedule_lag
]
ここでtime
はマイクロ秒単位の総トランザクション処理時間、
file_no
は使用されたスクリプトファイルを識別するもの(-f
により複数のスクリプトが指定された場合に有用)、
time_epoch
/time_us
はマイクロ秒のオフセットを持つUNIXエポック書式のタイムスタンプ(小数秒付きのISO 8601タイムスタンプの作成に適します)
でトランザクションの完了時刻を示します。
フィールドschedule_lag
は、マイクロ秒単位のトランザクションの予定開始時刻と実開始時刻の差です。
これは--rate
オプションを使用した時だけ表示されます。
--rate
と--latency-limit
の両方のオプションを使用した時は、スキップされたトランザクションのtime
がskipped
として表示されます。
生成されたログファイルの一部を示します。
0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 2663
--rate=100 と --latency-limit=5 を指定した例を示します。(schedule_lag
列が追加されていることに注意)
0 81 4621 0 1412881037 912698 3005 0 82 6173 0 1412881037 914578 4304 0 83 skipped 0 1412881037 914578 5217 0 83 skipped 0 1412881037 914578 5099 0 83 4722 0 1412881037 916203 3108 0 84 4142 0 1412881037 918023 2333 0 85 2465 0 1412881037 919759 740
この例では、トランザクション82は遅延(6.173ミリ秒)が5ミリ秒を越えており、遅れています。 次の2つのトランザクションは、開始する前にすでに遅れてしまっているため、スキップされています。
大量のトランザクションを処理することができるハードウェアで長時間試験を実行する場合、ログファイルは非常に大きくなる可能性があります。
--sampling-rate
オプションを使用して、トランザクションのランダムなサンプルだけをログに記録することができます。
--aggregate-interval
オプションを付ける場合、以下のようにログの書式が多少異なります。
interval_start
num_of_transactions
latency_sum
latency_2_sum
min_latency
max_latency
[lag_sum
lag_2_sum
min_lag
max_lag
[skipped_transactions
]]
ここで、interval_start
はインターバルの開始時刻(Unixエポック書式のタイムスタンプ)、
num_of_transactions
はインターバル内のトランザクション数、
latency_sum
はレイテンシの総和です(これらを使って簡単に平均レイテンシを計算できます)。
以下2つのフィールドは分散推定の際に有用です。
latency_sum
はレイテンシの総和であり、latency_2_sum
はレイテンシの二乗の総和です。
次の2つのフィールドは、インターバル内の最小レイテンシであるmin_latency
と、インターバル内の最大レイテンシであるmax_latency
です。
インターバル内でコミットされた時点でトランザクションとしてカウントされます。
最後の方のフィールドlag_sum
、lag_2_sum
、min_lag
とmax_lag
は--rate
オプションが使われた時だけ表示されます。
最後のskipped_transactions
もやはり--latency-limit
が指定された時だけ表示されます。
これらは、各トランザクションが前のトランザクション終了を待つ時間、つまり各トランザクションの予定開始時刻と実開始時刻の差から算出されます。
以下に出力例を示します。
1345828501 5601 1542744 483552416 61 2573 1345828503 7884 1979812 565806736 60 1479 1345828505 7208 1979422 567277552 59 1391 1345828507 7685 1980268 569784714 60 1398 1345828509 7073 1979779 573489941 236 1411
通常の(集約されていない)ログファイルには、カスタムスクリプトファイルへの参照が含まれますが、集約されたログには含まれません。 このためスクリプト単位のデータが必要な場合は、自身でデータを集約しなければなりません。
-r
オプションを付けると、pgbenchは各クライアントにより実行されたトランザクションのステートメント毎の経過時間を収集します。
ベンチマークが終了した後、各値の平均値(各ステートメントのレイテンシと呼びます)が報告されます。
標準スクリプトでは、次のような出力になります。
starting vacuum...end. transaction type: TPC-B (sort of) scaling factor: 1 query mode: simple number of clients: 10 number of threads: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 618.764555 (including connections establishing) tps = 622.977698 (excluding connections establishing) statement latencies in milliseconds: 0.004386 \set nbranches 1 * :scale 0.001343 \set ntellers 10 * :scale 0.001212 \set naccounts 100000 * :scale 0.001310 \setrandom aid 1 :naccounts 0.001073 \setrandom bid 1 :nbranches 0.001005 \setrandom tid 1 :ntellers 0.001078 \setrandom delta -5000 5000 0.326152 BEGIN; 0.603376 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.454643 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 5.528491 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 7.335435 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.371851 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 1.212976 END;
複数のスクリプトファイルが定義された場合、平均値はそれぞれのスクリプトファイル毎に分けて報告されます。
ステートメント毎のレイテンシを計算するために必要となる、追加のタイミング情報を収集することは、オーバーヘッドが加わることに注意してください。 これは平均実行速度を遅くし、計測TPSを小さくするでしょう。 低下量はプラットフォームとハードウェアに依存して著しく変わります。 レイテンシの報告を有効にする、有効にしないで平均TPS値を比較することは、タイミング・オーバーヘッドが顕著かどうかを測定するには良い方法です。
まったく無意味な数値を生み出すようにpgbenchを使用することは非常に簡単です。 以下に有意な結果を生み出す手助けとなるガイドラインをいくつか示します。
まず第一に、数秒で終わる試験を決して信用しないでください。
-t
または-T
オプションを使って、雑音を取り除くために、少なくとも数分試験にかかるようにしてください。
再現可能な数値を得るために数時間必要になる場合もあります。
数回試験を繰り返し、数値が再現できるかどうか確認することを勧めます。
デフォルトのTPC-Bのような試験シナリオでは、初期倍率(-s
)を試験予定のクライアント数(-c
)の最大値と同程度にしなければなりません。
pgbench_branches
テーブルには-s
行しかありません。
また、前トランザクションはその内の1つを更新しようとします。
ですので、-c
値を-s
より大きくすると、他のトランザクションを待機するためにブロックされるトランザクションが多くなることは間違いありません。
デフォルトの試験シナリオはまた、テーブルを初期化してからの経過時間に非常に敏感です。 テーブル内の不要行や不要空間の累積により結果が変わります。 結果を理解するためには、更新された行数とバキューム時期を把握する必要があります。 自動バキュームが有効な場合、性能を測定する上で結果は予測できないほど変わる可能性があります。
pgbenchの制限は、多くのクライアントセッションを試験しようとする際にpgbench自身がボトルネックになる可能性があることです。 これは、データベースサーバとは別のマシンでpgbenchを実行することで緩和させることが可能です。 しかし、多少のネットワーク遅延が重要です。 同一データベースサーバに対し複数のクライアントマシンから複数のpgbenchインスタンスを同時に実行することが有用かもしれません。