您好,登錄后才能下訂單哦!
當我們對數(shù)據(jù)庫進行優(yōu)化后,只有進行測量系統(tǒng)性能才能知道優(yōu)化是否有效,這種測量的方式就是基準測試。基準測試的定義如下:
基準測試是一種測量和評估軟件性能指標的活動用于建立某個時刻的性能基準,以便當系統(tǒng)發(fā)生軟/硬件變化時,重新進行基準測試以評估變化對性能的影響
我們可以這樣認為:
基準測試是針對系統(tǒng)設置的一種壓力測試,可以用來觀察系統(tǒng)在不同壓力下的行為。評估系統(tǒng)的容量,觀察系統(tǒng)如何處理不同的數(shù)據(jù)。
但是基于測試不等同于壓力測試:
對MySQL進行基準測試的目的:
通常來說,基準測試有兩種方式:
MySQL基準測試的常見指標:
基準測試中容易忽略的問題:
基準測試的步驟:
基準測試數(shù)據(jù)的收集腳本:
#!/bin/bash
# 腳本的運行間隔
INTERVAL=5
# 創(chuàng)建數(shù)據(jù)文件的存儲目錄
STORE_DIR=/home/mysql/benchmarks
mkdir -p $STORE_DIR
# 將收集的數(shù)據(jù)存儲到哪個目錄下,以及文件前綴
PREFIX=$STORE_DIR/$INTERVAL-sec-status
# 設置腳本的運行標識
RUNFILE=$STORE_DIR/running
touch $RUNFILE && echo "1" > $RUNFILE
# mysql的用戶名和密碼
USER=root
PWD=123456
# mysql命令所在的路徑
MYSQL="/usr/local/mysql/bin/mysql -u$USER -p$PWD"
# 記錄當前mysql的全局變量
$MYSQL -e "show global variables" >> mysql-variables
# 運行標識文件存在就會一直循環(huán)
while test -e $RUNFILE; do
# 定義腳本運行時的當前時間
file=$(date +%F_%I)
# 實現(xiàn)間隔運行該循環(huán)
sleep=$(date +%s.%N | awk '{print 5 - ($1 % 5)}')
sleep $sleep
ts="$(date +"TS %s.%N %F %T")"
# 獲取系統(tǒng)負載信息
loadavg="$(uptime)"
# 記錄系統(tǒng)負載信息
echo "$ts $loadavg" >> $PREFIX-${file}-status
# 記錄當前mysql的全局變量信息
$MYSQL -e "show global status" >> $PREFIX-${file}-status &
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
# 記錄當前 innodb 的狀態(tài)信息
$MYSQL -e "show engine innodb status" >> $PREFIX-${file}-innodbstatus &
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
# 記錄當前mysql全部連接信息列表
$MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist &
echo $ts
done
echo Exiting because $RUNFILE does not exists
測試數(shù)據(jù)分析腳本:
#!/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",ts,$3,$4,substr($load,1,length($load)-1);
prev_ts=ts;
}
/Queries/{
printf fmt,($2-Queries)/diff;
Queries=$2
}
' "$@"
### 使用示例 ###
# sh ./analyze.sh ${測試數(shù)據(jù)文件路徑}
# 如:sh ./analyze.sh /home/mysql/benchmarks/5-sec-status-2020-01-11_04-status
一般來說,我們都不會自己去編寫基準測試的腳本,因為都有現(xiàn)成的工具。例如,mysql 5.1以上版本都自帶了mysqlslap這個基準測試工具。由于是自帶的也無需進行單獨的安裝,該工具位于mysql的bin
目錄下。
功能簡介:
常用參數(shù)說明:
參數(shù) | 說明 |
---|---|
--concurrency |
并發(fā)數(shù)量,即模擬的客戶端數(shù)量,可以指定多個,使用逗號分隔 |
--iterations |
指定測試的運行次數(shù) |
--auto-generate-sql |
使用系統(tǒng)自動生成的SQL腳本來進行測試 |
--auto-generate-sql-add-autoincrement |
在自動生成的表中增加自增ID |
--auto-generate-sql-load-type |
指定測試中使用的查詢類型(取值:read, write, update, mixed),默認mixed |
--auto-generate-sql-write-number |
指定初始化數(shù)據(jù)時所生成的數(shù)據(jù)量 |
--engine |
要測試表的存儲引擎,允許指定多個,使用逗號分隔 |
--no-drop |
指定不清理測試數(shù)據(jù) |
--number-of-queries |
指定每一個連接執(zhí)行的查詢次數(shù) |
--debug-info |
指定輸出額外的內存及CPU統(tǒng)計信息 |
--number-char-cols |
指定測試表中包含的int 類型的數(shù)量 |
--number-int-cols |
指定測試表中包含的varchar 類型的數(shù)量 |
--create-schema |
指定用于執(zhí)行測試的數(shù)據(jù)庫的名稱 |
--query |
用于指定自定義的SQL腳本 |
--only-print |
指定該參數(shù)時,不會運行測試腳本,而是把生成的腳本打印出來 |
使用示例:
[root@localhost ~]# mysqlslap -uroot -p123456 --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=test
運行該測試后,截取的部分輸出片段如下:
Benchmark
# 運行的是myisam引擎的測試
Running for engine myisam
# 運行所有查詢的平均秒數(shù)
Average number of seconds to run all queries: 0.020 seconds
# 運行所有查詢的最小秒數(shù)
Minimum number of seconds to run all queries: 0.018 seconds
# 運行所有查詢的最大秒數(shù)
Maximum number of seconds to run all queries: 0.022 seconds
# 運行查詢的客戶端數(shù)
Number of clients running queries: 1
# 每個客戶端的平均查詢數(shù)
Average number of queries per client: 10
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.049 seconds
Minimum number of seconds to run all queries: 0.042 seconds
Maximum number of seconds to run all queries: 0.059 seconds
Number of clients running queries: 1
Average number of queries per client: 10
除了 mysqlslap 這個mysql自帶的基準測試工具之外,還有一個常用的工具就是 sysbench。sysbench的功能比mysqlslap更多一些,能測試的點也更全面一些。sysbench除了可以測試MySQL外,還能測試系統(tǒng)的CPU、IO、內存等方面。
sysbench的GitHub倉庫地址及源碼安裝文檔如下:
一般系統(tǒng)中不會自帶sysbench工具,需要我們自行安裝,我這里采用源碼編譯安裝的方式進行安裝。首先到如下地址復制源碼包的下載鏈接:
然后到Linux上使用wget
命令進行下載:
[root@txy-server ~]# cd /usr/local/src
[root@txy-server /usr/local/src]# wget https://github.com/akopytov/sysbench/archive/1.0.19.tar.gz
安裝編譯sysbench時所依賴的一些庫:
[root@txy-server /usr/local/src]# yum -y install make automake libtool pkgconfig libaio-devel mariadb-devel openssl-devel
接著將下載好的源碼包進行解壓縮,并進入到解壓后的目錄:
[root@txy-server /usr/local/src]# tar -zxvf 1.0.19.tar.gz
[root@txy-server /usr/local/src]# cd sysbench-1.0.19/
最后參考以下步驟完成編譯安裝:
[root@txy-server /usr/local/src/sysbench-1.0.19]# ./autogen.sh
[root@txy-server /usr/local/src/sysbench-1.0.19]# ./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib
[root@txy-server /usr/local/src/sysbench-1.0.19]# make && make install
等待完成編譯安裝后,測試是否安裝成功。我這里報了個找不到庫文件的錯誤:
[root@txy-server /usr/local/src/sysbench-1.0.19]# sysbench --version
sysbench: error while loading shared libraries: libmysqlclient.so.21: cannot open shared object file: No such file or directory
解決方式是建立一個該文件的軟連接到/usr/lib64/
目錄下:
[root@txy-server /usr/local/src/sysbench-1.0.19]# ln -s /usr/local/mysql/lib/libmysqlclient.so.21 /usr/lib64/
再次測試,執(zhí)行成功:
[root@txy-server /usr/local/src/sysbench-1.0.19]# sysbench --version
sysbench 1.0.19
sysbench的命令格式如下:
sysbench [options]... [testname] [command]
1、options,是指定測試參數(shù),以下是使用sysbench測試MySQL時常用的參數(shù):
--mysql-db
:用于指定基準測試的數(shù)據(jù)庫名稱,該數(shù)據(jù)庫必須是已存在的--mysql_storage_engine
:指定測試的MySQL存儲引擎--tables
:執(zhí)行測試的表的數(shù)量--table_size
:指定每個表中的數(shù)據(jù)量--threads
:指定測試的并發(fā)線程數(shù)量--max-time
:指定最大測試時間,單位為秒--report-interval
:指定間隔多長時間就輸出一次統(tǒng)計信息,單位為秒--mysql-socket
:指定mysql的.sock
文件路徑,用于連接mysql--mysql-user
:指定用于測試時連接mysql的用戶--mysql-password
:指定mysql用戶的密碼2、testname,是指定內置的測試類型或測試腳本。內置的測試類型有如下取值:
fileio
:測試文件系統(tǒng)I/O性能cpu
:測試cpu性能memory
:測試內存性能threads
:測試線程性能mutex
:測試互斥鎖性能sysbench [testname] help
,可以查看各個測試類型所支持的參數(shù)除內置測試類型以外的測試,就需要指定測試腳本。sysbench的測試腳本需要使用lua語言編寫,可以根據(jù)實際需求編寫自已的測試腳本,也可以使用sysbench自帶的測試腳本。sysbench自帶的lua腳本如下:
[root@txy-server ~]# ls /usr/local/share/sysbench
bulk_insert.lua # 用于測試大量的insert操作性能
oltp_common.lua # 公共文件,給其他腳本引用的,不可直接使用
oltp_delete.lua # 用于測試oltp下的delete操作性能
oltp_insert.lua # 用于測試oltp下的insert操作性能
oltp_point_select.lua # 用于測試oltp下的定點查詢性能,例如根據(jù)主鍵查詢
oltp_read_only.lua # 用于測試oltp下的只讀性能
oltp_read_write.lua # 用于測試oltp下的讀寫性能
oltp_update_index.lua # 用于測試更新索引字段的性能
oltp_update_non_index.lua # 用于測試更新無索引字段操作的性能
oltp_write_only.lua # 用于測試oltp下的寫操作性能
select_random_points.lua # 用于測試隨機定點查詢的性能
select_random_ranges.lua # 用于測試隨機范圍讀取的性能
...
3、command,則是指定一些測試操作,例如運行測試、清除數(shù)據(jù)或準備數(shù)據(jù)等:
prepare
:用于測試開始前準備測試數(shù)據(jù)run
:用于測試數(shù)據(jù)準備完成后,執(zhí)行測試cleanup
:用于測試執(zhí)行完成后清理測試數(shù)據(jù)以下命令可以讓cpu找出10000以內的素數(shù),并統(tǒng)計計算所需耗時,以此得知cpu的性能。需要注意的是,這種方式測試的是單核心性能,而非多核性能:
[root@txy-server ~]# sysbench --cpu-max-prime=10000 cpu run
測試結果如下:
# CPU速度
CPU speed:
# 每秒事件數(shù)
events per second: 1039.79
General statistics:
# 計算出所有素數(shù)的總耗時
total time: 10.0005s
# 總的事件數(shù)
total number of events: 10400
Latency (ms):
# 計算出一個素數(shù)的最低耗時
min: 0.94
# 平均計算出一個素數(shù)的耗時
avg: 0.96
# 計算出一個素數(shù)的最長耗時
max: 9.43
# 95%情況是1.01毫秒計算出一個素數(shù)
95th percentile: 1.01
# 合計耗時
sum: 9994.05
# 線程公平性
Threads fairness:
events (avg/stddev): 10400.0000/0.00
execution time (avg/stddev): 9.9941/0.00
測試I/O性能需要先準備測試數(shù)據(jù),測試數(shù)據(jù)的大小需要大于物理內存。命令如下:
# 該命令會生成127個測試文件,這些文件合計4G大小
[root@txy-server ~]# sysbench --file-total-size=4G fileio prepare
...
Creating file test_file.125
Creating file test_file.126
Creating file test_file.127
4294967296 bytes written in 39.00 seconds (105.04 MiB/sec).
[root@txy-server ~]#
數(shù)據(jù)準備好后,執(zhí)行測試:
[root@txy-server ~]# sysbench --threads=8 --file-total-size=4G --file-test-mode=rndrw --report-interval=1 fileio run
參數(shù)說明:
--threads=8
:設置并發(fā)線程數(shù)為8--file-test-mode=rndrw
:指定文件測試模式為隨機讀寫,即測試磁盤I/O的隨機讀寫性能--report-interval=1
:指定每秒輸出一次統(tǒng)計信息測試結果如下:
File operations:
reads/s: 2089.75
writes/s: 1392.67
fsyncs/s: 4553.64
Throughput:
# 每秒讀取
read, MiB/s: 32.65
#
written, MiB/s: 21.76
General statistics:
total time: 10.0778s
total number of events: 79973
Latency (ms):
min: 0.00
avg: 1.00
max: 58.42
95th percentile: 3.13
sum: 79895.62
Threads fairness:
events (avg/stddev): 9996.6250/43.23
execution time (avg/stddev): 9.9870/0.01
最后執(zhí)行cleanup
操作,清除測試數(shù)據(jù):
[root@txy-server ~]# sysbench --file-total-size=4G fileio cleanup
由于sysbench內置的測試類型沒有MySQL,所以在使用sysbench測試MySQL時,testname需要指定為測試腳本的路徑。sysbench自帶了一些MySQL的測試腳本,所以無特殊需求的情況下,我們也無需自己去編寫測試腳本。接下來,進行一個簡單的演示,看看如何使用測試腳本來測試MySQL的性能。
首先也是需要準備數(shù)據(jù),命令如下:
[root@txy-server ~]# sysbench --mysql_storage_engine=innodb --table_size=10000 --mysql-db=test --tables=10 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-password=123456 /usr/local/share/sysbench/oltp_read_write.lua prepare
執(zhí)行測試:
[root@txy-server ~]# sysbench --mysql_storage_engine=innodb --table_size=10000 --mysql-db=test --tables=10 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-password=123456 /usr/local/share/sysbench/oltp_read_write.lua run
測試結果如下:
SQL statistics:
queries performed:
# 讀取操作的總數(shù)
read: 10444
# 寫操作的總數(shù)
write: 2984
# 其他操作的總數(shù),例如commit等
other: 1492
# 總共執(zhí)行的操作數(shù)量
total: 14920
# 每秒執(zhí)行的事務數(shù),即TPS,這里為每秒74.48次
transactions: 746 (74.48 per sec.)
# 每秒查詢的數(shù)量,即QPS,這里為每秒1489.53次
queries: 14920 (1489.53 per sec.)
# 忽略的錯誤次數(shù)
ignored errors: 0 (0.00 per sec.)
# 重連次數(shù)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 10.0150s
total number of events: 746
Latency (ms):
min: 8.86
avg: 13.42
max: 99.97
95th percentile: 20.00
sum: 10009.79
Threads fairness:
events (avg/stddev): 746.0000/0.00
execution time (avg/stddev): 10.0098/0.00
同樣,最后需要清理測試數(shù)據(jù):
[root@txy-server ~]# sysbench --mysql_storage_engine=innodb --table_size=10000 --mysql-db=test --tables=10 --mysql-socket=/tmp/mysql.sock --mysql-user=root --mysql-password=123456 /usr/local/share/sysbench/oltp_read_write.lua cleanup
如果想要知道測試腳本具體支持哪些參數(shù),其查看方式和內置測試類型是一樣的,只不過把測試類型的名稱換成了腳本而已:
[root@txy-server ~]# sysbench /usr/local/share/sysbench/oltp_read_write.lua help
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。