什么是基准測試
基准測試是一種測量和評估軟件性能指標的活動用於建立某個時刻的性能基准,以便當系統發生軟硬件變化時重新進行基准測試以及評估變化對性能的影響。
我們可以這樣認為:基准測試是針對系統設置的一種壓力測試。用來觀察系統在不同壓力下的行為,評估系統的容量,觀察系統如何處理不同的數據,但是要注意的是基准測試和通常所說的壓力測試還是有區別的。
基准測試要盡量的直接和簡單,使各個結果之間容易比較,基准測試所使用的數據通常是由測試工具所生成的,只能用於評估服務器的
處理能力;而壓力測試通常是通過真實的業務數據進行測試,以獲得真實的業務系統所能承受的壓力,所以基准測試是簡化了的壓力測試。基准測試給系統帶來的壓力通常只能測量系統的性能,而忽略了系統邏輯的壓力測試。舉例:如果我們要對一個網站進行壓力測試,通過不同的主題來進行,比如購物車流程的壓力測試,我們就要按照購物流程的業務邏輯來設計我們的壓力測試要包括哪些購物流程,所使用的數據和查詢呢也是在整個購物流程中要用到的,而基准測試就不是這樣,比如我們要對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