《PostgreSQL測(cè)試工具PGbench》要點(diǎn):
本文介紹了PostgreSQL測(cè)試工具PGbench,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
相關(guān)主題:PostgreSQL教程
pgbench 是一個(gè)簡(jiǎn)單的給 PostgreSQL 做性能測(cè)試的程序.它反復(fù)運(yùn)行同樣的 SQL 命令序列,可能是在多個(gè)并發(fā)數(shù)據(jù)庫(kù)會(huì)話上頭,然后檢查平均的事務(wù)速度(每秒的事務(wù)數(shù) tps).缺省的時(shí)候,pgbench 測(cè)試一個(gè)(松散的)接近 TPC-B 的情況,每個(gè)事務(wù)包含五個(gè) SELECT,UPDATE,和 INSERT命令.不過(guò),我們可以很輕松地使用自己的事務(wù)腳本文件來(lái)實(shí)現(xiàn)其它情況.
典型的輸出看上去會(huì)是這樣:
transaction type: TPC-B (sort of)
頭四行只是報(bào)告一些最重要的參數(shù)設(shè)置.跟著的一行報(bào)告完成的事務(wù)數(shù)和期望完成的事務(wù)數(shù)(后者只是客戶端數(shù)乘以事務(wù)數(shù));這兩個(gè)會(huì)相等,除非在完成之前運(yùn)行就失敗了.最后兩行報(bào)告 TPS 速率,分別有計(jì)算啟動(dòng)數(shù)據(jù)庫(kù)會(huì)話時(shí)間和不計(jì)算啟動(dòng)會(huì)話時(shí)間的.
使用環(huán)境:
在比較新的9.1,9.2,9.3數(shù)據(jù)庫(kù)的發(fā)行版本中,pgbench是在安裝contrib包時(shí)直接編譯的,可以在postgres的bin目錄下找到該命令,如果沒(méi)有發(fā)現(xiàn)該命令可以在安裝contrib的目錄下找到pgbench的源碼文件包,編譯一下就可以使用.
postgres$ pgbench --help # 和postgres其他命令的使用方式一樣,--help獲取命令使用方式的簡(jiǎn)單介紹postgres$ createdb pgbench # 創(chuàng)建測(cè)試庫(kù)postgres$ pgbench -i pgbench # 初始化測(cè)試庫(kù)
默認(rèn)會(huì)在測(cè)試庫(kù)中建4張表pgbench_accounts,pgbench_branches,pgbench_history,pgbench_tellers .當(dāng)然也可以自己建表,自己寫測(cè)試腳本,這四張表只是默認(rèn)的測(cè)試腳本會(huì)用到.
pgbench在建默認(rèn)庫(kù)時(shí) -s 參數(shù)設(shè)定測(cè)設(shè)表的大小,默認(rèn)參數(shù)是1 .pgbench_accounts 總行數(shù)是10W,-s后面接具體數(shù)值如100,則pgbench_accounts中的測(cè)試數(shù)據(jù)將達(dá)到1千萬(wàn)行
默認(rèn)的測(cè)試腳本可以在官方文檔中找到(新的版本中不指定模板就會(huì)使用默認(rèn)模板)
$ cat test.sql\set nbranches 1 * :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
腳本說(shuō)明:
可以看到腳本中的一個(gè)事物包括了update,select,insert操作,不同的操作起到不同的測(cè)試目的
(1)UPDATE pgbench_accounts:作為最大的表,起到促發(fā)磁盤I/O的作用.
(2)SELECT abalance:由于上一條UPDATE語(yǔ)句更新一些信息,存在于緩存內(nèi)用于回應(yīng)這個(gè)查詢.
(3)UPDATE pgbench_tellers:職員的數(shù)量比賬號(hào)的數(shù)量要少得多,所以這個(gè)表也很小,并且極有可能存在于內(nèi)存中.
(4)UPDATE pgbench_branches:作為更小的表,內(nèi)容被緩存,如果用戶的環(huán)境是數(shù)量較小的數(shù)據(jù)庫(kù)和多個(gè)客戶端時(shí),對(duì)其鎖操作可能會(huì)成為性能的瓶頸.
(5)INSERT INTO pgbench_history:history表是個(gè)附加表,后續(xù)并不會(huì)進(jìn)行更新或查詢操作,而且也沒(méi)有任何索引.相對(duì)于UPDATE語(yǔ)句,對(duì)其的插入操作對(duì)磁盤的寫入成本也很小.
postgres$ pgbench -c 15 -t 300 pgbench -r -f test.sql #執(zhí)行命令starting vacuum...end.
默認(rèn)的基準(zhǔn)測(cè)試給出了一個(gè)指標(biāo)TPS,同樣的測(cè)試參數(shù),tps的值越高,相對(duì)來(lái)說(shuō)服務(wù)器的性能越好.上面的測(cè)試由于數(shù)據(jù)量的問(wèn)題,表的內(nèi)容全部緩存進(jìn)了內(nèi)存,磁盤io對(duì)上面的結(jié)果影響較小.
在實(shí)際的應(yīng)用中測(cè)試可以自己定義測(cè)試環(huán)境,模擬生產(chǎn)需求.
測(cè)試舉例:
pgbench=# create table pg_test (a1 serial,a2 int,a3 varchar(20),a4 timestamp); #創(chuàng)建測(cè)試表postgres$cat pg_test.sqlpgbench=# insert into pg_test(a2,a3,a4) select (random()*(2*10^5)),substr('abcdefghijklmnopqrstuvwxyz',1, (random()*26)::integer),now(); #每個(gè)事務(wù)插入一條數(shù)據(jù) postgres$pgbench -c 90 -T 10 pgbench -r -f pg_test.sql #90個(gè)并發(fā)測(cè)試每秒插入的數(shù)據(jù)量
測(cè)試結(jié)果截取:
number of transactions actually processed: 20196 #10秒鐘90并發(fā)用戶共插入20196條數(shù)據(jù),每條數(shù)據(jù)插入費(fèi)時(shí)42ms,平均每秒插入2000條數(shù)據(jù)
簡(jiǎn)單舉例:work_mem
postgres=# show work_mem ; #數(shù)據(jù)庫(kù)當(dāng)前的work_memwork_mem
查詢樣本:
postgres$cat select.sql
執(zhí)行結(jié)果截取
number of clients: 90
測(cè)試環(huán)境相同調(diào)節(jié) work_mem參數(shù)為2M試試
number of clients: 90
原因分析,由于排序操作會(huì)關(guān)系到 work_mem,排序操作能全在緩存中進(jìn)行當(dāng)然速度會(huì)明顯加快,查看執(zhí)行計(jì)劃
postgres=# explain analyze SELECT customerid FROM customers ORDER BY zip;QUERY PLAN --------------------------------------------------------------------------------------------Sort (cost=2116.77..2166.77 rows=20000 width=8) (actual time=42.536..46.117 rows=20000 loops=1)Sort Key: zipSort Method: external sort Disk: 352kB-> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=8) (actual time=0.013..8.942 rows=20000 loops=1)Total runtime: 48.858 ms
由上面的執(zhí)行計(jì)劃可以看出在work_mem大小為1M的時(shí)候排序一共需要1.352M空間做排序,所以加大work_mem參數(shù)排序速度明顯增加.【有興趣可以加入588678536一起交流學(xué)習(xí)心得】
這只是個(gè)簡(jiǎn)單的例子,work_mem的大小調(diào)節(jié)還有很多其他方面要考慮的,比如在高并發(fā)的情況下,需要為每個(gè)用戶分配同樣大小的排序空間,會(huì)占用大量的內(nèi)存空間.參數(shù)調(diào)節(jié)在任何時(shí)候堅(jiān)持一個(gè)均衡才是應(yīng)該考慮的.
《PostgreSQL測(cè)試工具PGbench》是否對(duì)您有啟發(fā),歡迎查看更多與《PostgreSQL測(cè)試工具PGbench》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/9625.html