一、基準測試
基準測試(benchmark)是針對系統(tǒng)設計的一種壓力測試。
基準測試是簡化了的壓力測試。
1.1 常見指標
- TPS
- QPS
- 響應時間
- 并發(fā)量
1.2 收集與分析數(shù)據(jù)腳本
收集數(shù)據(jù)的shell腳本gather.sh
#!/bin/sh
INTERVAL=5
PREFIX=$INTERVAL-sec-status
RUNFILE=/home/benchmarks/running
mysql -e 'SHOW GLOBAL VARIABLES' >> mysql-variables
while test -e $RUNFILE; do
file=$(date +%F_%I)
sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
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 &
echo "$ts $loadavg" >> $PREFIX-${file}-innodbstatus
mysql -e 'show engine innodb status;' >> $PREFIX-${file}-innodbstatus &
echo "$ts $loadavg" >> $PREFIX-${file}-processlist
mysql -e 'show full processlist;' >> $PREFIX-${file}-processlist &
echo $ts
done
echo Exiting because $RUNFILE does not exist.
分析數(shù)據(jù)腳本analyze.sh
#!/bin/sh
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;
prev_ts = ts;
printf "\n%s %s %s %s", ts, $3, $4, substr($load, 1, length($load) - 1);
}
/Queries/ {
printf fmt, ($2-Queries)/diff;
Queries=$2;
}
' "$@"
二、基準測試工具
2.1 mysqlslap
常用參數(shù)
# mysqlslap --help
--auto-generate-sql 由系統(tǒng)自動生成SQL腳本進行測試
--auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
--auto-generate-sql-load-type=name 指定測試中使用的查詢類型
--auto-generate-sql-execute-number= 指定初始化數(shù)據(jù)時生成的數(shù)據(jù)量
--concurrency= 指定并發(fā)線程的數(shù)量
--engine 指定要測試表的存儲引擎,可以用逗號分割多個存儲引擎
--no-drop 指定不清理測試數(shù)據(jù)
--iterations 指定測試運行的次數(shù)
--number-of-queries 指定每一個線程執(zhí)行的查詢數(shù)量
--debug-info 指定輸出額外的內存及CPU統(tǒng)計信息
--number-int-cols 指定測試表中包含的INT類型列的數(shù)量
--number-char-cols 指定測試表中包含的varchar類型的數(shù)量
--create-schema 指定了用于執(zhí)行測試的數(shù)據(jù)庫的名字
--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=test \
> 1.txt
測試結果
[root@mysql211 ~]# cat 1.txt
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.001 seconds
Minimum number of seconds to run all queries: 0.001 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.043 seconds
Minimum number of seconds to run all queries: 0.037 seconds
Maximum number of seconds to run all queries: 0.052 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.082 seconds
Minimum number of seconds to run all queries: 0.082 seconds
Maximum number of seconds to run all queries: 0.084 seconds
Number of clients running queries: 100
Average number of queries per client: 0
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.245 seconds
Minimum number of seconds to run all queries: 0.245 seconds
Maximum number of seconds to run all queries: 0.246 seconds
Number of clients running queries: 200
Average number of queries per client: 0
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.007 seconds
Minimum number of seconds to run all queries: 0.002 seconds
Maximum number of seconds to run all queries: 0.010 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: 0.229 seconds
Minimum number of seconds to run all queries: 0.212 seconds
Maximum number of seconds to run all queries: 0.238 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: 0.519 seconds
Minimum number of seconds to run all queries: 0.471 seconds
Maximum number of seconds to run all queries: 0.555 seconds
Number of clients running queries: 100
Average number of queries per client: 0
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.849 seconds
Minimum number of seconds to run all queries: 0.767 seconds
Maximum number of seconds to run all queries: 0.909 seconds
Number of clients running queries: 200
Average number of queries per client: 0
[root@mysql211 ~]#
2.2 sysbench 0.5
下載
# MySQL上找到的版本太低
# https://dev.mysql.com/downloads/benchmarks.html
wget https://downloads.mysql.com/source/sysbench-0.4.12.14.tar.gz
# https://github.com/akopytov/sysbench/releases
wget https://github.com/akopytov/sysbench/archive/1.0.13.tar.gz
wget https://github.com/akopytov/sysbench/archive/0.5.zip
安裝,參照解壓后的README.md
# 解壓 解壓后目錄為 ~/sysbench-0.5
unzip sysbench-0.5.zip
cd sysbench-0.5
# 運行后沒報錯就可以繼續(xù)
./autogen.sh
# 配置
./configure \
--with-mysql-includes=/usr/local/mysql/include \
--with-mysql-libs=/usr/local/mysql/lib
# 編譯安裝
make && make install
常用參數(shù)
sysbench --help
--test 用于指定所要執(zhí)行的測試類型,支持以下參數(shù)
fileio - File I/O test 文件系統(tǒng)I/O性能測試
cpu - CPU performance test CPU性能測試
memory - Memory functions speed test 內存性能測試
threads - Threads subsystem performance test
mutex - Mutex performance test
Oltp測試要指定具體的lua腳本
Lua腳本位于sysbench-0.5/sysbench/tests/db
--mysql-db 用于指定執(zhí)行基準測試的數(shù)據(jù)庫名
--mysql-table-engine 用于指定所使用的存儲引擎
--oltp-tables-count 執(zhí)行測試的表的數(shù)量
--oltp-table-size 指定每個表中的數(shù)據(jù)行數(shù)
--num-threads 指定測試的并發(fā)線程數(shù)量
--max-time 指定最大的測試時間
--report-interval 指定間隔多長時間輸出一次統(tǒng)計信息
--mysql-user 指定執(zhí)行測試的MySQL用戶
--mysql-password 指定執(zhí)行測試的MySQL用戶的密碼
prepare 用于準備測試數(shù)據(jù)
run 用于實際進行測試
cleanup 用于清理測試數(shù)據(jù)
測試CPU
sysbench --test=cpu --cpu-max-prime=1000 run
測試磁盤I/O
# free -m看內存
sysbench --test=fileio --file-total-size=1G prepare
# 查看相關參數(shù)
sysbench --test=fileio --help
# 測試
sysbench --test=fileio \
--num-threads=8 \
--init-rng=on \
--file-total-size=1G \
--file-test-mode=rndrw \
--report-interval=1 \
run
2.3 sysbench 測試數(shù)據(jù)庫
創(chuàng)建庫和表
create database dbtest;
grant all privileges on *.* to dbtest@'localhost' identified by '123456';
準備生成表和數(shù)據(jù)
# 進入腳本目錄
cd ~/root/sysbench-0.5/sysbench/tests/db
# 查看腳本
ls -l *.lua
# 準備
sysbench --test=./oltp.lua \
--mysql-table-engine=innodb \
--oltp-table-size=10000 \
--mysql-db=dbtest \
--mysql-user=dbtest \
--mysql-password=123456 \
--oltp-tables-count=10 \
--mysql-socket=/tmp/mysql.sock \
prepare
運行收集測試數(shù)據(jù)的腳本 gather.sh
# 創(chuàng)建腳本需要的目錄
mkdir /home/benchmarks && cd /home/benchmarks
# 將gather.sh腳本放在上述目標,并創(chuàng)建running
touch running
# 后臺運行
sh gather.sh &
進行基準測試
# 運行
sysbench --test=./oltp.lua \
--mysql-table-engine=innodb \
--oltp-table-size=10000 \
--mysql-db=dbtest \
--mysql-user=dbtest \
--mysql-password=123456 \
--oltp-tables-count=10 \
--mysql-socket=/tmp/mysql.sock \
run
測試結束后,運行分析數(shù)據(jù)的腳本 analyze.sh
# 查看獲取的數(shù)據(jù)
[root@mysql211 benchmarks]# ll -h 5*
-rw-r--r--. 1 root root 124K Mar 12 16:41 5-sec-status-2018-03-12_04-innodbstatus
-rw-r--r--. 1 root root 11K Mar 12 16:41 5-sec-status-2018-03-12_04-processlist
-rw-r--r--. 1 root root 236K Mar 12 16:41 5-sec-status-2018-03-12_04-status
# 分析這些數(shù)據(jù) analyze.sh 文件名
sh analyze.sh /home/benchmarks/5-sec-status-2018-03-12_04-innodbstatus
三、參考
- 《高性能MySQL(第三版)》第二章