簡介
??pgbench是一種在PostgreSQL上運行基準測試的簡單程序, 它是pg自帶的工具;pgbench是一種在PostgreSQL上運行基準測試的簡單程序。它可能在并發(fā)的數(shù)據(jù)庫會話中一遍一遍地運行相同序列的 SQL 命令,并且計算平均事務(wù)率(每秒的事務(wù)數(shù))。默認情況下,pgbench會測試一種基于 TPC-B 但是要更寬松的場景,其中在每個事務(wù)中涉及五個SELECT、UPDATE以及INSERT命令。但是,通過編寫自己的事務(wù)腳本文件很容易用來測試其他情況。測試的目的是了解硬件的處理能力;通過調(diào)整參數(shù)優(yōu)化數(shù)據(jù)庫事務(wù)處理性能。
pgbench 的測試結(jié)果報告
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 500
query mode: prepared
number of clients: 512
number of threads: 10
duration: 600 s
number of transactions actually processed: 562451
latency average = 546.467 ms
initial connection time = 176.577 ms
tps = 936.927622 (without initial connection time)
transaction type 表明本次測試所使用的測試類型
scaling factor 表明pgbench在初始化時設(shè)置的數(shù)據(jù)量的比例因子
query mode 表明指定的查詢模式,包括 simple查詢模式(默認)、extended查詢模式和prepared 查詢模式
number of clients表明指定的客戶端連接數(shù)
number of threads表明測試時每個客戶端的線程數(shù)
number of transactions actually processed 測試結(jié)束時實際處理的事務(wù)數(shù)
latency average 測試過程的平均響應(yīng)時間
tps 單位時間內(nèi)執(zhí)行的事務(wù)數(shù)
pgbench工具的使用
1 通過內(nèi)置腳本進行測試
1.1 初始化測試數(shù)據(jù)
pgbench -i [ other-options ] dbname
pgbench -i會創(chuàng)建四個表pgbench_accounts、 pgbench_branches、pgbench_history以及pgbench_tellers,如果同名表已經(jīng)存在會被先刪除。如果你已經(jīng)有同名表,一定注意要使用另一個數(shù)據(jù)庫!
pgbench -i testdb
table_name | counts |
---|---|
pgbench_accounts | 100000 |
pg_branches | 1 |
pgbench_history | 0 |
pg_tellers | 10 |
如果指定 -s 參數(shù)可以放大數(shù)據(jù)量: pgbench -i -s 500 testdb
table_name | counts |
---|---|
pgbench_accounts | 50000000 |
pg_branches | 50 |
pgbench_history | 0 |
pg_tellers | 500 |
pgbench -i -s 500 -F 90 -h 10.229.89.210 -p 9393 -U postgres -d postgres ==>典型案例
初始化選項
pgbench接受下列命令行初始化參數(shù):
-i
–initialize
要求調(diào)用初始化模式。
-I init_steps
–init-steps=init_steps
只執(zhí)行選出的一組普通初始化步驟。init_steps指定要被執(zhí)行的初始化步驟,每一個步驟使用一個字符代表。每一個步驟都以指定的順序被調(diào)用。默認是dtgvp??捎玫牟襟E是:
?? d(刪除)
??刪除任何已有的pgbench表。
??t(創(chuàng)建表)
??創(chuàng)建標準pgbench場景使用的表,即pgbench_accounts、pgbench_branches、pgbench_history以及pgbench_tellers。
??g或G(生成數(shù)據(jù)、客戶端或服務(wù)器端)
??生成數(shù)據(jù)并且裝入到標準的表中,替換掉已經(jīng)存在的任何數(shù)據(jù)。
??使用 g(客戶端數(shù)據(jù)生成),數(shù)據(jù)在 pgbench 客戶端生成,然后發(fā)送到服務(wù)器。 這通過 COPY 廣泛使用客戶端/服務(wù)器帶寬。 使用 g 會導致日志記錄每 100,000 行打印一條消息,同時為 pgbench_accounts 表生成數(shù)據(jù)。
??使用G(服務(wù)器端數(shù)據(jù)生成),僅從pgbench客戶端發(fā)送少量查詢,然后在服務(wù)器中實際生成數(shù)據(jù)。 此變體不需要大量帶寬, 但服務(wù)器將完成更多工作。 使用G會導致日志記錄在生成數(shù)據(jù)時不打印任何進度消息。
??默認的初始化行為使用客戶端數(shù)據(jù)生成(相當于g)。
v(清理)
在標準的表上調(diào)用VACUUM。
p(創(chuàng)建主鍵)
在標準的表上創(chuàng)建主鍵索引。
f(創(chuàng)建外鍵)
在標準的表之間創(chuàng)建外鍵約束(注意這一步默認不會被執(zhí)行)。
-F fillfactor
–fillfactor=fillfactor
用給定的填充因子創(chuàng)建表pgbench_accounts、pgbench_tellers以及pgbench_branches。默認是100。
-n
–no-vacuum
在初始化期間不執(zhí)行清理(這個選項會抑制v初始化步驟,即便在-I中指定了該步驟)。
-q
–quiet
把記錄切換到安靜模式,只是每 5 秒產(chǎn)生一個進度消息。默認的記錄會每 100,000 行打印一個消息,這經(jīng)常會在每秒鐘輸出很多行(特別是在好的硬件上)。
如果在 -I 中指定了 G,則此設(shè)置無效。
-s scale_factor
–scale=scale_factor
將生成的行數(shù)乘以比例因子。例如,-s 100將在pgbench_accounts表中創(chuàng)建 10,000,000 行。默認為 1。當比例為 20,000 或更高時,用來保存賬號標識符的列(aid列)將切換到使用更大的整數(shù)(bigint),這樣才能足以保存賬號標識符。
–foreign-keys
在標準的表之間創(chuàng)建外鍵約束(如果f在初始化步驟序列中不存在,這個選項會把它加入)。
–index-tablespace=index_tablespace
在指定的表空間而不是默認表空間中創(chuàng)建索引。
–partition-method=NAME
使用 NAME 方法創(chuàng)建一個分區(qū)的 pgbench_accounts 表。 預期值為 range 或 hash。 此選項要求 --partitions 設(shè)置為非零。 如果未指定,默認值為 range。
–partitions=NUM
創(chuàng)建一個分區(qū) pgbench_accounts 表,其中 NUM 分區(qū)的大小與按比例縮放的帳戶數(shù)幾乎相等。 默認為 0,表示沒有分區(qū)。
–tablespace=tablespace
在指定的表空間而不是默認表空間中創(chuàng)建表。
–unlogged-tables
把所有的表創(chuàng)建為非日志記錄表而不是永久表。
基準選項
pgbench接受下列命令行基準參數(shù):
-b scriptname[@weight]
–builtin=scriptname[@weight]
把指定的內(nèi)建腳本加入到要執(zhí)行的腳本列表中。@之后是一個可選的整數(shù)權(quán)重,它允許調(diào)節(jié)抽取該腳本的可能性。如果沒有指定,它會被設(shè)置為 1??捎玫膬?nèi)建腳本有:tpcb-like、simple-update和select-only。這里也接受內(nèi)建名稱無歧義的前綴縮寫。如果用上特殊的名字list,將會顯示內(nèi)建腳本的列表并且立刻退出。
-c clients
–client=clients
模擬的客戶端數(shù)量,也就是并發(fā)數(shù)據(jù)庫會話數(shù)量。默認為 1。
-C
–connect
為每一個事務(wù)建立一個新連接,而不是只為每個客戶端會話建立一個連接。這對于度量連接開銷有用。
-d
–debug
打印調(diào)試輸出。
-D varname=value
–define=varname=value
定義一個由自定義腳本(見下文)使用的變量。允許多個-D選項。
-f filename[@weight]
–file=filename[@weight]
把一個從filename讀到的事務(wù)腳本加入到被執(zhí)行的腳本列表中。@后面是一個可選的整數(shù)權(quán)重,它允許調(diào)節(jié)抽取該測試的可能性。詳見下文。
-j threads
–jobs=threads
pgbench中的工作者線程數(shù)量。在多 CPU 機器上使用多于一個線程會有用。客戶端會盡可能均勻地分布到可用的線程上。默認為 1。
-l
–log
把與每一個事務(wù)相關(guān)的信息寫到一個日志文件中。
-L limit
–latency-limit=limit
對持續(xù)超過limit毫秒的事務(wù)進行獨立的計數(shù)和報告, 這些事務(wù)被認為是遲到(late)了的事務(wù)。
在使用限流措施時(–rate=…),滯后于計劃超過 limit毫秒并且因此沒有希望滿足延遲限制的事務(wù)根本 不會被發(fā)送給服務(wù)器。這些事務(wù)被認為是被跳過(skipped) 的事務(wù),它們會被單獨計數(shù)并且報告。
-M querymode
–protocol=querymode
要用來提交查詢到服務(wù)器的協(xié)議:
??simple:使用簡單查詢協(xié)議。
??extended使用擴展查詢協(xié)議。
??prepared:使用帶預備語句的擴展查詢語句。
在prepared模式中,pgbench重用從第二次查詢迭代開始的語法分析結(jié)果,因此pgbench運行速度比其他模式快。
-N
–skip-some-updates
運行內(nèi)建的簡單更新腳本。這是-b simple-update的簡寫。
-P sec
–progress=sec
每sec秒顯示進度報告。該報告包括運行了多長時間、從上次報告以來的 tps 以及從上次報告以來事務(wù)延遲的平均值和標準偏差。如果低于限流值(-R),延遲會相對于事務(wù)預定的開始時間(而不是實際的事務(wù)開始時間)計算,因此其中也包括了平均調(diào)度延遲時間。
-r
–report-latencies
在基準結(jié)束后,報告平均的每個命令的每語句等待時間(從客戶端的角度來說是執(zhí)行時間)。詳見下文。
-R rate
–rate=rate
按照指定的速率執(zhí)行事務(wù)而不是盡可能快地執(zhí)行(默認行為)。該速率 以 tps(每秒事務(wù)數(shù))形式給定。如果目標速率高于最大可能速率,則 該速率限制不會影響結(jié)果。
-S
–select-only
執(zhí)行內(nèi)建的只有選擇的腳本。是-b select-only簡寫形式。
-t transactions
–transactions=transactions
每個客戶端運行的事務(wù)數(shù)量。默認為 10。
-T seconds
–time=seconds
運行測試這么多秒,而不是為每個客戶端運行固定數(shù)量的事務(wù)。-t和-T是互斥的。
-v
–vacuum-all
在運行測試前清理所有四個標準的表。在沒有用-n以及-v時, pgbench將清理pgbench_tellers 和pgbench_branches表,并且截斷pgbench_history。
–aggregate-interval=seconds
聚集區(qū)間的長度(單位是秒)。僅可以與-l選項一起使用。通過這個選項,日志會包含針對每個區(qū)間的概要數(shù)據(jù),如下文所述。
–log-prefix=prefix
設(shè)置–log創(chuàng)建的日志文件的文件名前綴。默認是pgbench_log。
–progress-timestamp
當顯示進度(選項-P)時,使用一個時間戳(Unix 時間)取代從運行開始的秒數(shù)。單位是秒,在小數(shù)點后是毫秒精度。這可以有助于比較多種工具生成的日志。
–show-script=scriptname
在 stderr 上顯示內(nèi)置腳本 scriptname 的實際代碼,并立即退出。
測試案例
內(nèi)置:
create database testdb;
pgbench -i -F 90 -s 500 testdb -p 5432 -U postgres -d postgres // 初始化,填充率90%,放大倍數(shù)500
pgbench -c 256 -j 10 -M prepared -n -T 600 -r -h 10.229.89.212 -p 5678 -U pg14 -d postgres
// 256 客戶端連接, 每個客戶端 10個線程, prepared 查詢協(xié)議, 運行時間 600s,
pgbench -c 256 -j 10 -M prepared -n -t 10000 -r -h 10.229.89.212 -p 5678 -U pg14
-d postgres >> 、home/postgres/test_data/1000_transaction_test.log
// 256 客戶端連接, 每個客戶端 10個線程, prepared 查詢協(xié)議,運行事務(wù)數(shù) 10000,將結(jié)果輸出至指定日志
-T 與 -t 互斥
自定義測試
1 首先在指定數(shù)據(jù)庫創(chuàng)建測試表
create table test(id int, age int);
2 準備數(shù)據(jù)
自定義腳本 insert.sql
\sleep 500ms
\set id random(1,100000)
\set age random(18,32)
insert into test(id, age) values(:id, :age);文章來源:http://www.zghlxwxcb.cn/news/detail-433548.html
3 測試結(jié)果
pgbench -f insert.sql -c 10 -j 10 -M prepared -n -T 600 -r -h 10.229.89.212 -p 5678 -U wp_pg14 -d postgres文章來源地址http://www.zghlxwxcb.cn/news/detail-433548.html
transaction type: insert.sql
scaling factor: 1
query mode: prepared
number of clients: 10
number of threads: 10
duration: 600 s
number of transactions actually processed: 11980
latency average = 501.071 ms
initial connection time = 4.248 ms
tps = 19.957239 (without initial connection time)
statement latencies in milliseconds:
501.163 \sleep 500ms
0.065 \set id random(1,100000)
0.036 \set age random(18,32)
0.453 insert into test(id, age) values(:id, :age);
到了這里,關(guān)于pgbench 性能測試工具的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!