下面一起來了解下如何使用sysbench對MySQL實施壓力測試,相信大家看完肯定會受益匪淺,文字在精不在多,希望如何使用sysbench對MySQL實施壓力測試這篇短內(nèi)容是你想要的。
創(chuàng)新互聯(lián)公司是專業(yè)的克拉瑪依區(qū)網(wǎng)站建設公司,克拉瑪依區(qū)接單;提供成都網(wǎng)站設計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行克拉瑪依區(qū)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
出自percona公司,是一款多線程系統(tǒng)壓測工具,可以根據(jù)影響數(shù)據(jù)庫云服務器性能的各種因素來評估系統(tǒng)的性能。例如,可以用來測試文件IO,操作系統(tǒng)調(diào)度器,內(nèi)存分配和傳輸速度,POSIX線程以及數(shù)據(jù)庫云服務器等。sysbench支持Lua腳本語言,Lua對各種測試場景的設置可以非常靈活。sysbench支持MySQL,操作系統(tǒng)和硬件的測試。
安裝:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
使用:
數(shù)據(jù)準備
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/mysql/lib/
. ~/.bash_profile
# 需要啟用DEBUG模式時將下面三行注釋去掉即可
#set -u
#set -x
#set -e
BASEDIR="/data/sysbench" #創(chuàng)建sysbench文件目錄
if [ ! -d $BASEDIR ]
then
mkdir $BASEDIR -p
fi
cd $BASEDIR #進入sysbench文件目錄
# 記錄所有錯誤及標準輸出到 sysbench.log 中
#exec 3>&1 4>&2 1>> sysbench_prepare.log 2>&1
DBIP=192.168.1.109
DBPORT=3109
DBUSER='proxysql'
DBPASSWD='123456'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
TBLCNT=10 #表數(shù)量
WARMUP=300 #預熱時間(秒)
DURING=1800 #持續(xù)時間(秒)
ROWS=10000000 #每個表中插入1KW行數(shù)據(jù)
MAXREQ=1000000 #最大請求數(shù)為100W
#當達到持續(xù)時間或者最大請求數(shù)時,這一輪的測試就會停止
#創(chuàng)建sysbench專用的數(shù)據(jù)庫
echo 'now create db'
mysql -h$DBIP -P$DBPORT -u$DBUSER -p$DBPASSWD -e 'create database sysbench'
echo 'create ok'
## 數(shù)據(jù)準備
echo 'now prepare data'
sysbench /usr/share/sysbench/oltp_read_only.lua \ #必須附加lua腳本才可以初始化數(shù)據(jù)
--mysql-host=$DBIP \
--mysql-port=$DBPORT \
--mysql-user=$DBUSER \
--mysql-password=$DBPASSWD \
--mysql-db=$DBNAME \
--db-driver=mysql \
--tables=10 \
--table-size=$ROWS \
--time=$DURING prepare
壓測開始
#!/bin/bash
##
##
## 葉金榮, 知數(shù)堂培訓聯(lián)合創(chuàng)始人, 資深MySQL專家, MySQL布道師, Oracle MySQL ACE
##
## 幾個注意事項:
## 1、運行sysbench的客戶機和MySQL DB云服務器盡量不要在同一臺主機上,也包括一臺宿主機上啟動兩個虛機的情形;
## 2、測試表的數(shù)量不宜太少,至少要求20個表以上;
## 3、每個表的數(shù)據(jù)量不宜太少,通常至少要求1千萬以上,當然了,也要根據(jù)DB云服務器的配置適當調(diào)整;
## 4、每次進行基準壓測的時長不宜過短,通常要求持續(xù)15分鐘以上;
## 5、每輪測試完畢后,中間至少暫停5分鐘,或者確認系統(tǒng)負載完全恢復空跑狀態(tài)為止;
## 6、測試DB云服務器要是專用的,不能和其他業(yè)務混跑,否則測試結(jié)果就不靠譜了;
## 7、其余未盡事宜,后續(xù)再行補充。
##
## created by yejinrong@zhishutang.com
## 2017/6/3
##
## sysbench項目地址: https://github.com/akopytov/sysbench
##
####################### 2018/02/23 張銳志 ####################################
###葉老師原腳本僅適用于sysbench 0.5版本,sysbench升級到1.0后無法使用,現(xiàn)修改部分語法。
export LD_LIBRARY_PATH=/usr/local/mysql/lib/
. ~/.bash_profile
# 需要啟用DEBUG模式時將下面三行注釋去掉即可
#set -u
#set -x
#set -e
BASEDIR="/data/sysbench"
if [ ! -d $BASEDIR ]
then
mkdir $BASEDIR -p
fi
cd $BASEDIR
#清理之前的遺留記錄
rm -rf $BASEDIR/logs*
# 記錄所有錯誤及標準輸出到 sysbench.log 中
exec 3>&1 4>&2 1>> sysbench.log 2>&1
#時間單位秒
DBIP=192.168.1.109
DBPORT=3109
DBUSER='proxysql'
DBPASSWD='123456'
NOW=`date +'%Y%m%d%H%M'`
DBNAME="sysbench"
REPORT_INTERVAL=1
TBLCNT=10 #表數(shù)量
WARMUP=300 #預熱時間(秒)
DURING=1800 #持續(xù)時間(秒)
ROWS=10000000 #每個表中插入1KW行數(shù)據(jù)
MAXREQ=1000000 #最大請求數(shù)為100W
#當達到持續(xù)時間或者最大請求數(shù)時,這一輪的測試就會停止
# 并發(fā)壓測的線程數(shù),根據(jù)機器配置實際情況進行調(diào)整
THERAD_NUMBER="8 64 128"
#初始次數(shù)
round=0
# 一般至少跑3輪測試,我正常都會跑10輪以上
while [ $round -lt 4 ]
do
#每回合日志位置:
rounddir=$BASEDIR/logs-round${round}
mkdir -p ${rounddir}
for thread in `echo "${THERAD_NUMBER}"`
do
#常用可選項:
#oltp_read_only #只讀
#oltp_read_write #讀寫兼有
#oltp_update_non_index #無主鍵更新情形
sysbench /usr/share/sysbench/oltp_read_only.lua \
--mysql-host=$DBIP \
--mysql-port=$DBPORT \
--mysql-user=$DBUSER \
--mysql-password=$DBPASSWD \
--mysql-db=$DBNAME \
--db-driver=mysql \
--tables=$TBLCNT \
--table-size=$ROWS \
--report-interval=$REPORT_INTERVAL \
--threads=${thread} \
--rand-type=uniform \ #數(shù)據(jù)隨機類型:uniform,均勻的
--time=$DURING run >> ${rounddir}/sysbench_${thread}.log
sleep 300 #不同的線程數(shù)壓測之間停頓5分鐘
done
round=`expr $round + 1`
sleep 300 #每輪壓測之間停頓5分鐘
done
運行完畢后在預設的數(shù)據(jù)目錄下可以找到sysbench輸出的日志。
可以直接閱讀sysbench日志給出的總結(jié),也可以對其中個別項的數(shù)據(jù)進行繪圖觀察趨勢。
SQL statistics:
queries performed:
read: 142870
write: 0
other: 20410
total: 163280
transactions: 10205 (5.66 per sec.)
queries: 163280 (90.53 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 1803.6625s
total number of events: 10205
Latency (ms):
min: 3113.18
avg: 11303.55
max: 24222.47
95th percentile: 16819.24
sum: 115352747.29
Threads fairness:
events (avg/stddev): 159.4531/1.51
execution time (avg/stddev): 1802.3867/1.03
#我使用的是硬件資源十分有限的虛擬機,壓測結(jié)果有點扎心。
安裝gnuplot進行繪圖,gnuplot需要圖形環(huán)境,可以選擇在windows上安裝,也可以在施壓客戶機上安裝圖形界面。這里選擇在linux施壓客戶機上安裝圖形界面。
dnf -y install @xfce-desktop #安裝圖形界面
yum -y install gnuplot #安裝gnuplot
gnuplot #進入gnuplot終端
gnuplot>plot 'output/sysbench_8.log' using 9 w lines title 'QPS'
#using 5 表示使用第5列數(shù)據(jù)作圖
#with lines 定義圖中的趨勢使用線來表示
#title 'QPS' 定義線的名稱
#使用,(逗號)分割,進行多列數(shù)據(jù)的繪制
圖形如下:
通過其他腳本觀察sysbench壓測過程中的系統(tǒng)信息和數(shù)據(jù)庫信息(來源于《高可用 MySQL》)
#!/bin/sh
#開始前獲取全局配置參數(shù)
#每五秒獲取一次cpu load,MySQL全局信息,InnoDB引擎相關信息,線程信息
INTERVAL=5
PREFIX=$INTERVAL-sec-status
RUNFILE=/root/running
mysql -e 'show global variables'>>mysql-variables
#通過檢測 /root/running文件是否存在作為是否進行獲取信息的依據(jù),可以在壓測結(jié)束時刪除此文件停止收集
while test -e $RUNFILE; do
file=$(date +%F_%H)
sleep=$(date +%s.%N |awk "{print $INTERVAL -(\$1 % $INTERVAL)}")
sleep $sleep
ts="$(date +"TS %s.%N %F %T")"
loadavg="$(uptime)" #通過uptime命令獲取cpu load
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\G" >> $PREFIX-${file}-innodbstatus & #獲取引擎信息
echo "$ts $loadavg">> $PREFIX-${file}-processlist
mysql -e "show full processlist\G" >>$PREFIX-${file}-processlist & #獲取線程信息
echo $ts
done
echo Exiting because $RUNFILE not exist
對上一步收集到的全局信息進行分析。
#!/bin/sh
awk '
BEGIN{
printf "#ts date time load QPS";
fmt = " %.2f";
}
/^TS/ { # The timestamp lines begin with 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
}
' "$@"
運行方式:sh hi_anaylyze.sh 5-sec-status-2018-02-22_14_status >>4plot.log
(將分析后的結(jié)果記入4plot.log中)
同樣使用gnupot進行繪圖分析:
gunplot>plot '4plot' using 5 with lines title 'QPS', 4 with lines title 'load'
#using 5 表示使用第5列數(shù)據(jù)作圖
#with lines 定義圖中的趨勢使用線來表示
#title 'QPS' 定義線的名稱
#使用,(逗號)分割,進行多列數(shù)據(jù)的繪制
(兩個圖形的數(shù)據(jù)來源不同,僅作為示例使用。)
看完如何使用sysbench對MySQL實施壓力測試這篇文章后,很多讀者朋友肯定會想要了解更多的相關內(nèi)容,如需獲取更多的行業(yè)信息,可以關注我們的行業(yè)資訊欄目。