Sysbench scripts源碼分析

Sysbench scripts源碼分析

 

目的

基於sysbench scripts使用說明文檔,爲了便於開發和使用人員進一步對代碼理解和接下來的維護工作,對腳本進行詳細說明。

 

腳本說明

         腳本文件夾中包括以下內容:

run.sh:自動化測試腳本。該腳本執行一系列測試和數據採集工作,具體的測試和數據採集腳本包含在test文件夾中。

         analyze.sh:自動化分析腳本。該腳本對採集的數據信息,進行分析,具體的分析腳本包含在analyze文件夾中。

         test/:測試腳本文件夾。該文件夾中包括以下腳本文件:

         ----global_stat.sh:獲取mysql的所有參數的信息。

----innodb_stat.sh:通過“showengine innodb status\G”獲取innodb存儲引擎的狀態參數信息。

----mysql_vars.sh:獲取mysql當前配置的所有參數的值。

----server_op.sh:對mysqlserver進行啓動、關閉操作。

----sysbench_oltp.sh:執行sysbench程序,進行基準測試的核心工作。

----iostat.sh:獲取當前的io信息。

----vmstat.sh:獲取當前的內存信息。

analyze/:分析腳本文件夾。該文件夾中包括以下腳本文件:

----analyze_global_innodb_dirty_page_ratio.sh:分析global_stat.sh腳本採集的數據中,innodb的髒頁率。

----analyze_global_innodb_page_flushed.sh:分析global_stat.sh腳本採集的數據中,innodb的頁刷新值。

----analyze_innodb_checkpoint.sh:分析innodb_stat.sh腳本採集的數據中,innodb的checkpoint值。

----analyze_innodb_log_flushed_fallbehind.sh:分析innodb_stat.sh腳本採集的數據中,innodb的日誌刷新和當前lsn的差值。

----analyze_sysbench_performance_args.sh:分析sysbench_oltp.sh腳本測試結果中重要的參數。主要包括每秒事務數、每秒請求數等。

----analyze_sysbench_report.sh:分析sysbench_oltp.sh腳本測試結果,生成測試的報告。

注意:以上分析腳本中,沒有對iostat.sh、vmstat.sh進行分析,這是由於採集的數據都需要詳細瞭解,不做具體的分析。而mysql_vars.sh獲取的mysql配置的參數值,僅供分析時參考使用。此外,有些腳本中,實際處理的語句僅有一條,但是爲了靈活性和擴展性,也將其編寫爲單個的腳本。

 

腳本分析

1、run.sh腳本分析

1.1 重要函數分析

get_key_value():獲取輸入參數的值,輸入形式爲:--key=value。

usage():顯示腳本使用和參數說明。

print_default():顯示參數的默認值。

parse_options():解析輸入參數。

1.2 邏輯處理分析

1)爲每個線程測試創建該線程數的文件夾。如果僅測試某一線程數,則不創建。代碼如下所示:

if [ $MIN_THREADS -lt $MAX_THREADS ]

         then

           threadpath=${OUTPUTDIR}/${threads}

         else

           threadpath=${OUTPUTDIR}

         fi

 

2)爲每個線程下每次測試創建該測試次數的文件夾。如果僅測試一次,則不創建。代碼如下所示:

if [ $COUNT -eq 1 ]

    then

      iterpath=${threadpath}

    else

      iterpath=${threadpath}/${iter}

    fi

 

3)啓動mysql server。如果不需要重啓mysqlserver,則不執行該過程。爲了保證測試環境的一致性,建議每次測試重啓mysql server。代碼如下所示:

if [ $SERVER -eq 1 ]

then

echo "----Start mysql server----"

./test/server_op.sh --mysqldir=$MYSQLDIR --defaults-file=$CONFIG --host=$HOST --port=$PORT --user=$USER --password=$PASSWORD --socket=$SOCKET -s

  SERVER=2

fi

 

4)準備測試環境。如果不指定重新準備測試環境,則不執行該操作。爲了防止內存緩存當前測試的數據,從而影響測試結果,建議每次測試重新準備測試環境。代碼如下所示:

if [ $PREPARE -eq 1 ]

then

echo "----Prepare the test environment----"

./test/sysbench_oltp.sh --sysbenchdir=$SYSBENCHDIR --host=$HOST --port=$PORT --database=$DATABASE --user=$USER --password=$PASSWORD --socket=$SOCKET  --tablesize=$TABLESIZE --engine=$ENGINE --threads=$threads --max-requests=$REQUESTS --max-time=$TIME --var=$VAR --value=$VALUE --outputdir=$iterpath -p

fi

 

5)執行test/iostat.sh腳本。用於採集io狀態信息,代碼如下所示:

./test/iostat.sh --interval=$INTERVAL --outputdir=$iterpath &

 

6)執行test/vmstat.sh腳本。用於採集memory狀態信息,代碼如下所示:

./test/vmstat.sh --interval=$INTERVAL --outputdir=$iterpath &

 

7)執行test/global_stat.sh腳本。用於採集mysql的參數信息,代碼如下所示:

./test/global_stat.sh --mysqldir=$MYSQLDIR --host=$HOST --port=$PORT --user=$USER --password=$PASSWORD --socket=$SOCKET --interval=$INTERVAL --outputdir=$iterpath &

 

8)執行test/innodb_stat.sh腳本。用於採集mysqlinnodb engine的參數信息,代碼如下所示:

./test/innodb_stat.sh --mysqldir=$MYSQLDIR --host=$HOST --port=$PORT --user=$USER --password=$PASSWORD --socket=$SOCKET --interval=$INTERVAL --outputdir=$iterpath &

 

9)執行sysbench測試。如果不進行測試,則不執行該過程。默認情況下,RUN過程始終執行。代碼如下所示:

if [ $RUN -eq 1 ]

then

  echo "----Run the sysbench procedure----"

  ./test/sysbench_oltp.sh --sysbenchdir=$SYSBENCHDIR --host=$HOST --port=$PORT       --database=$DATABASE --user=$USER --password=$PASSWORD --socket=$SOCKET --tablesize=$TABLESIZE --engine=$ENGINE --threads=$threads --max-requests=$REQUESTS --max-time=$TIME --var=$VAR --value=$VALUE --outputdir=$iterpath -r

fi

 

10)清理測試過程。將執行的所有腳本都清理,進行下一次的測試。

kill -9 $(ps -ef|grep "iostat.sh"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "vmstat.sh"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "sysbench"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "global_stat.sh"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "innodb_stat.sh"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "mysqladmin"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(ps -ef|grep "mysqld_safe"|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

 

11)清理sysbench測試環境。如果不清理測試環境,則不執行該過程。爲了防止內存緩存當前測試的數據,從而影響測試結果,建議每次測試重新準備測試環境。代碼如下所示:

if [ $CLEANUP -eq 1 ]

then

  echo "----Cleanup the test environment----"

  ./test/sysbench_oltp.sh --sysbenchdir=$SYSBENCHDIR --host=$HOST --port=$PORT       --database=$DATABASE --user=$USER --password=$PASSWORD --socket=$SOCKET       --tablesize=$TABLESIZE --engine=$ENGINE --threads=$threads       --max-requests=$REQUESTS --max-time=$TIME --var=$VAR --value=$VALUE      --outputdir=$iterpath -c

fi

 

11)關閉mysql server。如果不執行啓動服務過程,則該過程忽略。代碼如下所示:

if [ $SERVER -eq 2 ]

then

  echo "----Shutdown mysql server----"

  ./test/server_op.sh --mysqldir=$MYSQLDIR --defaults-file=$CONFIG --host=$HOST --port=$PORT --user=$USER --password=$PASSWORD --socket=$SOCKET -d

  SERVER=1

fi

 

2、analyze.sh腳本分析

1.1 重要函數分析

get_key_value():獲取輸入參數的值,輸入形式爲:--key=value。

usage():顯示腳本使用和參數說明。

print_default():顯示參數的默認值。

parse_options():解析輸入參數。

1.2 邏輯處理分析

1)查找線程文件夾。如果不只是測試一個線程的情況,設置線程文件夾路徑。

if [ $MIN_THREADS -lt $MAX_THREADS ]

then

  threadpath=${INPUTDIR}/${threads}

else

  threadpath=${INPUTDIR}

fi

 

2)查找測試次數文件夾。如果測試次數不唯一,設置測試次數文件夾路徑。

if [ $COUNT -eq 1 ]

then

iterpath=${threadpath}

else

iterpath=${threadpath}/${iter}

fi

 

3)分析sysbench測試報告。

./analyze/analyze_sysbench_report.sh --input=$sysbench_file --outputdir=$OUTPUTDIR

 

4)分析sysbench重要參數。

./analyze/analyze_sysbench_performance_args.sh --input=$sysbench_file --outputdir=$OUTPUTDIR

 

5)分析global innodb pageflushed。

./analyze/analyze_global_innodb_page_flushed.sh --input=$global_file --outputdir=$OUTPUTDIR

 

6)分析global innodbdirty page ratio。

./analyze/analyze_global_innodb_dirty_page_ratio.sh --input=$global_file --outputdir=$OUTPUTDIR

 

7)分析innodb log flushedfallbehind。

./analyze/analyze_innodb_log_flushed_fallbehind.sh --input=$innodb_file --outputdir=$OUTPUTDIR

 

8)分析innodb checkpoint。

./analyze/analyze_innodb_checkpoint.sh --input=$innodb_file  --outputdir=$OUTPUTDIR

 

9)彙總每個線程的多次測試結果。

    checkpoint_files=`find $OUTPUTDIR -name "checkpoint_*${threads}*.result"`

    dirty_pages_files=`find $OUTPUTDIR -name "dirty_*${threads}*.result"`

    flushed_pages_files=`find $OUTPUTDIR -name "flushed_*${threads}*.result"`

    log_flushed_files=`find $OUTPUTDIR -name "log_*${threads}*.result"`

    # Summary the checkpoint for each thread.

    paste $checkpoint_files | awk '{sum=0;for(i=1;i<=NF;i++) sum+=$i; print sum/NF}' > $OUTPUTDIR/summary_checkpoint_${threads}_avg.result

    # Summary the dirty page ratio for each thread.

    paste $dirty_pages_files | awk '{sum=0;for(i=1;i<=NF;i++) sum+=$i; print sum/NF}' > $OUTPUTDIR/summary_dirty_page_ratio_${threads}_avg.result

    # Summary the flushed pages for each thread.

    paste $flushed_pages_files | awk '{sum=0;for(i=1;i<=NF;i++) sum+=$i; print sum/NF}' > $OUTPUTDIR/summary_flushed_pages_${threads}_avg.result

    # Summary the log flushed fallbehind for each thread.

    paste $log_flushed_files | awk '{sum=0;for(i=1;i<=NF;i++) sum+=$i; print sum/NF}' > $OUTPUTDIR/summary_log_flushed_fallbehind_${threads}_avg.result

 

3、其他腳本分析

其他腳本的函數和邏輯相對容易理解,這裏不做過多解釋。並且其中添加了相應的註釋,用於解釋相關的操作。

總結

腳本中還有一些不盡如人意的地方,也可能存在性能更高的優化方案。如果有什麼不足之處,希望大家指出,使腳本更利於使用。如果有其他好的方案,希望大家相互交流和學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章