MySQL基準測試(Sysbench)

基準測試是MySQL新手和專家都必須要掌握地一項基本技能?;鶞蕼y試是針對系統(tǒng)設(shè)計的一種壓力測試。通常的目標(biāo)是為了掌握系統(tǒng)的行為。

基準測試的策略

基準測試有兩種主要的策略:一是針對整個系統(tǒng)的整體測試,另外是單獨測試MySQL。這兩種測試也被稱為集成式以及單組件式基準測試。針對整個系統(tǒng)做集成式測試而不是單獨測試MySQL的原因有以下幾點:

  • 測試整個應(yīng)用系統(tǒng),包括web服務(wù)器、應(yīng)用代碼、網(wǎng)絡(luò)和數(shù)據(jù)庫是非常有用的,因為用戶關(guān)注的并不是MySQL本身的性能,而是應(yīng)用整體的性能。
  • MySQL并非總是應(yīng)用的瓶頸,通過整體的測試可以揭示這一點。
  • 只有對應(yīng)用做整體測試,才能發(fā)現(xiàn)各部分之間的緩存帶來的影響。
  • 整體應(yīng)用的集成式測試更能揭示應(yīng)用的真實表現(xiàn),而單獨組件的測試很難做到這一點。

有時候不需要了解整個應(yīng)用的情況,而只需要關(guān)注MySQL的性能,至少在項目初期可以 這樣做?;谝韵虑闆r,可以選擇只測試MySQL

  • 需要比較不同的schema或查詢的性能
  • 針對應(yīng)用中某個具體的測試
  • 為了避免漫長的基準測試,可以通過一個短期的基準測試,做快速的"周期循環(huán)",來檢測某些調(diào)整后的效果

測試何種指標(biāo)

考慮以下指標(biāo),看看如何滿足測試的需求:

  • 吞吐量
    吞吐量指的是單位時間內(nèi)的事務(wù)處理數(shù)。這一直是經(jīng)典的數(shù)據(jù)庫應(yīng)用測試指標(biāo)。這類基準測試主要針對在線事務(wù)處理OLTP的吞吐量,非常適用于多用戶的交互式應(yīng)用。常見的測試單位是每秒事務(wù)數(shù),有些也采用每分鐘事務(wù)數(shù)。
  • 響應(yīng)時間或者延遲
    這個指標(biāo)用于測試任務(wù)所需的整體時間。根據(jù)具體的應(yīng)用,測試的時間單位可能是微秒、毫秒、秒或者分鐘。根據(jù)不同的時間單位可以計算出平均響應(yīng)時間、最小響應(yīng)時間、最大響應(yīng)時間和所占百分比。最大響應(yīng)時間意義不大,因為測試時間越長,最大響應(yīng)時間也可能越大。而且其結(jié)果通常不可重復(fù),每次測試都可能獲得不同的最大響應(yīng)時間。因此,通??梢允褂冒俜直软憫?yīng)時間來代替最大響應(yīng)時間。例如,如果95%的響應(yīng)時間都是5毫秒,則表示任務(wù)在95%的時間段內(nèi)都可以在5毫秒內(nèi)完成。
  • 并發(fā)性
    并發(fā)性是一個非常重要又經(jīng)常被誤解和誤用的指標(biāo)。例如,它經(jīng)常被表示成多少用戶在同一時間瀏覽一個web站點,經(jīng)常使用的指標(biāo)是有多少個會話。然而,HTTP協(xié)議是無狀態(tài)的,大多數(shù)用戶只是簡單地讀取瀏覽器上顯式地信息,這并不等于web服務(wù)器的并發(fā)性。而且web服務(wù)器的并發(fā)性也不等同于數(shù)據(jù)庫的并發(fā)性,而僅僅只表示會話存儲機制可以處理多少數(shù)據(jù)的能力。web服務(wù)器的并發(fā)性更準確的度量指標(biāo),應(yīng)該是任意時間內(nèi)有多少同時發(fā)生的并發(fā)請求。
    在應(yīng)用的不同緩解都可以測量相應(yīng)的并發(fā)性。web服務(wù)器的高并發(fā),一般也會導(dǎo)致數(shù)據(jù)庫的高并發(fā),但服務(wù)器采用的語言和工具集對此都會有影響。注意不要將創(chuàng)建數(shù)據(jù)庫連接和并發(fā)性搞混淆。一個設(shè)計良好的應(yīng)用,同時可以打開成百上千個MySQL數(shù)據(jù)庫服務(wù)器連接,但可能同時只有少數(shù)連接在執(zhí)行查詢。所以說一個web站點"同時有50000個用戶"訪問,卻可能只有10-15個并發(fā)請求到MySQL數(shù)據(jù)庫
    換句話說,并發(fā)性基準測試需要關(guān)注的是正在工作中的并發(fā)操作,或者是同時工作中的線程數(shù)或者連接數(shù)。當(dāng)并發(fā)增加,需要測量吞吐量是否下降,響應(yīng)時間是否變長,如果是這樣,應(yīng)用可能就無法處理峰值壓力。
    并發(fā)性測試通常不是為了測試應(yīng)用能達到的并發(fā)度,而是為了測試應(yīng)用在不同并發(fā)下的性能??梢酝ㄟ^sysbench指定32、64或者128個線程的測試,然后在測試期間記錄MySQL數(shù)據(jù)庫的Threads_running狀態(tài)值。
  • 可擴展性
    在系統(tǒng)的業(yè)務(wù)壓力可能發(fā)生變化的情況下,測試可擴展性就非常必要了??蓴U展性指的是,給系統(tǒng)增加一倍的工作,在理想情況下就能獲得兩倍的結(jié)果(即吞吐量增加一倍)。或者說,給系統(tǒng)增加一倍的資源就可以獲得兩倍的吞吐量。同時性能也必須在可以接收的范圍內(nèi)。大多數(shù)系統(tǒng)是無法做到如此理想的線性擴展的。隨著壓力的變化,吞吐量和性能都可能越來越差。
    可擴展性指標(biāo)對于容量規(guī)范非常有用,它可以提供其他測試無法提供的信息,來幫助發(fā)現(xiàn)應(yīng)用的瓶頸。

歸根結(jié)底,應(yīng)該測試那些對用戶來說最重要的指標(biāo)。因此應(yīng)該盡可能地去收集一些需求,比如,什么樣地響應(yīng)時間是可以接受的,期待多少的并發(fā)性,等等。然后基于這些需求來設(shè)計基準測試,避免目光短淺地只關(guān)注部分指標(biāo),而忽略其他指標(biāo)。

sysbench

sysbench可以執(zhí)行多種類型的基準測試,它不僅設(shè)計用來測試數(shù)據(jù)庫的性能,也可以測試運行數(shù)據(jù)庫的服務(wù)器的性能。

sysbench的基本語法

sysbench [options]... [testname] [command]
  • 命令
    command是sysbench要執(zhí)行的命令,包括prepare,run和cleanup,顧名思義,prepare是為測試預(yù)先準備數(shù)據(jù),run是執(zhí)行正式的測試,cleanup是在測試完成后對數(shù)據(jù)庫進行清理。
  • 測試名
    testname指定了要進行的測試,在老版本的sysbench中,可以通過–test參數(shù)指定測試的腳本;而在新版本中,–test參數(shù)已經(jīng)聲明為廢棄,可以不使用–test,或者直接指定腳本。

例如,如下兩種方法效果是一樣的:

sysbench --test=/usr/share/sysbbench/tests/include/oltp_legacy/oltp.lua
sysbench /usr/share/sysbbench/tests/include/oltp_legacy/oltp.lua

yum安裝的sysbench的測試腳本默認在/usr/share/sysbench下面及其下面的文件夾

  • 選項
    sysbench的參數(shù)有很多,其中常見的包括
--mysql-host:MySQL服務(wù)器主機名,默認localhost;如果在本機上使用localhost報錯,提示無法連接MySQL服務(wù)器,改成本機的IP地址應(yīng)該就可以了。
--mysql-port:MySQL服務(wù)器端口,默認3306
--mysql-user:用戶名
--mysql-password:密碼
--mysql-db=test    在test這個數(shù)據(jù)庫進行測試,默認sbtest
--mysql-socket=/data/mysql/datanode1/node1.soc 指定socket

MySQL執(zhí)行參數(shù)

--oltp-test-mode:執(zhí)行模式,包括simple、nontrx和complex,默認是complex。simple模式下只測試簡單的查詢;nontrx不僅測試查詢,還測試插入更新等,但是不使用事務(wù);complex模式下測試最全面,會測試增刪改查,而且會使用事務(wù)。可以根據(jù)自己的需要選擇測試模式。
--oltp-tables-count:測試的表數(shù)量,根據(jù)實際情況選擇
--oltp-table-size:測試的表的大小,根據(jù)實際情況選擇
--oltp-read-olny=off  讀寫混合
--threads:客戶端的并發(fā)連接數(shù)
--time:測試執(zhí)行的時間,單位是秒,該值不要太短,可以選擇120
--report-interval:生成報告的時間間隔,單位是秒,如10
--max-requests=0   設(shè)置最大請求,0為不限制,想多少請求都可以,在限定的時間內(nèi)
--percentile=99   去簽名99%的數(shù)據(jù)進行分析

sysbench的CPU基準測試

服務(wù)器的CPU配置如下

[root@cy ~]# cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 79
model name  : Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
stepping    : 1
microcode   : 0x1
cpu MHz     : 2394.456
cache size  : 35840 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes

在這臺服務(wù)器上運行如下的測試

[root@cy ~]# sysbench --test=cpu --cpu-max-prime=20000 run

Threads started!

CPU speed:
    events per second:   295.01

General statistics:
    total time:                          10.0008s
    total number of events:              2951

Latency (ms):
         min:                                    3.27
         avg:                                    3.39
         max:                                   11.17
         95th percentile:                        3.55
         sum:                                 9994.76

Threads fairness:
    events (avg/stddev):           2951.0000/0.00
    execution time (avg/stddev):   9.9948/0.00

第二臺服務(wù)器配置

[root@iZniul0kz47rtgZ ~]# cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 85
model name  : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
stepping    : 7
microcode   : 0x1
cpu MHz     : 2500.002
cache size  : 36608 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 22
wp      : yes

執(zhí)行測試

[root@iZniul0kz47rtgZ ~]# sysbench --test=cpu --cpu-max-prime=20000 run

CPU speed:
    events per second:   343.75

General statistics:
    total time:                          10.0024s
    total number of events:              3439

Latency (ms):
         min:                                    2.78
         avg:                                    2.91
         max:                                   23.83
         95th percentile:                        2.97
         sum:                                 9999.19

Threads fairness:
    events (avg/stddev):           3439.0000/0.00
    execution time (avg/stddev):   9.9992/0.00

可以看到CPU運行速度第二臺服務(wù)器比第一臺要快

sysbench的文件IO測試

文件IO基準測試可以測試系統(tǒng)在不同IO負載下的性能。這對于比較不同的磁盤驅(qū)動器、RAID卡、不同的RAID模式,都很有幫助??梢愿鶕?jù)測試結(jié)果來調(diào)整IO子系統(tǒng)。文件IO基準測試模擬了很多InnoDB的IO特性

測試第一步是準備階段,生成測試用到的數(shù)據(jù)文件,生成的數(shù)據(jù)文件至少比內(nèi)存大。如果文件中的數(shù)據(jù)能完全放入內(nèi)存中,則操作系統(tǒng)緩存大部分的數(shù)據(jù),導(dǎo)致測試結(jié)果無法體現(xiàn)IO密集型的工作負載

首先創(chuàng)建一個數(shù)據(jù)集

[root@cy ~]# sysbench --test=fileio --file-total-size=30G prepare

這個命令會在當(dāng)前工作目錄下創(chuàng)建測試文件,后續(xù)的運行階段將通過讀寫這些文件進行測試
針對不同的IO類型有不同的測試選項
seqwr:順序?qū)懭?br> seqrewr:順序重寫
seqrd:順序讀取
rndrd:隨機讀取
rndwr:隨機寫入
rdnrw:混合隨機讀/寫
下面的命令運行文件IO混合隨機讀/寫基準測試

[root@cy ~]# sysbench --test=fileio --file-total-size=30G --file-test-mode=rndrw --max-time=300 --max-requests=0 run

得到的結(jié)果

File operations:
    reads/s:                      902.00
    writes/s:                     601.34
    fsyncs/s:                     1924.64

Throughput:
    read, MiB/s:                  14.09
    written, MiB/s:               9.40

General statistics:
    total time:                          300.0067s
    total number of events:              1028295

Latency (ms):
         min:                                    0.00
         avg:                                    0.29
         max:                                 1949.82
         95th percentile:                        0.73
         sum:                               298892.25

Threads fairness:
    events (avg/stddev):           1028295.0000/0.00
    execution time (avg/stddev):   298.8922/0.00

測試完成后,運行清除操作,刪除第一步生成的測試文件

[root@cy ~]# sysbench --test=fileio --file-total-size=30G cleanup

sysbench MySQL基準測試

生成3張表,每個表插入100000條數(shù)據(jù)

[root@cy ~]# sysbench  /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --table_size=100000 --threads=20 --oltp-tables-count=3  --mysql-db=test --mysql-user=root --mysql-host=106.13.177.139 --mysql-password=123.com prepare

數(shù)據(jù)測試

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=100000 --oltp-tables-count=3 --mysql-db=test --mysql-user=root --mysql-host=106.13.177.139 --mysql-password=123.com --time=60 --max-requests=0 --threads=8 --report-interval=10 run

--threads=8     //線程數(shù)為8
--time=60       //測試時間為60s
--report-interval=10  //報告打印周期為10s,每10s打印一次
--oltp-read-only=off  //非只讀操作測試

測試結(jié)果

[ 10s ] thds: 8 tps: 92.57 qps: 1896.81 (r/w/o: 1332.89/119.86/444.06) lat (ms,95%): 253.35 err/s: 1.90 reconn/s: 0.00
[ 20s ] thds: 8 tps: 23.90 qps: 477.92 (r/w/o: 334.41/38.90/104.60) lat (ms,95%): 893.56 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 8 tps: 24.00 qps: 478.80 (r/w/o: 335.00/42.60/101.20) lat (ms,95%): 1032.01 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 8 tps: 26.60 qps: 531.20 (r/w/o: 371.60/53.20/106.40) lat (ms,95%): 1304.21 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 8 tps: 21.30 qps: 427.00 (r/w/o: 298.90/41.70/86.40) lat (ms,95%): 1235.62 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 8 tps: 18.50 qps: 368.40 (r/w/o: 257.70/40.90/69.80) lat (ms,95%): 1453.01 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            29344
        write:                           3390
        other:                           9148
        total:                           41882
    transactions:                        2077   (32.16 per sec.)
    queries:                             41882  (648.45 per sec.)
    ignored errors:                      19     (0.29 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          64.5861s
    total number of events:              2077

Latency (ms):
         min:                                   10.06
         avg:                                  235.33
         max:                                 7159.95
         95th percentile:                     1013.60
         sum:                               488775.18

Threads fairness:
    events (avg/stddev):           259.6250/35.75
    execution time (avg/stddev):   61.0969/1.45

queries:查詢總數(shù)及qps

transactions:事務(wù)總數(shù)及tps

Latency-95th percentile:前95%的請求的最大響應(yīng)時間,本例中是1013毫秒,這個延遲非常大,是因為我用的MySQL服務(wù)器性能很差;在正式環(huán)境中這個數(shù)值是絕對不能接受的。

清除數(shù)據(jù)

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-tables-count=3 --oltp-table-size=100000 --mysql-user=root --mysql-host=106.13.177.139 --mysql-password=123.com --mysql-db=test cleanup

sysbench的其他特性

  • 內(nèi)存
    測試內(nèi)存的連續(xù)讀寫性能
  • 線程
    測試線程調(diào)度器的性能。對于高負載情況下測試線程調(diào)度器的行為非常有用。
  • 互斥鎖
    測試互斥鎖的性能,方式是模擬所有線程在同一時刻并發(fā)運行,并都短暫請求互斥鎖(互斥鎖mutex是一種數(shù)據(jù)結(jié)構(gòu),用來對某些資源進行排他性訪問控制,防止因并發(fā)訪問導(dǎo)致問題)。
  • 順序?qū)?br> 測試順序?qū)懙男阅?。這對于測試系統(tǒng)的實際性能瓶頸很重要??梢杂脕頊y試RAID控制器的高速緩存的性能狀況。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容