sysbench簡介
Sysbench是一個模塊化的、跨平台、多線程基准測試工具,主要用於評估測試各種不同系統參數下的數據庫負載情況。它主要包括以下幾種方式的測試:cpu性能,磁盤io性能,線程調度性能,內存分配及傳輸速度和數據庫性能。由於本人是dba,因此重點關注sysbench測試數據庫的場景。目前sysbench支持mysql,postgreSQL,oracle三種數據源。
下載&安裝
1) 下載
通過http://download.csdn.net/download/jungeshidai/8854157頁面下載sysbench0.5版本
2) 編譯安裝
tar -zxvf sysbench-0.5.tar.gz cd sysbench-0.5 ./autogen.sh ./configure ./make ./make install
3) 可能遇到的問題
a) lua腳本,因為sysbench0.5的測試用例改為lua,若有童鞋使用0.5版本,執行命令時仍然采用老的方式,--test=oltp,就會出現報錯
“PANIC: unprotected error in call to Lua API (cannot open oltp: No such file or directory)”,因此注意將--test=oltp改為./tests/db/oltp.lua即可。
b) 運行oltp測試時,默認會在sbtest庫里面建表測試,但是庫需要自己預先建立好,否則就會出現連不上database的錯誤,當然,也可以通過參數--mysql-db指定。
測試過程
測試主要包括准備數據階段,測試階段和清理階段。
1) 准備階段
sysbench --test=./tests/db/oltp.lua --mysql-table-engine=innodb --oltp-table-size=100000 --mysql-socket=/u01/my3306/run/mysql.sock --mysql-user=chuck --mysql-host=localhost --mysql-password=chuck --num-threads=20 prepare
2) 測試階段
sysbench --test=./tests/db/oltp.lua --mysql-table-engine=innodb --num_threads=10 --oltp-table-size=100000 --mysql-db=test --mysql-user=chuck --oltp-tables-count=10 --mysql-password=chuck run
3) 清理階段
sysbench --test=./tests/db/select.lua --mysql-table-engine=innodb --num_threads=10 --oltp-table-size=100000 --mysql-db=test --mysql-user=chuck --oltp-tables-count=10 --mysql-password=chuck cleanup
重要參數
--test=STRING
指定測試用例,sysbench0.5所有測試用例采用lua腳本編寫,用戶可以根據需求寫符合自己測試的腳本,因此非常靈活。比如:--test=./tests/db/select.lua
--max-requests=N,設置請求的數目,默認值是10000
--max-time=N,設置執行的時間,默認是0,即沒有限制
這兩個參數可以配合起來使用,默認值表示,執行完10000個請求,不受時間限制。因為請求可以多種多樣,對於不同的lua腳本,對應的就是不同的請求,比如
insert.lua,delete.lua,select.lua等。當然你也可以編輯自己的lua腳本,封裝成為一個event。因此,對於不同類型的測試用例,執行時間會相差很大。對於運行時間很快的測試用例,可以增大max-requests的值,對於運行很慢的測試用例,可以通過設置max-time來限制運行時常。
--report-interval=N,設置打印的時間間隔,默認值是0,設置執行的時長,以秒為單位對於很長時間的測試用例,為了得到實時的測試信息,可以設置該參數,否則,只有一直干等,運行結束后才能看到測試報告。
--percentile=N,設置采樣比例,默認是95%
--num-threads=N,設置並發的線程數目
執行結果解讀
這里以oltp.lua測試用例的測試結果來簡單說明下。
sysbench --test=./tests/db/oltp.lua --num_threads=10 --oltp-table-size=100000 --mysql-db=test --mysql-user=chuck --oltp-tables-count=10 --mysql-password=chuck --max-requests=100000 --report-interval=5 --percentile=95 run
1) 實時信息
每5s采集一次實時信息,tps表示事務數目,writes/reads分別表示平均每秒寫和讀的次數
[ 5s] threads: 10, tps: 31.80, reads/s: 460.79, writes/s: 128.00
[ 10s] threads: 10, tps: 35.40, reads/s: 502.00, writes/s: 143.00
[ 15s] threads: 10, tps: 31.20, reads/s: 438.20, writes/s: 124.20
[ 20s] threads: 10, tps: 33.00, reads/s: 463.60, writes/s: 130.40
[ 25s] threads: 10, tps: 33.60, reads/s: 462.40, writes/s: 134.40
[ 30s] threads: 10, tps: 34.20, reads/s: 484.80, writes/s: 137.20
[ 35s] threads: 10, tps: 31.00, reads/s: 438.20, writes/s: 124.40
[ 40s] threads: 10, tps: 32.20, reads/s: 445.40, writes/s: 128.60
2) 匯總信息
OLTP test statistics:
queries performed:
read: 140000
write: 40000
other: 20000
total: 200000
transactions: 10000 (32.89 per sec.) //總共執行了10000個事務
deadlocks: 0 (0.00 per sec.)
read/write requests: 180000 (592.04 per sec.) //讀寫請求有180000,一個事務包含多個讀寫請求
other operations: 20000 (65.78 per sec.)
Test execution summary:
total time: 304.0326s //總共運行了5分鍾
total number of events: 10000
total time taken by event execution: 3039.9491s
per-request statistics:
min: 27.73ms
avg: 303.99ms
max: 1940.30ms
approx. 95 percentile: 635.58ms //95%的平均耗時為635ms,這里對統計值有點疑問,95%的是635ms,而平均值是300ms。
Threads fairness:
events (avg/stddev): 1000.0000/14.47
execution time (avg/stddev): 303.9949/0.02
參考文檔
http://www.tuicool.com/articles/iQFF3i
