Mysql基準測試詳細解說(根據慕課網:《打造扛得住Mysql資料庫架構》視訊課程實時筆錄)

OldBoy~發表於2017-05-17

什麼是基準測試

基準測試是一種測量和評估軟體效能指標的活動用於建立某個時刻的效能基準,以便當系統發生軟硬體變化時重新進行基準測試以及評估變化對效能的影響。

    我們可以這樣認為:基準測試是針對系統設定的一種壓力測試。用來觀察系統在不同壓力下的行為,評估系統的容量,觀察系統如何處理不同的資料,但是要注意的是基準測試和通常所說的壓力測試還是有區別的。

    基準測試要儘量的直接和簡單,使各個結果之間容易比較,基準測試所使用的資料通常是由測試工具所生成的,只能用於評估伺服器的

處理能力;而壓力測試通常是通過真實的業務資料進行測試,以獲得真實的業務系統所能承受的壓力,所以基準測試是簡化了的壓力測試。基準測試給系統帶來的壓力通常只能測量系統的效能,而忽略了系統邏輯的壓力測試。舉例:如果我們要對一個網站進行壓力測試,通過不同的主題來進行,比如購物車流程的壓力測試,我們就要按照購物流程的業務邏輯來設計我們的壓力測試要包括哪些購物流程,所使用的資料和查詢呢也是在整個購物流程中要用到的,而基準測試就不是這樣,比如我們要對Mysql進行基準測試的話,我們可能不用關心在mysql上執行的系統邏輯是什麼,比如我們可以通過一個簡單的查詢通過多執行緒併發來衡量調優後的結果是否有效,我們所使用的查詢資料真實性同業務性也是沒有任何關係的,這就是基準測試。

基準測試的目的

一:首先是建立mysql伺服器的效能基準線,主要是確定當前mysql伺服器的執行情況,如果不清楚當前的系統效能,我們就無法確定某些優化了的實際產生的效果會怎樣,同時呢我們也可以利用歷史基準測試的結果來分析診斷一些應用中出現的效能問題

二:模擬比當前系統更高的負載,以找出系統隨著壓力的增加而產生的的擴充套件瓶頸,通常我們就是在一定資料量的情況下不斷地增加資料庫的併發來觀察QPS和TPS的變化,確定併發量多少的情況下是最好的,一旦超過某個併發會出現效能下降的情況

三:基準測試還可以幫助我們測試不同的硬體、軟體和作業系統配置的情況下資料庫的效能,比如硬體差別比較適合當前系統,升級Mysql的版本是否會改善效能,等等。。。。所有的問題可以通過基準測試得到解決

四:我們可以通過基準測試證明我們採購的新硬體裝置是否配置正確,也可以幫助我們瞭解新的硬體效能基準線

如何進行基準測試

一:對整個系統進行基準測試。這種方法一般從系統的入口進行測試,比如對於網站來說,一般從web前端進行測試,手機APP則是通過APP的前端進行測試。

優點:

A:可以測試整個系統的效能,包括web伺服器、程式程式碼、快取伺服器、網路和資料庫等等的一些元件,這些通常是比較重要的,因為我們關心的不僅僅是mysql資料庫的效能,相比於資料庫我們通常來說更關心整個系統的效能是什麼樣的,所以呢對整個系統整體的測試呢可以擺出各種效能問題,另外從另一方面來說,mysql也並非是系統效能產生的瓶頸,如果我們只關注mysql或許會忽略系統元件中其他效能問題

B:能反映出系統中各個元件介面間的效能問題體現真實效能狀況。

缺點:

測試設計比較複雜,消耗的時間比較長,通常完成一次對整個系統的基準測試耗費幾天的時間比較正常的。

二:單獨對mysql進行基準測試。

特別在一些時候,我們不需要對整個系統基準測試的情況下,那麼單獨對一個元件進行測試更為合適,比如我們只更新了mysql伺服器的硬體,比如mysql中的索引、sql進行優化,這時候我們就只需要對mysql進行基準測試就可以了。

優點:

測試方法設計簡單,所消耗的時間短。比較適合用於比較不通的資料結構、查詢、效能的差異,或者是針對應用的某個問題進行測試。

缺點:

由於我們只是單獨的對mysql進行測試,無法全面瞭解整個系統的效能基準線,也無法提現系統中不同元件及介面之間的效能問題。

mysql基準測試的常見指標

一:單位時間內所處理的事務數(TPS)

二:單位時間內所處理的查詢數(QPS)

這兩個指標通常用於衡量資料庫的吞吐量,我們資料的資料庫每秒所處理的事務量(TPS)和查詢數(QPS)就是這類指標的具體體現。對於相同的資料量的相同的sql進行測試,如果調整後的TPS量和QPS量有明顯的增長,那麼說明我們的除錯是成功的,否則考慮我們的優化方法是否確。

三:響應時間

這個指標用於衡量完成一個測試任務所花費的整體時間,一個測試任務通常包括很多的測試項,就算我們對一個sql進行測試,通常也會對一個sql執行很多次,那麼具體的測試情況和測試用例是不同的,響應的時間單位可能是秒、微秒、毫秒或者分鐘,當然也可能是小時,針對不同的時間單位,我們可以計算每次測試執行的平均響應時間、最小響應時間、最大響應時間、各時間所佔百分比。通常來說最大的響應時間對我們來說意義並不是很大,因為隨著測試時間加長,最大響應時間也可能越來越大,意義比較大的是百分比響應時間,例如:一個sql的90%響應時間是10毫秒,那麼這個sql正常情況下就是10毫秒,其他情況下就是意外了,比如鎖等。。。

四:併發請求的數量(同時處理的查詢請求數量)

對於網站應用來說,經常被表示成有多少使用者同時瀏覽一個web網站,這時通常以web伺服器的會話量來標示指標,這樣是不正確的。我們經常看到一些論壇看到同時線上的有幾千甚至幾萬,這並不代表併發量有這麼多。一方面對於大多數使用者來說只是簡單瀏覽web頁面上的資訊,這並不等於web伺服器的併發性,另一方面web伺服器的併發量也不等同於資料庫的併發量,即使web伺服器當前有幾千甚至幾萬的使用者,到mysql端呢併發甚至只有幾十個,甚至會更少。如何獲取mysql伺服器的併發情況:基準測試需要關注的是正在工作中的併發的操作,或者同時工作的執行緒的數量,而不是多少連線的執行緒就可以了。

基準測試的步驟

計劃和設計基準測試

?對整個系統還是某一個元件,比如僅僅對mysql

?使用什麼樣的資料進行測試,比如我們希望基準測試能夠反映出系統的實際情況,最好使用生產環境的實際資料和實際語言的sql進行資料測試,如果使用這種方式需要注意:最好利用生產環境資料庫的備份以及在一個時間段內實際產生的sql日誌來進行多執行緒的回放來進行測試,這種方式比較複雜,並且準備資料的時間和測試時間比較長,如果我們只想知道某個引數的調整對我們資料庫的影響的話,就完全沒必要這麼麻煩,可以使用專門的測試工具來生產測試中所需要的資料和sql以此來完成基準測試,這種方式比使用生產環境的資料更加簡單

準備基準測試資料及資料收集指令碼

    如果希望使用系統的真實資料的話,那麼我們最好提前或許真實資料資料庫的備份,以及在真實環境中執行sql的記錄,對於sql的執行記錄通常我們可以把慢查詢日誌全部記錄下來來獲得;如果沒必要使用真實資料的話,一般的測試工具都可以滿足但是對於測試執行過程中系統收集的指令碼需要自己編寫,通常情況下在執行基準測試時,我們需要儘可能多的收集測試系統的當前資訊,

包括CPU使用率、IO、網路流量、狀態與計數器資訊等。

資訊系統收集指令碼:(暫時未測試)

#!/bin/bash
INTERVAL=5                        #執行間隔,每隔多少時間收集一下狀態資訊
PREFIX=/home/imooc/benchmarks/$INTERVAL-sec-status    #定義了狀態資訊的儲存位置
RUNFILE=/home/imooc/benchmarks/running            #指定了執行標示,如果存在標示,證明指令碼在執行,想停止指令碼,就刪除檔案
echo "1">$RUNFILE                    #標示檔案
MYSQL=/usr/local/mysql/bin/mysql            #mysql命令所在的位置
$MYSQL -e "show global variables" >>mysql-variables    #記錄了進行測試的當前mysql的一些設定資訊
while test -e $RUNFILE;                    #迴圈體開始
do
    file=$(date +%F_%I)                #定義了指令碼執行時間
    sleep=$(date +%s.$N | awk '{print 5 - ($1 % 5)}')    #每隔多久執行一次指令碼
    sleep $sleep
    ts="$(date +"TS %s.$N $F %T")" 
    loadavg="$(uptime)"                #系統的負載情況
    echo "$ts $loadavg" >> $PREFIX-${file}-status    #記錄到檔案中
    $MYSQL -e "show global status" >> $PREFIX-${file}-status &    #mysql的全域性的狀態資訊
    echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus        #記錄在檔案裡
    $MYSQL -e "show engine innodb status" >> $PREFIX-${file}-innodbstatus &        #收集innodb的狀態資訊
    echo "$ts $loadavg" >> $PREFIX-${file}-processlist
    $MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist &        #收集mysql執行緒的情況
    echo $ts
done    
echo Exiting because $RUNFILE does not exists

執行基準測試

儲存及分析基準測試結果(未測試)

#!/bin/bash
awk '
    BEGIN {
        printf "#ts date time load QPS";
        fmt=" %.2f";
    }
    /^TS/ {
        ts=substr($2,1,index($2,".")-1);
        load=NF-2;
        diff=ts-prev_ts;
        printf "\n%s %s %s %s %s",ts,$3,$4,substr($load,1,length($load)-1);
        prev_ts=ts;
    }
    /Queries/{
        print fmt,($2-Queries)/diff;
        Queries=$2
    }
    ' "$@"

基準測試中需要注意的問題

基準測試中容易忽略的問題

一:使用生產環境的真實資料進行測試時只使用子集,而不是全部資料。最好使用生產環境資料庫完全的備份進行測試,而不是人為從全部資料中選取一部分進行測試。

二:在一個多使用者場景中,只做單使用者的測試,比如web應用通常是存大量使用者併發的場景,在web資料庫進行基準測試時,必須考慮併發情況,使用多個連線執行緒對mysql的效能進行測試,通常情況下多執行緒併發的資料庫效能和單執行緒訪問的資料庫效能的表現是完全不同的,應用呢在單執行緒時執行的很好,一單存在併發就會出現大量的阻塞和死鎖,這種情況是在單執行緒無法發現的。對於多使用者訪問的場景一定使用多執行緒併發測試才能達到目的。

三:在單獨伺服器上測試分散式應用的效能。分散式和單伺服器表現是不同的,比如我們生產環境的資料庫部署使用的是主從同步並且讀寫分離的架構,那麼在測試的時候也要相同的架構測試。

四:在測試過程中反覆執行同一個查詢。在真實的生產環境中所使用的查詢肯定是不盡相同的,這樣可能會造成查詢快取的命中率比較低的情況,如果我們在基準測試中反覆使用同一個sql進行查詢,那麼在某種程度上來說,這個查詢會在快取中命中,那麼就無法體現出真實的效能。

常用的mysql基準測試工具

mysqlslap,mysql自帶的一款基準測試工具,並不能非常好的提現出mysql  innodb儲存引擎的效能,也並沒有在自增id列上建立相關的索引

特點:可以模擬系統伺服器的負載,並且可以輸出相關的統計資訊

測試時可以指定執行的併發因素,也可以自動生成查詢語句,如果沒指定sql語句,mysqlslap工具也可以自動生成完成基準測試需要的資料及查詢語句.

mysqlslap常用引數說明:

--auto-generate-sql 用於指定由系統自動生成指令碼進行測試還是使用自己的資料和sql進行測試。如果指定代表用系統自己生成的SQL指令碼
來測試。
--auto-generate-sql-add-autoincrement  指定了在自動生成表中是否要增加自增id列,如果是對innodb引擎進行測試,這個引數很重要
,因為innodb
的主鍵是聚集索引,最好使用自增id來作為innodb表的主鍵。
--auto-generate-sql-load-type  它指定了測試中使用的查詢型別,預設使用混合測試型別,代表同時包括了讀寫查詢刪除更新等混合sql
語句進行測試
--auto-generate-sql-wite-number   指定了mysqlslap可以自動生成測試資料的資料量是多少,一般情況下這個引數初始化是100行資料。
--concurrency 代表併發數量,多個可以用逗號隔開,例如:concurrency=10,50,100, 併發連線執行緒數分別是10、50、100個併發。
--engines代表要測試的引擎,可以有多個,用分隔符隔開。mysql會先進行一種測試,比如myisam,測試完後再進行innodb進行測試
--no-drop在預設情況下,mysql對資料完成一次測試之後會對自動生成的資料進行清理
--iterations代表要執行這些測試多少次。如果要得出正確結果,最好執行多次,多次測試得出百分比,得出相對穩定的測試結果,同樣
mysqlslap每測試一次就會重新生成測試資料,所以如果我們制定此引數就不能指定no-drop引數,是相互衝突的
--number-of-queries 指定每個執行緒執行查詢的次數,代表總共要執行多少次查詢。每個客戶端執行的查詢數量可以用查詢總數/併發數來計
算。
--debug-info 指定此引數,代表要額外輸出CPU以及記憶體的相關資訊。
--number-int-cols 指定建立測試表的 int 型欄位數量
--number-char-cols 指定建立測試表的 char 型欄位數量。
--create-schema  指定測試的資料庫的名字,MySQL中schema也就是database。
--query  使用自定義指令碼執行測試,例如可以呼叫自定義的一個儲存過程或者sql語句來執行測試。
--only-print 並不執行測試指令碼,而是把生成的指令碼列印出來

執行命令

mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql 
--auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=newtest

說明

--concurrency=1,50,100,200          //指定併發數,單執行緒分別50,100,200
--iterations=3                //對測試完成3次    
--number-int-cols=5            //生成的整數列型別行數
--number-char-cols=5            //生成的char列型別行數
--auto-generate-sql            //看說明
--auto-generate-sql-add-autoincrement    //看說明
--engine=myisam,innodb             //引擎,兩種
--number-of-queries=10            //每個程式所執行的查詢量是10次,保證測試時間比較少
--create-schema=newtest            //指定建立的庫
[--only-print | more]            //可以另外指定

測試結果

//單併發情況下,也就是每個sql執行緒只執行一個查詢
Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.000 seconds  //平均秒完成
    Minimum number of seconds to run all queries: 0.000 seconds
    Maximum number of seconds to run all queries: 0.001 seconds
    Number of clients running queries: 1    
    Average number of queries per client: 10

Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.078 seconds
    Minimum number of seconds to run all queries: 0.063 seconds
    Maximum number of seconds to run all queries: 0.108 seconds
    Number of clients running queries: 50
    Average number of queries per client: 0

Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.146 seconds
    Minimum number of seconds to run all queries: 0.136 seconds
    Maximum number of seconds to run all queries: 0.155 seconds
    Number of clients running queries: 100
    Average number of queries per client: 0

//200個併發
Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.302 seconds   //平均0.302秒完成
    Minimum number of seconds to run all queries: 0.281 seconds
    Maximum number of seconds to run all queries: 0.316 seconds
    Number of clients running queries: 200
    Average number of queries per client: 0



//單併發情況下,也就是每個sql執行緒只執行一個查詢
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.047 seconds     //平均秒完成
    Minimum number of seconds to run all queries: 0.024 seconds
    Maximum number of seconds to run all queries: 0.060 seconds
    Number of clients running queries: 1
    Average number of queries per client: 10

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 1.026 seconds
    Minimum number of seconds to run all queries: 0.962 seconds
    Maximum number of seconds to run all queries: 1.108 seconds
    Number of clients running queries: 50
    Average number of queries per client: 0

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 2.073 seconds
    Minimum number of seconds to run all queries: 2.009 seconds
    Maximum number of seconds to run all queries: 2.187 seconds
    Number of clients running queries: 100
    Average number of queries per client: 0

//200個併發
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 4.314 seconds    //4.314秒完成
    Minimum number of seconds to run all queries: 4.125 seconds
    Maximum number of seconds to run all queries: 4.472 seconds
    Number of clients running queries: 200
    Average number of queries per client: 0

sysbench更為通用,同樣是一款多執行緒的基準測試工具,可以對影響資料庫伺服器效能的各種因素進行測試,並評估效能的表現,可以對IO、CPU、記憶體以及資料庫伺服器等等進行測試,同時支援指令碼語言,可以對各種場景進行測試,使用起來非常靈活,是一款非常全面的測試工具,也是最常用的基準測試工具,同時測試方式更接近於Innodb的資料方式,可以很好地對mysql硬體進行測試。

它主要包括以下幾種方式的測試:

1、cpu效能

2、磁碟io效能

3、排程程式效能

4、記憶體分配及傳輸速度

5、POSIX執行緒效能

6、資料庫效能(OLTP基準測試)

目前sysbench主要支援 MySQL,pgsql,oracle 這3種資料庫。

安裝sysbench(本次安裝與配置是通過yum快速安裝mysql的一些預設路徑)

wget  .... //下載地址忽略
unzip 0.5.zip
cd sysbench0.5
./autogen.sh

出現了報錯:automake 1.10.x (aclocal) wasn't found, exiting,執行以下命令

yum install automake
./autogen.sh

再次報錯:libtoolize 1.4+ wasn't found, exiting,繼續執行以下命令

yum install libtool
./autogen.sh
[root@localhost sysbench-0.5]# ./autogen.sh 
./autogen.sh: running `aclocal -I m4' 
./autogen.sh: running `libtoolize --copy --force' 
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'.
libtoolize: copying file `config/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
./autogen.sh: running `autoheader' 
./autogen.sh: running `automake -c --foreign --add-missing' 
configure.ac:25: installing `config/compile'
configure.ac:11: installing `config/config.guess'
configure.ac:11: installing `config/config.sub'
configure.ac:16: installing `config/install-sh'
configure.ac:16: installing `config/missing'
sysbench/Makefile.am: installing `config/depcomp'
./autogen.sh: running `autoconf' 
Libtoolized with: libtoolize (GNU libtool) 2.2.6b
Automade with: automake (GNU automake) 1.11.1
Configured with: autoconf (GNU Autoconf) 2.63             //OK
./configure --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/var/lib/mysql/    //yum的預設安裝路徑配置

報錯:configure: error: cannot find MySQL client libraries in /var/lib/mysql/,執行以下命令

cp /usr/lib64/mysql/* /var/lib/mysql/
./configure --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/var/lib/mysql/   //繼續執行
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
....................
config.status: creating sysbench/drivers/mysql/Makefile
config.status: creating sysbench/drivers/drizzle/Makefile
config.status: creating sysbench/drivers/oracle/Makefile
config.status: creating sysbench/drivers/pgsql/Makefile
config.status: creating sysbench/drivers/attachsql/Makefile
config.status: creating sysbench/tests/Makefile
config.status: creating sysbench/tests/cpu/Makefile
config.status: creating sysbench/tests/fileio/Makefile
config.status: creating sysbench/tests/memory/Makefile
config.status: creating sysbench/tests/threads/Makefile
config.status: creating sysbench/tests/mutex/Makefile
config.status: creating sysbench/tests/db/Makefile
config.status: creating sysbench/scripting/Makefile
config.status: creating sysbench/scripting/lua/Makefile
config.status: creating sysbench/scripting/lua/src/Makefile
config.status: creating tests/Makefile
config.status: creating tests/include/config.sh
config.status: creating config/config.h
config.status: executing depfiles commands
config.status: executing libtool commands

[./configure --with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/  //非yum安裝配置例子]

make && make install
Making all in doc
make[1]: Entering directory `/usr/local/src/sysbench-0.5/doc'
Making all in xsl
make[2]: Entering directory `/usr/local/src/sysbench-0.5/doc/xsl'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/usr/local/src/sysbench-0.5/doc/xsl'
make[2]: Entering directory `/usr/local/src/sysbench-0.5/doc'
.......
make[1]: Entering directory `/usr/local/src/sysbench-0.5'
make[2]: Entering directory `/usr/local/src/sysbench-0.5'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/usr/local/src/sysbench-0.5'
make[1]: Leaving directory `/usr/local/src/sysbench-0.5'

安裝編譯完成!

常用引數

--mysql-db                 //使用者指定執行基準測試的資料庫名
--mysql-table-engine         //用於指定所使用的儲存引擎
--oltp-tables-count         //執行測試的表的數量
--oltp-table-size            //指定每個表中的資料行數
--num-threads                //指定測試的併發執行緒數量
--max-time                   //指定最大的測試時間
--report-interval            //指定間隔多長時間輸出一次統計資訊
--mysql-user                 //指定執行測試的Mysql使用者
--mysql-password             //指定執行測試的Mysql密碼
prepare                      //用於準備測試資料
run                          //用於實際進行測試
cleanup                      //用於清理測試資料

A:對CPU進行基準測試

sysbench --test=cpu --cpu-max-prime=10000 run        //CPU進行的最大計算整數值是10000
sysbench 0.5:  multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Random number generator seed is 0 and will be ignored
Prime numbers limit: 10000
Initializing worker threads...
Threads started!
General statistics:
    total time:                          14.2054s
    total number of events:              10000
    total time taken by event execution: 14.1802s
    response time:
         min:                                  1.00ms
         avg:                                  1.42ms
         max:                                  8.78ms
         approx.  95 percentile:               2.71ms            //95%的時間是2.71毫
         秒時間完成

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   14.1802/0.00

開始資料庫效能測試,首先要生成測試資料,先建立用於基準測試的資料庫以及相關的資料庫密碼。

進入mysql

create databases ceshi;                             //建立一個資料庫,叫ceshi
grant all privileges on *.* to root@'localhost' identified by '123456';   //使用者叫root,賦予所有許可權

B:模擬oltp測試

sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=test --mysql-user=root
 --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock prepare

sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=test --mysql-user=root
 --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock run
Threads started!

OLTP test statistics:
    queries performed:    
        read:                     140000      //讀的總數量
        write:                     40000      //寫的數量
        other:                     20000      //除了讀寫其他數量,比如commit
        total:                     200000     //總數量
    transactions:        10000  (143.53 per sec.)       //每秒所執行的事務數,伺服器每秒的tps是143次
    read/write requests:         180000 (2583.54 per sec.)   //請求的數量每秒大概2583次
    other operations:                    20000  (287.06 per sec.)    //其他操作每秒大概287次
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                     69.6719s              //總耗費時間69秒
    total number of events:              10000                        
    total time taken by event execution: 69.6265s                    
    response time:
         min:                                  2.35ms
         avg:                                  6.96ms
         max:                                528.71ms
         approx.  95 percentile:              17.92ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00            //平均執行時間10000次
    execution time (avg/stddev):   69.6265/0.00                 /平均響應時間69秒
8 執行緒併發、只讀模式、測試時長為 60s 。
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --max-time=60 --oltp-read-only=on 
--max-requests=0 --num-threads=8 --db-driver=mysql --mysql-socket=/tmp/mysql.sock run

C:IO測試

IO測試,更能體現出innnodb的效能特點,在測試之前要先生成測試檔案,這裡要注意的是,要生成的資料檔案一定要比記憶體大,如果檔案中的資料可以完全放到記憶體中,則作業系統快取就會對大部分資料進行快取,這樣就會導致測試結果無法體現出工作負載。

首先看演示系統中有多少記憶體

free -m   //檢視記憶體使用情況

最大記憶體是 988M,生成大於988M的就足夠

df -lh  //檢視磁碟空間

磁碟空間還有12G可用,進入tmp目錄準備

cd /tmp
sysbench --test=fileio --file-total-size=2G prepare
sysbench 0.5:  multi-threaded system evaluation benchmark
128 files, 16384Kb each, 2048Mb total
Creating files for the test...
Extra file open flags: 0
Creating file test_file.0
Creating file test_file.1
Creating file test_file.2
....
Creating file test_file.122
Creating file test_file.125
Creating file test_file.126
Creating file test_file.127
2147483648 bytes written in 4.80 seconds (426.24 MB/sec).

生成了很多檔案,每個檔案加起來的和就是兩個G。

sysbench  --test=fileio --num-threads=8 --init-rng=on --file-total-size=2G --file-test-mode-rndrw --report-interval=1
run
--num-threads=8//指定測試程式的數量,有多少個程式同時併發的讀寫-8個
--file-test-mode-rndrw//隨機讀寫模式
--report-interval=1//間隔多久輸出一次統計資訊   1秒
--report-interval=1 run
General statistics:
    total time:                          1.1252s
    total number of events:              10000
    total time taken by event execution: 3.7104s
    response time:
         min:                                  0.00ms
         avg:                                  0.37ms
         max:                                 31.83ms
         approx.  95 percentile:               0.19ms
Threads fairness:
    events (avg/stddev):           1250.0000/211.85
    execution time (avg/stddev):   0.4638/0.06

最後清除這些檔案

sysbench --test=fileio --file-total-size=2G cleanup

 

相關文章