基準測試是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控制器的高速緩存的性能狀況。