首页 > 代码库 > Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)

什么是基准测试

基准测试是一种测量和评估软件性能指标的活动用于建立某个时刻的性能基准,以便当系统发生软硬件变化时重新进行基准测试以及评估变化对性能的影响。

    我们可以这样认为:基准测试是针对系统设置的一种压力测试。用来观察系统在不同压力下的行为,评估系统的容量,观察系统如何处理不同的数据,但是要注意的是基准测试和通常所说的压力测试还是有区别的。

    基准测试要尽量的直接和简单,使各个结果之间容易比较,基准测试所使用的数据通常是由测试工具所生成的,只能用于评估服务器的

处理能力;而压力测试通常是通过真实的业务数据进行测试,以获得真实的业务系统所能承受的压力,所以基准测试是简化了的压力测试。基准测试给系统带来的压力通常只能测量系统的性能,而忽略了系统逻辑的压力测试。举例:如果我们要对一个网站进行压力测试,通过不同的主题来进行,比如购物车流程的压力测试,我们就要按照购物流程的业务逻辑来设计我们的压力测试要包括哪些购物流程,所使用的数据和查询呢也是在整个购物流程中要用到的,而基准测试就不是这样,比如我们要对Mysql进行基准测试的话,我们可能不用关心在mysql上运行的系统逻辑是什么,比如我们可以通过一个简单的查询通过多线程并发来衡量调优后的结果是否有效,我们所使用的查询数据真实性同业务性也是没有任何关系的,这就是基准测试。

基准测试的目的

一:首先是建立mysql服务器的性能基准线,主要是确定当前mysql服务器的运行情况,如果不清楚当前的系统性能,我们就无法确定某些优化了的实际产生的效果会怎样,同时呢我们也可以利用历史基准测试的结果来分析诊断一些应用中出现的性能问题

二:模拟比当前系统更高的负载,以找出系统随着压力的增加而产生的的扩展瓶颈,通常我们就是在一定数据量的情况下不断地增加数据库的并发来观察QPS和TPS的变化,确定并发量多少的情况下是最好的,一旦超过某个并发会出现性能下降的情况

三:基准测试还可以帮助我们测试不同的硬件、软件和操作系统配置的情况下数据库的性能,比如硬件差别比较适合当前系统,升级Mysql的版本是否会改善性能,等等。。。。所有的问题可以通过基准测试得到解决

四:我们可以通过基准测试证明我们采购的新硬件设备是否配置正确,也可以帮助我们了解新的硬件性能基准线

如何进行基准测试

一:对整个系统进行基准测试。这种方法一般从系统的入口进行测试,比如对于网站来说,一般从web前端进行测试,手机APP则是通过APP的前端进行测试。

优点:

A:可以测试整个系统的性能,包括web服务器、程序代码、缓存服务器、网络和数据库等等的一些组件,这些通常是比较重要的,因为我们关心的不仅仅是mysql数据库的性能,相比于数据库我们通常来说更关心整个系统的性能是什么样的,所以呢对整个系统整体的测试呢可以摆出各种性能问题,另外从另一方面来说,mysql也并非是系统性能产生的瓶颈,如果我们只关注mysql或许会忽略系统组件中其他性能问题

B:能反映出系统中各个组件接口间的性能问题体现真实性能状况。

缺点:

测试设计比较复杂,消耗的时间比较长,通常完成一次对整个系统的基准测试耗费几天的时间比较正常的。

二:单独对mysql进行基准测试。

特别在一些时候,我们不需要对整个系统基准测试的情况下,那么单独对一个组件进行测试更为合适,比如我们只更新了mysql服务器的硬件,比如mysql中的索引、sql进行优化,这时候我们就只需要对mysql进行基准测试就可以了。

优点:

测试方法设计简单,所消耗的时间短。比较适合用于比较不通的数据结构、查询、性能的差异,或者是针对应用的某个问题进行测试。

缺点:

由于我们只是单独的对mysql进行测试,无法全面了解整个系统的性能基准线,也无法提现系统中不同组件及接口之间的性能问题。

mysql基准测试的常见指标

一:单位时间内所处理的事务数(TPS)

二:单位时间内所处理的查询数(QPS)

这两个指标通常用于衡量数据库的吞吐量,我们数据的数据库每秒所处理的事务量(TPS)和查询数(QPS)就是这类指标的具体体现。对于相同的数据量的相同的sql进行测试,如果调整后的TPS量和QPS量有明显的增长,那么说明我们的调试是成功的,否则考虑我们的优化方法是否确。

三:响应时间

这个指标用于衡量完成一个测试任务所花费的整体时间,一个测试任务通常包括很多的测试项,就算我们对一个sql进行测试,通常也会对一个sql执行很多次,那么具体的测试情况和测试用例是不同的,响应的时间单位可能是秒、微秒、毫秒或者分钟,当然也可能是小时,针对不同的时间单位,我们可以计算每次测试执行的平均响应时间、最小响应时间、最大响应时间、各时间所占百分比。通常来说最大的响应时间对我们来说意义并不是很大,因为随着测试时间加长,最大响应时间也可能越来越大,意义比较大的是百分比响应时间,例如:一个sql的90%响应时间是10毫秒,那么这个sql正常情况下就是10毫秒,其他情况下就是意外了,比如锁等。。。

四:并发请求的数量(同时处理的查询请求数量)

对于网站应用来说,经常被表示成有多少用户同时浏览一个web网站,这时通常以web服务器的会话量来标示指标,这样是不正确的。我们经常看到一些论坛看到同时在线的有几千甚至几万,这并不代表并发量有这么多。一方面对于大多数用户来说只是简单浏览web页面上的信息,这并不等于web服务器的并发性,另一方面web服务器的并发量也不等同于数据库的并发量,即使web服务器当前有几千甚至几万的用户,到mysql端呢并发甚至只有几十个,甚至会更少。如何获取mysql服务器的并发情况:基准测试需要关注的是正在工作中的并发的操作,或者同时工作的线程的数量,而不是多少连接的线程就可以了。

基准测试的步骤

计划和设计基准测试

?对整个系统还是某一个组件,比如仅仅对mysql

?使用什么样的数据进行测试,比如我们希望基准测试能够反映出系统的实际情况,最好使用生产环境的实际数据和实际语言的sql进行数据测试,如果使用这种方式需要注意:最好利用生产环境数据库的备份以及在一个时间段内实际产生的sql日志来进行多线程的回放来进行测试,这种方式比较复杂,并且准备数据的时间和测试时间比较长,如果我们只想知道某个参数的调整对我们数据库的影响的话,就完全没必要这么麻烦,可以使用专门的测试工具来生产测试中所需要的数据和sql以此来完成基准测试,这种方式比使用生产环境的数据更加简单

准备基准测试数据及数据收集脚本

    如果希望使用系统的真实数据的话,那么我们最好提前或许真实数据数据库的备份,以及在真实环境中运行sql的记录,对于sql的执行记录通常我们可以把慢查询日志全部记录下来来获得;如果没必要使用真实数据的话,一般的测试工具都可以满足但是对于测试执行过程中系统收集的脚本需要自己编写,通常情况下在执行基准测试时,我们需要尽可能多的收集测试系统的当前信息,

包括CPU使用率、IO、网络流量、状态与计数器信息等。

信息系统收集脚本:(暂时未测试)

#!/bin/bash
INTERVAL=5                        #运行间隔,每隔多少时间收集一下状态信息
PREFIX=/home/imooc/benchmarks/$INTERVAL-sec-status    #定义了状态信息的存储位置
RUNFILE=/home/imooc/benchmarks/running            #指定了运行标示,如果存在标示,证明脚本在运行,想停止脚本,就删除文件
echo "1">$RUNFILE                    #标示文件
MYSQL=/usr/local/mysql/bin/mysql            #mysql命令所在的位置
$MYSQL -e "show global variables" >>mysql-variables    #记录了进行测试的当前mysql的一些设置信息
while test -e $RUNFILE;                    #循环体开始
do
    file=$(date +%F_%I)                #定义了脚本运行时间
    sleep=$(date +%s.$N | awk ‘{print 5 - ($1 % 5)}‘)    #每隔多久运行一次脚本
    sleep $sleep
    ts="$(date +"TS %s.$N $F %T")" 
    loadavg="$(uptime)"                #系统的负载情况
    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" >> $PREFIX-${file}-innodbstatus &        #收集innodb的状态信息
    echo "$ts $loadavg" >> $PREFIX-${file}-processlist
    $MYSQL -e "show full processlist\G" >> $PREFIX-${file}-processlist &        #收集mysql线程的情况
    echo $ts
done    
echo Exiting because $RUNFILE does not exists

运行基准测试

保存及分析基准测试结果(未测试)

#!/bin/bash
awk ‘
    BEGIN {
        printf "#ts date time load QPS";
        fmt=" %.2f";
    }
    /^TS/ {
        ts=substr($2,1,index($2,".")-1);
        load=NF-2;
        diff=ts-prev_ts;
        printf "\n%s %s %s %s %s",ts,$3,$4,substr($load,1,length($load)-1);
        prev_ts=ts;
    }
    /Queries/{
        print fmt,($2-Queries)/diff;
        Queries=$2
    }
    ‘ "$@"

基准测试中需要注意的问题

基准测试中容易忽略的问题

一:使用生产环境的真实数据进行测试时只使用子集,而不是全部数据。最好使用生产环境数据库完全的备份进行测试,而不是人为从全部数据中选取一部分进行测试。

二:在一个多用户场景中,只做单用户的测试,比如web应用通常是存大量用户并发的场景,在web数据库进行基准测试时,必须考虑并发情况,使用多个连接线程对mysql的性能进行测试,通常情况下多线程并发的数据库性能和单线程访问的数据库性能的表现是完全不同的,应用呢在单线程时运行的很好,一单存在并发就会出现大量的阻塞和死锁,这种情况是在单线程无法发现的。对于多用户访问的场景一定使用多线程并发测试才能达到目的。

三:在单独服务器上测试分布式应用的性能。分布式和单服务器表现是不同的,比如我们生产环境的数据库部署使用的是主从同步并且读写分离的架构,那么在测试的时候也要相同的架构测试。

四:在测试过程中反复执行同一个查询。在真实的生产环境中所使用的查询肯定是不尽相同的,这样可能会造成查询缓存的命中率比较低的情况,如果我们在基准测试中反复使用同一个sql进行查询,那么在某种程度上来说,这个查询会在缓存中命中,那么就无法体现出真实的性能。

常用的mysql基准测试工具

mysqlslap,mysql自带的一款基准测试工具,并不能非常好的提现出mysql  innodb存储引擎的性能,也并没有在自增id列上建立相关的索引

特点:可以模拟系统服务器的负载,并且可以输出相关的统计信息

测试时可以指定执行的并发因素,也可以自动生成查询语句,如果没指定sql语句,mysqlslap工具也可以自动生成完成基准测试需要的数据及查询语句.

mysqlslap常用参数说明:

--auto-generate-sql 用于指定由系统自动生成脚本进行测试还是使用自己的数据和sql进行测试。如果指定代表用系统自己生成的SQL脚本
来测试。
--auto-generate-sql-add-autoincrement  指定了在自动生成表中是否要增加自增id列,如果是对innodb引擎进行测试,这个参数很重要
,因为innodb
的主键是聚集索引,最好使用自增id来作为innodb表的主键。
--auto-generate-sql-load-type  它指定了测试中使用的查询类型,默认使用混合测试类型,代表同时包括了读写查询删除更新等混合sql
语句进行测试
--auto-generate-sql-wite-number   指定了mysqlslap可以自动生成测试数据的数据量是多少,一般情况下这个参数初始化是100行数据。
--concurrency 代表并发数量,多个可以用逗号隔开,例如:concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。
--engines代表要测试的引擎,可以有多个,用分隔符隔开。mysql会先进行一种测试,比如myisam,测试完后再进行innodb进行测试
--no-drop在默认情况下,mysql对数据完成一次测试之后会对自动生成的数据进行清理
--iterations代表要运行这些测试多少次。如果要得出正确结果,最好执行多次,多次测试得出百分比,得出相对稳定的测试结果,同样
mysqlslap每测试一次就会重新生成测试数据,所以如果我们制定此参数就不能指定no-drop参数,是相互冲突的
--number-of-queries 指定每个线程执行查询的次数,代表总共要运行多少次查询。每个客户端运行的查询数量可以用查询总数/并发数来计
算。
--debug-info 指定此参数,代表要额外输出CPU以及内存的相关信息。
--number-int-cols 指定创建测试表的 int 型字段数量
--number-char-cols 指定创建测试表的 char 型字段数量。
--create-schema  指定测试的数据库的名字,MySQL中schema也就是database。
--query  使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--only-print 并不运行测试脚本,而是把生成的脚本打印出来

执行命令

mysqlslap --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5 --auto-generate-sql 
--auto-generate-sql-add-autoincrement --engine=myisam,innodb --number-of-queries=10 --create-schema=newtest

说明

--concurrency=1,50,100,200          //指定并发数,单线程分别50,100,200
--iterations=3                //对测试完成3次    
--number-int-cols=5            //生成的整数列类型行数
--number-char-cols=5            //生成的char列类型行数
--auto-generate-sql            //看说明
--auto-generate-sql-add-autoincrement    //看说明
--engine=myisam,innodb             //引擎,两种
--number-of-queries=10            //每个进程所执行的查询量是10次,保证测试时间比较少
--create-schema=newtest            //指定建立的库
[--only-print | more]            //可以另外指定

测试结果

//单并发情况下,也就是每个sql线程只运行一个查询
Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.000 seconds  //平均秒完成
    Minimum number of seconds to run all queries: 0.000 seconds
    Maximum number of seconds to run all queries: 0.001 seconds
    Number of clients running queries: 1    
    Average number of queries per client: 10

Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.078 seconds
    Minimum number of seconds to run all queries: 0.063 seconds
    Maximum number of seconds to run all queries: 0.108 seconds
    Number of clients running queries: 50
    Average number of queries per client: 0

Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.146 seconds
    Minimum number of seconds to run all queries: 0.136 seconds
    Maximum number of seconds to run all queries: 0.155 seconds
    Number of clients running queries: 100
    Average number of queries per client: 0

//200个并发
Benchmark
    Running for engine myisam
    Average number of seconds to run all queries: 0.302 seconds   //平均0.302秒完成
    Minimum number of seconds to run all queries: 0.281 seconds
    Maximum number of seconds to run all queries: 0.316 seconds
    Number of clients running queries: 200
    Average number of queries per client: 0



//单并发情况下,也就是每个sql线程只运行一个查询
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.047 seconds     //平均秒完成
    Minimum number of seconds to run all queries: 0.024 seconds
    Maximum number of seconds to run all queries: 0.060 seconds
    Number of clients running queries: 1
    Average number of queries per client: 10

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 1.026 seconds
    Minimum number of seconds to run all queries: 0.962 seconds
    Maximum number of seconds to run all queries: 1.108 seconds
    Number of clients running queries: 50
    Average number of queries per client: 0

Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 2.073 seconds
    Minimum number of seconds to run all queries: 2.009 seconds
    Maximum number of seconds to run all queries: 2.187 seconds
    Number of clients running queries: 100
    Average number of queries per client: 0

//200个并发
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 4.314 seconds    //4.314秒完成
    Minimum number of seconds to run all queries: 4.125 seconds
    Maximum number of seconds to run all queries: 4.472 seconds
    Number of clients running queries: 200
    Average number of queries per client: 0

sysbench更为通用,同样是一款多线程的基准测试工具,可以对影响数据库服务器性能的各种因素进行测试,并评估性能的表现,可以对IO、CPU、内存以及数据库服务器等等进行测试,同时支持脚本语言,可以对各种场景进行测试,使用起来非常灵活,是一款非常全面的测试工具,也是最常用的基准测试工具,同时测试方式更接近于Innodb的数据方式,可以很好地对mysql硬件进行测试。

它主要包括以下几种方式的测试:

1、cpu性能

2、磁盘io性能

3、调度程序性能

4、内存分配及传输速度

5、POSIX线程性能

6、数据库性能(OLTP基准测试)

目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

安装sysbench(本次安装与配置是通过yum快速安装mysql的一些默认路径)

wget  .... //下载地址忽略
unzip 0.5.zip
cd sysbench0.5
./autogen.sh

出现了报错:automake 1.10.x (aclocal) wasn‘t found, exiting,执行以下命令

yum install automake
./autogen.sh

再次报错:libtoolize 1.4+ wasn‘t found, exiting,继续执行以下命令

yum install libtool
./autogen.sh
[root@localhost sysbench-0.5]# ./autogen.sh 
./autogen.sh: running `aclocal -I m4‘ 
./autogen.sh: running `libtoolize --copy --force 
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config‘.
libtoolize: copying file `config/ltmain.sh
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4‘.
libtoolize: copying file `m4/libtool.m4
libtoolize: copying file `m4/ltoptions.m4‘
libtoolize: copying file `m4/ltsugar.m4
libtoolize: copying file `m4/ltversion.m4‘
libtoolize: copying file `m4/lt~obsolete.m4‘
./autogen.sh: running `autoheader‘ 
./autogen.sh: running `automake -c --foreign --add-missing 
configure.ac:25: installing `config/compile‘
configure.ac:11: installing `config/config.guess
configure.ac:11: installing `config/config.sub‘
configure.ac:16: installing `config/install-sh
configure.ac:16: installing `config/missing‘
sysbench/Makefile.am: installing `config/depcomp‘
./autogen.sh: running `autoconf‘ 
Libtoolized with: libtoolize (GNU libtool) 2.2.6b
Automade with: automake (GNU automake) 1.11.1
Configured with: autoconf (GNU Autoconf) 2.63             //OK
./configure --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/var/lib/mysql/    //yum的默认安装路径配置

报错:configure: error: cannot find MySQL client libraries in /var/lib/mysql/,执行以下命令

cp /usr/lib64/mysql/* /var/lib/mysql/
./configure --with-mysql-includes=/usr/include/mysql/ --with-mysql-libs=/var/lib/mysql/   //继续执行
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
....................
config.status: creating sysbench/drivers/mysql/Makefile
config.status: creating sysbench/drivers/drizzle/Makefile
config.status: creating sysbench/drivers/oracle/Makefile
config.status: creating sysbench/drivers/pgsql/Makefile
config.status: creating sysbench/drivers/attachsql/Makefile
config.status: creating sysbench/tests/Makefile
config.status: creating sysbench/tests/cpu/Makefile
config.status: creating sysbench/tests/fileio/Makefile
config.status: creating sysbench/tests/memory/Makefile
config.status: creating sysbench/tests/threads/Makefile
config.status: creating sysbench/tests/mutex/Makefile
config.status: creating sysbench/tests/db/Makefile
config.status: creating sysbench/scripting/Makefile
config.status: creating sysbench/scripting/lua/Makefile
config.status: creating sysbench/scripting/lua/src/Makefile
config.status: creating tests/Makefile
config.status: creating tests/include/config.sh
config.status: creating config/config.h
config.status: executing depfiles commands
config.status: executing libtool commands

[./configure --with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/  //非yum安装配置例子]

make && make install
Making all in doc
make[1]: Entering directory `/usr/local/src/sysbench-0.5/doc‘
Making all in xsl
make[2]: Entering directory `/usr/local/src/sysbench-0.5/doc/xsl
make[2]: Nothing to be done for `all‘.
make[2]: Leaving directory `/usr/local/src/sysbench-0.5/doc/xsl
make[2]: Entering directory `/usr/local/src/sysbench-0.5/doc‘
.......
make[1]: Entering directory `/usr/local/src/sysbench-0.5
make[2]: Entering directory `/usr/local/src/sysbench-0.5‘
make[2]: Nothing to be done for `install-exec-am‘.
make[2]: Nothing to be done for `install-data-am‘.
make[2]: Leaving directory `/usr/local/src/sysbench-0.5
make[1]: Leaving directory `/usr/local/src/sysbench-0.5‘

安装编译完成!

常用参数

--mysql-db                 //用户指定执行基准测试的数据库名
--mysql-table-engine         //用于指定所使用的存储引擎
--oltp-tables-count         //执行测试的表的数量
--oltp-table-size            //指定每个表中的数据行数
--num-threads                //指定测试的并发线程数量
--max-time                   //指定最大的测试时间
--report-interval            //指定间隔多长时间输出一次统计信息
--mysql-user                 //指定执行测试的Mysql用户
--mysql-password             //指定执行测试的Mysql密码
prepare                      //用于准备测试数据
run                          //用于实际进行测试
cleanup                      //用于清理测试数据

A:对CPU进行基准测试

sysbench --test=cpu --cpu-max-prime=10000 run        //CPU进行的最大计算整数值是10000
sysbench 0.5:  multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Random number generator seed is 0 and will be ignored
Prime numbers limit: 10000
Initializing worker threads...
Threads started!
General statistics:
    total time:                          14.2054s
    total number of events:              10000
    total time taken by event execution: 14.1802s
    response time:
         min:                                  1.00ms
         avg:                                  1.42ms
         max:                                  8.78ms
         approx.  95 percentile:               2.71ms            //95%的时间是2.71毫
         秒时间完成

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   14.1802/0.00

开始数据库性能测试,首先要生成测试数据,先建立用于基准测试的数据库以及相关的数据库密码。

进入mysql

create databases ceshi;                             //建立一个数据库,叫ceshi
grant all privileges on *.* to root@‘localhost‘ identified by ‘123456‘;   //用户叫root,赋予所有权限

B:模拟oltp测试

sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=test --mysql-user=root
 --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock prepare

技术分享

sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=test --mysql-user=root
 --mysql-password=123456 --oltp-tables-count=10 --mysql-socket=/var/lib/mysql/mysql.sock run
Threads started!

OLTP test statistics:
    queries performed:    
        read:                     140000      //读的总数量
        write:                     40000      //写的数量
        other:                     20000      //除了读写其他数量,比如commit
        total:                     200000     //总数量
    transactions:        10000  (143.53 per sec.)       //每秒所执行的事务数,服务器每秒的tps是143次
    read/write requests:         180000 (2583.54 per sec.)   //请求的数量每秒大概2583次
    other operations:                    20000  (287.06 per sec.)    //其他操作每秒大概287次
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                     69.6719s              //总耗费时间69秒
    total number of events:              10000                        
    total time taken by event execution: 69.6265s                    
    response time:
         min:                                  2.35ms
         avg:                                  6.96ms
         max:                                528.71ms
         approx.  95 percentile:              17.92ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00            //平均执行时间10000次
    execution time (avg/stddev):   69.6265/0.00                 /平均响应时间69秒
8 线程并发、只读模式、测试时长为 60s 。
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root --max-time=60 --oltp-read-only=on 
--max-requests=0 --num-threads=8 --db-driver=mysql --mysql-socket=/tmp/mysql.sock run

C:IO测试

IO测试,更能体现出innnodb的性能特点,在测试之前要先生成测试文件,这里要注意的是,要生成的数据文件一定要比内存大,如果文件中的数据可以完全放到内存中,则操作系统缓存就会对大部分数据进行缓存,这样就会导致测试结果无法体现出工作负载。

首先看演示系统中有多少内存

free -m   //查看内存使用情况

技术分享

最大内存是 988M,生成大于988M的就足够

df -lh  //查看磁盘空间

技术分享

磁盘空间还有12G可用,进入tmp目录准备

cd /tmp
sysbench --test=fileio --file-total-size=2G prepare
sysbench 0.5:  multi-threaded system evaluation benchmark
128 files, 16384Kb each, 2048Mb total
Creating files for the test...
Extra file open flags: 0
Creating file test_file.0
Creating file test_file.1
Creating file test_file.2
....
Creating file test_file.122
Creating file test_file.125
Creating file test_file.126
Creating file test_file.127
2147483648 bytes written in 4.80 seconds (426.24 MB/sec).

生成了很多文件,每个文件加起来的和就是两个G。

sysbench  --test=fileio --num-threads=8 --init-rng=on --file-total-size=2G --file-test-mode-rndrw --report-interval=1
run
--num-threads=8//指定测试进程的数量,有多少个进程同时并发的读写-8个
--file-test-mode-rndrw//随机读写模式
--report-interval=1//间隔多久输出一次统计信息   1秒
--report-interval=1 run
General statistics:
    total time:                          1.1252s
    total number of events:              10000
    total time taken by event execution: 3.7104s
    response time:
         min:                                  0.00ms
         avg:                                  0.37ms
         max:                                 31.83ms
         approx.  95 percentile:               0.19ms
Threads fairness:
    events (avg/stddev):           1250.0000/211.85
    execution time (avg/stddev):   0.4638/0.06

最后清除这些文件

sysbench --test=fileio --file-total-size=2G cleanup

 

Mysql基准测试详细解说(根据慕课网:《打造扛得住Mysql数据库架构》视频课程实时笔录)