千家信息网

如何使用sysbench对MySQL实施压力测试

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,下面一起来了解下如何使用sysbench对MySQL实施压力测试,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何使用sysbench对MySQL实施压力测试这篇短内容是你想要的。1.背景出自pe
千家信息网最后更新 2025年01月21日如何使用sysbench对MySQL实施压力测试

下面一起来了解下如何使用sysbench对MySQL实施压力测试,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何使用sysbench对MySQL实施压力测试这篇短内容是你想要的。

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 yejinrong@zhishutang.com## 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                }                ' "$@"

运行方式: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对MySQL实施压力测试这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的行业资讯栏目。

0