1.pgbench概要
pgbench是一種在PostgreSQL上運行基准測試的簡單程序, 它是pg自帶的工具;
它可能在並發的數據庫會話中一遍一遍地運行相同序列的 SQL 命令,並且計算平均事務率(每秒的事務數);
默認情況下,pgbench會測試一種基於 TPC-B 但是要更寬松的場景,其中在每個事務中涉及五個SELECT、UPDATE以及INSERT命令。
通過編寫自己的事務腳本文件很容易用來測試其他情況;
測試的目的是了解硬件的處理能力;通過調整參數優化數據庫事務處理性能
2.pgbench的初始化
pgbench -i [ other-options ] dbname
主要選項
-i:初始化模式
-s 插入的倍數,默認是1,即插入100000條;也就是執行多少次generate_series(1,100000)。
創建四個表,如果同名表已經存在會被先刪除
pgbench_accounts #賬戶表
pgbench_branches #支行表
pgbench_history #歷史信息表
pgbench_tellers #出納表
在默認的情況下-s"比例因子"為 1,這些表初始包含的行數為:
table # of rows
pgbench_branches 1
pgbench_tellers 10
pgbench_accounts 100000
pgbench_history 0
3.pgbench基准測試
pgbench [ options ] dbname
重要選項:
-c(客戶端數量)
-t(事務數量)
-T(時間限制)
-j(工作者線程數量)
-f(指定一個自定義腳本文件)
pgbench執行從指定列表中隨機選中的測試腳本
它們包括帶有-b的內建腳本和帶有-f的用戶提供的自定義腳本
每一個腳本可以在其后用@指定一個相對權重,這樣可以更改該腳本的抽取概率。
* -b scriptname[@weight]
* --builtin=scriptname[@weight]
* 把指定的內建腳本加入到要執行的腳本列表中。
* @之后是一個可選的整數權重,它允許調節抽取該腳本的可能性。
* 如果沒有指定,它會被設置為 1。
* 可用的內建腳本有:tpcb-like、simple-update和select-only。
4.pgbench中的"事務"
默認的內建事務腳本
BEGIN;
--1
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
--2
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
--3
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
--4
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
--5
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
如果選擇simple-update內建腳本(選項 -N),第 3 和 4 步不會被包括在事務中。
如果選擇select-only內建腳本(選項 -S),只會發出SELECT。
5.pgbench典型輸出格式
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10 # 有四張表,這里是10,相當於每個表的數據*10(大概10倍,並不是准確的) -s
query mode: simple # 共三種查詢方式:-M, --protocol=simple|extended|prepared
number of clients: 10 # 並行客戶端連接數 -c
number of threads: 1 # 工作線程數,多個客戶端公用這些工作線程 -j
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)
前六行報告一些最重要的參數設置。
接下來的行報告完成的事務數以及預期的事務數(后者就是客戶端數量與每個客戶端事務數的乘積),除非運行在完成之前失敗,這些值應該是相等的(在-T模式中,只有實際的事務數會被打印出來)。
最后兩行報告每秒的事務數,分別代表包括和不包括開始數據庫會話所花時間的情況。
默認的類 TPC-B 事務測試要求預先設置好特定的表。
可以使用-i(初始化)選項調用pgbench來創建並且填充這些表(當你在測試一個自定義腳本時,你不需要這一步,但是需要按你自己的測試需要做一些設置工作)。
6.pgbench使用建議
* 多運行幾次測試是一個好主意,這樣可以看看你的數字是不是可以重現;
* 注意自動清理進程autovacuum對測試的影響
* 初始化的比例因子(-s)應該至少和你想要測試的最大客戶端數量一樣大(-c),否則你將主要在度量更新爭奪;
* 因為在pgbench_branches表中只有-s行,並且每個事務都想更新其中之一,因此-c值超過-s將毫無疑問地導致大量事務被阻塞來等待其他事務。
* pgbench的一個限制是在嘗試測試大量客戶端會話時,它自身可能成為瓶頸。
* 可以通過在數據庫服務器之外的一台機器上運行pgbench來緩解,不過必須是具有低網絡延遲的機器。
* 甚至可以在多個客戶端機器上針對同一個數據庫服務器並發地運行多個pgbench實例。
7.pgbench示例
7.1 簡單示例
create database pgbenchdb
pgbench -i -s 5 pgbenchdb --初始化,將在pgbench_accounts表中創建 500,000行。
pgbench -r -j2 -c4 -t60 pgbenchdb --基准測試1,並行工作線程數2,客戶端數量4,每客戶端事務數60
pgbench -r -j2 -c10 -T10 pgbenchdb --基准測試2,並行工作線程數2,客戶端數量10,運行時間1分鍾
-r 在基准結束后,報告平均的每個命令的每語句等待時間(從客戶端的角度來說是執行時間)。
-j pgbench中的工作者線程數量。在多 CPU 機器上使用多於一個線程會有用。客戶端會盡可能均勻地分布到可用的線程上。默認為 1。
-c 模擬的客戶端數量,也就是並發數據庫會話數量。默認為 1。
-t 每個客戶端運行的事務數量。默認為 10。
-T 運行測試這么多秒,而不是為每個客戶端運行固定數量的事務。
注意: -t和-T是互斥的。
7.2 自定義示例
# 自定義腳本示例
pgbench -M simple -r-c 8 -f /tmp/login.sql -j 8 -n -T 180 -d pgbench
# 指定權重:
把指定的內建腳本加入到要執行的腳本列表中。@之后是一個可選的整數權重,它允許調節抽取該腳本的可能性。如果沒有指定,它會被設置為1。
如把 simple-update權重設為3, select-only權重設為6, tpcb-like權重設為1
pgbench -M simple -r-c 8 -b simple-update@3 -b select-only@6 -btpcb-like@1 -j 8 -n -T 180 -d postgres
# 基准測試s2db,並行工作線程數2,客戶端數量10,運行時間120秒
postgres@s2ahumysqlpg01-> pgbench -h 127.0.0.1 -p 5432 -r -j2 -c10 -T120 s2db
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 2
duration: 120 s
number of transactions actually processed: 2270
latency average = 530.642 ms
tps = 18.845108 (including connections establishing)
tps = 18.845765 (excluding connections establishing)
statement latencies in milliseconds:
0.005 \set aid random(1, 100000 * :scale)
0.002 \set bid random(1, 1 * :scale)
0.002 \set tid random(1, 10 * :scale)
0.002 \set delta random(-5000, 5000)
0.377 BEGIN;
0.610 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.429 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
204.643 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
270.651 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.493 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
52.404 END;