【MySQL】【壓測】使用sysbench對MySQL進行壓力測試

來源:互聯網
上載者:User

標籤:請求   記憶體配置   tran   oracle   var   適用於   $2   硬體   index   

1.背景

? 出自percona公司,是一款多線程系統壓測工具,可以根據影響資料庫伺服器效能的各種因素來評估系統的效能。例如,可以用來測試檔案IO,作業系統調度器,記憶體配置和傳輸速度,POSIX線程以及資料庫伺服器等。sysbench支援Lua指令碼語言,Lua對各種測試情境的設定可以非常靈活。sysbench支援MySQL,作業系統和硬體的測試。

2.安裝與使用

安裝:

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashsudo yum -y install sysbench

使用:

? 資料準備

#!/bin/shexport LD_LIBRARY_PATH=/usr/local/mysql/lib/. ~/.bash_profile# 需要啟用DEBUG模式時將下面三行注釋去掉即可#set -u#set -x#set -eBASEDIR="/data/sysbench"    #建立sysbench檔案目錄if [ ! -d $BASEDIR ]then   mkdir $BASEDIR -pficd $BASEDIR                 #進入sysbench檔案目錄# 記錄所有錯誤及標準輸出到 sysbench.log 中#exec 3>&1 4>&2 1>> sysbench_prepare.log 2>&1DBIP=192.168.1.109DBPORT=3109DBUSER=‘proxysql‘DBPASSWD=‘123456‘NOW=`date +‘%Y%m%d%H%M‘`DBNAME="sysbench"TBLCNT=10           #表數量WARMUP=300          #預熱時間(秒)DURING=1800         #期間(秒)ROWS=10000000       #每個表中插入1KW行資料MAXREQ=1000000      #最大請求數為100W#當達到期間或者最大請求數時,這一輪的測試就會停止#建立sysbench專用的資料庫echo ‘now create db‘mysql -h$DBIP -P$DBPORT -u$DBUSER -p$DBPASSWD -e ‘create database sysbench‘echo ‘create ok‘## 資料準備echo ‘now prepare data‘ sysbench /usr/share/sysbench/oltp_read_only.lua \    #必須附加lua指令碼才可以初始化資料 --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###### 葉金榮, 知數堂培訓聯合創始人, 資深MySQL專家, MySQL佈道師, Oracle MySQL ACE#### 幾個注意事項:## 1、運行sysbench的客戶機和MySQL DB伺服器盡量不要在同一台主機上,也包括一台宿主機上啟動兩個虛機的情形;## 2、測試表的數量不宜太少,至少要求20個表以上;## 3、每個表的資料量不宜太少,通常至少要求1千萬以上,當然了,也要根據DB伺服器的配置適當調整;## 4、每次進行基準壓測的時間長度不宜過短,通常要求持續15分鐘以上;## 5、每輪測試完畢後,中間至少暫停5分鐘,或者確認系統負載完全恢複空跑狀態為止;## 6、測試DB伺服器要是專用的,不能和其他業務混跑,否則測試結果就不靠譜了;## 7、其餘未盡事宜,後續再行補充。#### created by [email protected]## 2017/6/3#### sysbench項目地址: https://github.com/akopytov/sysbench######################### 2018/02/23  張銳志 #######################################葉老師原指令碼僅適用於sysbench 0.5版本,sysbench升級到1.0後無法使用,現修改部分文法。export LD_LIBRARY_PATH=/usr/local/mysql/lib/. ~/.bash_profile# 需要啟用DEBUG模式時將下面三行注釋去掉即可#set -u#set -x#set -eBASEDIR="/data/sysbench"if [ ! -d $BASEDIR ]then   mkdir $BASEDIR -pficd $BASEDIR#清理之前的遺留記錄rm -rf $BASEDIR/logs*# 記錄所有錯誤及標準輸出到 sysbench.log 中exec 3>&1 4>&2 1>> sysbench.log 2>&1#時間單位秒DBIP=192.168.1.109DBPORT=3109DBUSER=‘proxysql‘DBPASSWD=‘123456‘NOW=`date +‘%Y%m%d%H%M‘`DBNAME="sysbench"REPORT_INTERVAL=1TBLCNT=10           #表數量WARMUP=300          #預熱時間(秒)DURING=1800         #期間(秒)ROWS=10000000       #每個表中插入1KW行資料MAXREQ=1000000      #最大請求數為100W#當達到期間或者最大請求數時,這一輪的測試就會停止# 並發壓測的線程數,根據機器配置實際情況進行調整THERAD_NUMBER="8 64 128"#初始次數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 \                 #資料隨機類型:uniform,均勻的  --time=$DURING run >> ${rounddir}/sysbench_${thread}.logsleep 300                   #不同的線程數壓測之間停頓5分鐘doneround=`expr $round + 1`sleep 300                   #每輪壓測之間停頓5分鐘done

? 運行完畢後在預設的資料目錄下可以找到sysbench輸出的日誌。

3.結果分析與繪圖

? 可以直接閱讀sysbench日誌給出的總結,也可以對其中個別項的資料進行繪圖觀察趨勢。

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:              10205Latency (ms):         min:                               3113.18         avg:                              11303.55         max:                              24222.47         95th percentile:                  16819.24         sum:                            115352747.29Threads fairness:    events (avg/stddev):           159.4531/1.51    execution time (avg/stddev):   1802.3867/1.03#我使用的是硬體資源十分有限的虛擬機器,壓測結果有點紮心。

? 安裝gnuplot進行繪圖,gnuplot需要圖形環境,可以選擇在windows上安裝,也可以在施壓客戶機上安裝圖形介面。這裡選擇在linux施壓客戶機上安裝圖形介面。

dnf -y install @xfce-desktop #安裝圖形介面yum -y install gnuplot #安裝gnuplotgnuplot  #進入gnuplot終端gnuplot>plot ‘output/sysbench_8.log‘ using  9 w lines title ‘QPS‘        #using 5 表示使用第5列資料作圖        #with lines 定義圖中的趨勢使用線來表示        #title ‘QPS‘ 定義線的名稱        #使用,(逗號)分割,進行多列資料的繪製

圖形如下:

通過其他指令碼觀察sysbench壓測過程中的系統資訊和資料庫資訊(來源於《高可用 MySQL》)

#!/bin/sh#開始前擷取全域配置參數#每五秒擷取一次cpu load,MySQL全域資訊,InnoDB引擎相關資訊,線程資訊 INTERVAL=5PREFIX=$INTERVAL-sec-statusRUNFILE=/root/runningmysql -e ‘show global variables‘>>mysql-variables#通過檢測 /root/running檔案是否存在作為是否進行擷取資訊的依據,可以在壓測結束時刪除此檔案停止收集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 $tsdoneecho Exiting because $RUNFILE not exist    

對上一步收集到的全域資訊進行分析。

#!/bin/shawk ‘        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                }                ‘ "[email protected]"

運行方式:sh hi_anaylyze.sh 5-sec-status-2018-02-22_14_status >>4plot.log (將分析後的結果記入4plot.log中)

同樣使用gnupot進行繪圖分析:

gunplot>plot ‘4plot‘ using 5 with lines title ‘QPS‘, 4 with lines title ‘load‘        #using 5 表示使用第5列資料作圖        #with lines 定義圖中的趨勢使用線來表示        #title ‘QPS‘ 定義線的名稱        #使用,(逗號)分割,進行多列資料的繪製

? (兩個圖形的資料來源不同,僅作為樣本使用。)

相關連結:

葉金榮老師的:sysbench安裝、使用、結果解讀
sysbench項目地址

【MySQL】【壓測】使用sysbench對MySQL進行壓力測試

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.