基準測試工具能夠用來對數據庫或者操做系統調優後的性能進行對比。MySQL數據庫自己提供了一些比較優秀的工具,這裏介紹另外兩款更優秀、更經常使用的工具:sysbench和mysql-tpcc。mysql
sysbench是一個模塊化的、跨平臺的、多線程基準測試工具,主要用於測試各類不一樣系統參數下的數據庫負載狀況。sql
它主要包括如下幾種測試方式:數據庫
sysbench的數據庫OLTP測試支持MySQL、PostgreSQL和Oracle。目前sysbench主要用於Linux操做系統,開源社區已經將sysbench移植到Windows,並支持對Microsoft SQL Server數據庫的測試。windows
sysbench的官網地址是:http://sysbench.sourceforge.net,能夠從上述地址下載最新版本的sysbench工具,而後編譯和安裝。此外,有些Linux操做系統發行版本(如RED HAT),可能自己已經提供了sysbench的安裝包,直接安裝便可。服務器
對於InnoDB存儲引擎的數據庫應用來講,咱們可能更關心的是磁盤和OLTP的性能,所以主要測試fileio和oltp這兩個項目。多線程
對於磁盤的測試,sysbench提供瞭如下的測試選項:架構
sysbench --test=fileio help異步
各個參數的含義以下所示:socket
--file-num:生成測試文件的數量,默認爲128。async
--file-block-size:測試期間文件塊的大小,若是你想磁盤針對InnoDB存儲引擎進行測試,能夠將其設置爲16 384,即InnoDB存儲引擎頁的大小。默認爲16 384。
--file-total-size:每一個文件的大小,默認爲2GB。
--file-test-mode:文件測試模式,包含seqwr(順序寫)、seqrewr(順序讀寫)、seqrd(順序讀)、rndrd(隨機讀)、rndwr(隨機寫)和rndrw(隨機讀寫)。
--file-io-mode:文件操做的模式,同步仍是異步,或者選擇MMAP(map映射)模式。默認爲同步。
--file-extra-flags:打開文件時的選項,這是與API相關的參數。
--file-fsync-freq:執行fsync函數的頻率。fsync主要是同步磁盤文件,由於可能有系統和磁盤緩衝的關係。
--file-fsync-all:每執行完一次寫操做,就執行一次fsync。默認爲off。
--file-fsync-end:在測試結束時執行fsync。默認爲on。
--file-fsync-mode:文件同步函數的選擇,一樣是和API相關的參數,因爲多個操做系統對於fdatasync支持的不一樣,所以不建議使用fdatasync。默認爲fsync。
--file-rw-ratio:測試時的讀寫比例,默認時讀寫2:1。
sysbench的fileio測試須要通過prepare、run和clean三個階段。
如咱們進行16個文件、總大小2GB的fileio測試:
sysbench --test=fileio --file -num=16 --file -total -size=2G prepare
接着在相應的目錄下就會產生16個文件了,由於總大小是2GB,因此每一個文件的大小應該是128MB:
接着就能夠基於這些文件進行測試了,下面是在16個線程下的隨機讀取性能:
sysbench --test=fileio --file -total -size=2G --file -test -mode=rndrd --max -time=180 --max -requests=100000000 --num -threads=16 --init -rng=on --file -num=16 --file -extra -flags=direct --file -fsync -freq=0 --file -block -size=16384 run
上述測試的最大隨機讀取請求是100 000 000次,若是在180秒內不能完成,測試即結束。
測試結束後能夠看到以下的測試結果:
sysbench --test=fileio --file -total -size=2G --file -test -mode=rndrd --max -time=180 --max -requests=100000000 --num -threads=16 --init -rng=on --file -num=16 --file -extra -flags=direct --file -fsync -freq=0 --file -block -size=16384 run
能夠看到隨機讀取的性能爲53.81MB/sec,隨機讀的IOPS爲3443.85。測試的硬盤是固態硬盤,所以隨機讀取的性能較爲強勁。此外還能夠看到每次請求的一些具體數據,如最大值、最小值、平均值等。
測試結束後,記得要執行clean,以確保測試所產生的文件都已刪除:
sysbench --test=fileio --file -num=16 --file -total -size=2G cleanup
可能你須要測試隨機讀、隨機寫、隨機讀寫、順序寫、順序讀等全部這些模式,而且還可能須要測試不一樣的線程和不一樣文件塊下磁盤的性能表現,這時你可能須要相似以下的腳原本幫你自動完成這些測試:
#!/bin/sh set-u set-x set-e for size in 8G 64G;do for mode in seqrd seqrw rndrd rndwr rndrw;do for blksize in 4096 16384;do sysbench--test=fileio--file-num=64--file-total-size=$size prepare for threads in 1 4 8 16 32;do echo"======testing$blksize in$threads threads" echo PARAMS$size$mode$threads$blksize>sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize for i in 1 2 3;do sysbench--test=fileio--file-total-size=$size--file-test-mode=$mode\ --max-time=180--max-requests=100000000--num-threads=$threads--init-rng=on\ --file-num=64--file-extra-flags=direct--file-fsync-freq=0--file-block-size=$blksize run\ |tee-a sysbench-size-$size-mode-$mode-threads-$threads-blksz-$blksize 2>&1 done done sysbench--test=fileio--file-total-size=$size cleanup done done done
對於mysql的OLTP測試,和fileio同樣,一樣須要經歷prepare、run和cleanup的階段。prepare階段會根據選項產生一張指定行數的表,默認表在sbtest架構下,表名爲sbtest(sysbench默認生成表的存儲引擎爲InnoDB),如建立一張有8000萬條記錄的表:
sysbench --test=oltp --oltp -table -size=80000000 --db -driver=mysql --mysql-socket=/tmp/mysql.sock --mysql-user=root prepare
接着就能夠根據產生的表進行oltp的測試:
sysbench --test=oltp --oltp -table -size=80000000 --oltp -read -only=off --init -rng=on --num -threads=16 --max -requests=0 --oltp -dist -type=uniform --max -time=3600 --mysql -user=root --mysql -socket=/tmp/mysql.sock --db -driver=mysql run>res
咱們將測試結果放入了文件res中。
結果中羅列出了測試時不少操做的詳細信息,transactions表明了測試結果的評判標準,即TPS,上述測試的結果是119.9tps。你能夠對數據庫進行調優後再運行sysbench的oltp測試,看看tps是否有所提升。注意,sysbench的測試只是基準測試,並不表明實際企業環境下的性能指標。
TPC(Transaction Processing Performance Council,事務處理性能協會)是一個評價大型數據庫系統軟硬件性能的非盈利組織。TPC-C是TPC協會制定的,用來測試典型的複雜OLTP(在線事務處理)系統的性能。目前,在學術界和業界,廣泛採用TPC-C來評價OLTP應用的性能。
TPC-C用3NF(第三範式)虛擬實現了一家倉庫銷售供應商公司,擁有一批分佈在不一樣地方的倉庫和地區分公司。當公司業務擴大時,將創建新的倉庫和地區分公司。一般每一個倉庫供貨覆蓋10家地區分公司,每一個地區分公司服務3000名客戶。該公司共有100 000種商品,分別儲存在各個倉庫中。該系統包含了庫存管理、銷售、分發產品、付款、訂單查詢等一系列操做,一共包含了9個基本關係,基本關係圖以下圖所示。
TPC-C的性能度量單位是tpmC,tpm是transaction per minute的縮寫,C表明TPC的C基準測試。該值越大,表明事務處理的性能越高。
tpcc-mysql是開源的TPC-C測試工具,該測試工具徹底遵照TPC-C的標準。其官方網站爲:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql。以前tpcc-mysql主要工做在Linux操做系統上,我已經將其移植到了Windows平臺,能夠在http://code.google.com/p/david-mysql-tools/downloads/list下載到windows版本的tpcc-mysql。
tpcc-mysql由如下兩個工具組成:
tpcc_load:根據倉庫數量,生成9張表中的數據。
tpcc_start:根據不一樣選項進行tpcc測試。
tpcc_load命令的使用方法以下所示:tpcc_load
usage:
tpcc_load[server][DB][user][pass][warehouse]
OR
tpcc_load[server][DB][user][pass][warehouse][part][min_wh][max_wh]*[part]:1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
上述各參數解析以下:
server:導入的MySQL服務器IP。
DB:導入的數據庫。
user:mysql的用戶名。
pass:mysql的密碼。
warehouse:要生產的倉庫數量。
若是用tpcc_load工具建立100個倉庫的數據庫tpcc,能夠這樣:
mysql tpcc<create_table.sql
mysql tpcc<add_fkey_idx.sql
tpcc_load 127.0.0.1 tpcc2 root xxxxxx 100
tpcc_start命令的使用方法以下所示:tpcc_start
usage:tpcc_start[server][DB][user][pass][warehouse][connection][rampup][measure]
相關參數的做用以下:
connection:測試時的線程數量。
rampup:熱身時間,單位爲秒,這段時間的操做不計入統計信息。
measure:測試時間,單位爲秒。
如咱們使用tpcc_start進行16個線程的測試,熱身時間爲10分鐘、測試時間爲20分鐘,以下代碼所示。
tpcc_start 127.0.0.1 tpcc root xxxxxx 100 16 600 1200
在測試的時候,你也許會在終端上看到以下輸出:
RAMP-UP TIME.(1 sec.)
MEASURING START.
10,624(0):0.4,624(0):0.2,62(0):0.2,63(0):0.6,62(0):0.8
20,990(0):0.2,988(0):0.2,98(0):0.2,99(0):0.4,98(0):0.6
30,1435(0):0.2,1436(0):0.2,144(0):0.2,143(0):0.2,144(0):0.4
這些信息是每10秒tpcc測試的結果數據,tpcc測試一共測試5個模塊,分別是New Order、Payment、Order-Status、Delivery、Stock-Level。
第一個值即爲New Order,這也是TPCC測試結果的一個重要考量標準New Order Per 10 Second(每十秒訂單處理能力),能夠將測試時全部的數據組成一張折線圖或散點圖,觀察InnoDB存儲引擎每10秒的性能表現。而tpcc_load最後結束時產生的tpmC,也是經過New Order Per 10 Second來進行的:首先求出New Order Per 10 Second的平均值,而後乘以6,獲得的就是最終的tpmC。