PostgresSQL基準測試工具之Pgbench
概要
pgbench是一種在PostgreSQL上執行基準測試的簡單程式。
它可能在併發的資料庫會話中一遍一遍地執行相同序列的 SQL 命令,並且計算平均事務率(每秒的事務數)。
預設情況下,pgbench會測試一種基於 TPC-B 但是要更寬鬆的場景,其中在每個事務中涉及五個SELECT、UPDATE以及INSERT命令。
通過編寫自己的事務指令碼檔案很容易用來測試其他情況。
初始化
初始化語法
pgbench -i [ other-options ] dbname
其中dbname是要在其中進行測試的預先建立好的資料庫的名稱
可能還需要-h、-p或-U選項來指定如何連線到資料庫伺服器
pgbench -i會建立四個表
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(指定一個自定義指令碼檔案)。
選項可以分成三個部分:
資料庫初始化期間使用的選項
執行基準時使用的選項
兩種情況下都有用的選項
重要選項
-c(客戶端數量)
-t(事務數量)
-T(時間限制)
-f(指定一個自定義指令碼檔案)
更多選項 pgbench --help 或參閱 相關手冊
在pgbench中執行的"事務"
pgbench執行從指定列表中隨機選中的測試指令碼
它們包括帶有-b的內建指令碼和帶有-f的使用者提供的自定義指令碼
每一個指令碼可以在其後用@指定一個相對權重,這樣可以更改該指令碼的抽取概率。
預設權重是1。權重為0的指令碼會被忽略
預設的內建事務指令碼(也會被-b tpcb-like呼叫)會在每個事務上發出七個從aid、tid、bid和balance中隨機選擇的命令
該場景來自於 TPC-B 基準,但並不是真正的 TPC-B,只是名字像而已
預設的內建事務指令碼
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),第 4 和 5 步不會被包括在事務中。這將避免更新那些表中的內容,但是它會讓該測試用例更不像 TPC-B。
如果選擇select-only內建指令碼(還有-S),只會發出SELECT。
pgbench的典型輸出像這樣:
transaction type: <builtin: 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)
前六行報告一些最重要的引數設定。
接下來的行報告完成的事務數以及預期的事務數(後者就是客戶端數量與每個客戶端事務數的乘積),除非執行在完成之前失敗,這些值應該是相等的(在-T模式中,只有實際的事務數會被打印出來)。
最後兩行報告每秒的事務數,分別代表包括和不包括開始資料庫會話所花時間的情況。
預設的類 TPC-B 事務測試要求預先設定好特定的表。
可以使用-i(初始化)選項呼叫pgbench來建立並且填充這些表(當你在測試一個自定義指令碼時,你不需要這一步,但是需要按你自己的測試需要做一些設定工作)。
使用建議
排在第一位的是,永遠不要相信任何只運行了幾秒的測試。使用-t或-T選項讓執行持續至少幾分鐘,這樣可以用平均值去掉噪聲。在一些情況中,你可能需要數小時來得到能重現的數字。多執行幾次測試是一個好主意,這樣可以看看你的數字是不是可以重現。
對於預設的類 TPC-B 測試場景,初始化的比例因子(-s)應該至少和你想要測試的最大客戶端數量一樣大(-c),否則你將主要在度量更新爭奪。在pgbench_branches表中只有-s行,並且每個事務都想更新其中之一,因此-c值超過-s將毫無疑問地導致大量事務被阻塞來等待其他事務。
預設的測試場景也對錶被初始化了多久非常敏感:表中死亡行和死亡空間的累積會改變結果。要理解結果,你必須跟蹤更新的總數以及何時發生清理。如果開啟了自動清理,它可能會在度量的效能上產生不可預估的改變。
pgbench的一個限制是在嘗試測試大量客戶端會話時,它自身可能成為瓶頸。這可以通過在資料庫伺服器之外的一臺機器上執行pgbench來緩解,不過必須是具有低網路延遲的機器。甚至可以在多個客戶端機器上針對同一個資料庫伺服器併發地執行多個pgbench例項。
示例語句
create database pgbenchdb
pgbench -i -s 5 pgbenchdb --初始化
pgbench -r -j2 -c4 -T60 pgbenchdb --基準測試,並行工作執行緒數2,客戶端數量4,每客戶端事務數60
-i 要求呼叫初始化模式。
-s 將生成的行數乘以比例因子。預設為 1。也就是執行多少次generate_series(1,100000)。例如,-s 20將在pgbench_accounts表中建立 500,000 行。
-r 在基準結束後,報告平均的每個命令的每語句等待時間(從客戶端的角度來說是執行時間)。
-j pgbench中的工作者執行緒數量。在多 CPU 機器上使用多於一個執行緒會有用。客戶端會盡可能均勻地分佈到可用的執行緒上。預設為 1。
-c 模擬的客戶端數量,也就是併發資料庫會話數量。預設為 1。
-t 每個客戶端執行的事務數量。預設為 10。
-T 執行測試這麼多秒,而不是為每個客戶端執行固定數量的事務。-t和-T是互斥的。
by boluo