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