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、其他脚本分析

其他脚本的函数和逻辑相对容易理解,这里不做过多解释。并且其中添加了相应的注释,用于解释相关的操作。

总结

脚本中还有一些不尽如人意的地方,也可能存在性能更高的优化方案。如果有什么不足之处,希望大家指出,使脚本更利于使用。如果有其他好的方案,希望大家相互交流和学习。

你可能感兴趣的:(sysbench)