基准测试压力测试

【压测】基准测试、性能测试、压力测试--Sysbench

一、基准测试简介

1、什么是基准测试

数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。

基准测试与压力测试

基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实;而压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。

2、基准测试的作用

对于多数Web应用,整个系统的瓶颈在于数据库;原因很简单:Web应用中的其他因素,例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数等)、缓存,都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求,无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力,但是与系统其它组件的水平扩展相比,受到了太多的限制。

而对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。

3、基准测试的指标

常见的数据库指标包括:

  • TPS/QPS:衡量吞吐量。
  • 响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
  • 并发量:同时处理的查询请求的数量。

4、基准测试的分类

对MySQL的基准测试,有如下两种思路:

(1)针对整个系统的基准测试:通过http请求进行测试,如通过浏览器、APP或postman等测试工具。该方案的优点是能够更好的针对整个系统,测试结果更加准确;缺点是设计复杂实现困难。

(2)只针对MySQL的基准测试:优点和缺点与针对整个系统的测试恰好相反。

在针对MySQL进行基准测试时,一般使用专门的工具进行,例如mysqlslap、sysbench等。其中,sysbench比mysqlslap更通用、更强大,且更适合Innodb(因为模拟了许多Innodb的IO特性),下面介绍使用sysbench进行基准测试的方法。

二、sysbench

1、sysbench简介

sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库;主要包括以下几种测试:

  • cpu性能
  • 磁盘io性能
  • 调度程序性能
  • 内存分配及传输速度
  • POSIX线程性能
  • 数据库性能(OLTP基准测试)

本文主要介绍对数据库性能的测试。

2、sysbench安装

本文使用的环境时CentOS 6.5;在其他Linux系统上的安装方法大同小异。MySQL版本是5.6。

(1)下载解压

1

2

3

wget -O  "sysbench-1.0.zip"

unzip sysbench-1.0.zip

cd sysbench-1.0

(2)安装依赖

1

yum install automake libtool –y

 (3)安装

安装之前,确保位于之前解压的sysbench目录中。

1

2

3

4

5

./autogen.sh

./configure

export LD_LIBRARY_PATH=/usr/ local /mysql/include #这里换成机器中mysql路径下的include

make

make install

(4)安装成功

1

2

[root@test sysbench-1.0]# sysbench 

sysbench 1.0.9

3、sysbench语法

执行sysbench –help,可以看到sysbench的详细使用方法。

sysbench的基本语法如下:

sysbench [options]... [testname] [command]

下面说明实际使用中,常用的参数和命令。

(1)command

command是sysbench要执行的命令,包括prepare、run和cleanup,顾名思义,prepare是为测试提前准备数据,run是执行正式的测试,cleanup是在测试完成后对数据库进行清理。

(2)testname

testname指定了要进行的测试,在老版本的sysbench中,可以通过--test参数指定测试的脚本;而在新版本中,--test参数已经声明为废弃,可以不使用--test,而是直接指定脚本。

例如,如下两种方法效果是一样的:

1

2

sysbench 

sysbench ./tests/include/oltp_legacy/oltp.lua

测试时使用的脚本为lua脚本,可以使用sysbench自带脚本,也可以自己开发。对于大多数应用,使用sysbench自带的脚本就足够了。不同版本的sysbench中,lua脚本的位置可能不同,可以自己在sysbench路径下使用find命令搜索oltp.lua。P.S.:大多数数据服务都是oltp类型的,如果你不了解什么是oltp,那么大概率你的数据服务就是oltp类型的。

(3)options

sysbench的参数有很多,其中比较常用的包括:

MySQL 连接信息参数

  • --mysql-host:MySQL服务器主机名,默认localhost;如果在本机上使用localhost报错,提示无法连接MySQL服务器,改成本机的IP地址应该就可以了。
  • --mysql-port:MySQL服务器端口,默认3306
  • --mysql-user:用户名
  • --mysql-password:密码

MySQL 执行参数

  • --oltp-test-mode:执行模式,包括simple、nontrx和complex,默认是complex。simple模式下只测试简单的查询;nontrx不仅测试查询,还测试插入更新等,但是不使用事务;complex模式下测试最全面,会测试增删改查,而且会使用事务。可以根据自己的需要选择测试模式。
  • --oltp-tables-count:测试的表数量,根据实际情况选择
  • --oltp-table-size:测试的表的大小,根据实际情况选择
  • --threads:客户端的并发连接数
  • --time:测试执行的时间,单位是秒,该值不要太短,可以选择120
  • --report-interval:生成报告的时间间隔,单位是秒,如10

4、sysbench使用举例

在执行sysbench时,应该注意:

(1)尽量不要在MySQL服务器运行的机器上进行测试,一方面可能无法体现网络(哪怕是局域网)的影响,另一方面,sysbench的运行(尤其是设置的并发数较高时)会影响MySQL服务器的表现。

(2)可以逐步增加客户端的并发连接数(--thread参数),观察在连接数不同情况下,MySQL服务器的表现;如分别设置为10,20,50,100等。

(3)一般执行模式选择complex即可,如果需要特别测试服务器只读性能,或不使用事务时的性能,可以选择simple模式或nontrx模式。

(4)如果连续进行多次测试,注意确保之前测试的数据已经被清理干净。

下面是sysbench使用的一个例子:

(1)准备数据

1

sysbench ./tests/include/oltp_legacy/oltp.lua 

其中,执行模式为complex,使用了10个表,每个表有10万条数据,客户端的并发线程数为10,执行时间为120秒,每10秒生成一次报告。

 

基准测试压力测试

(2)执行测试

将测试结果导出到文件中,便于后续分析。

1

sysbench ./tests/include/oltp_legacy/oltp.lua 

(3)清理数据

执行完测试后,清理数据,否则后面的测试会受到影响。

1

sysbench ./tests/include/oltp_legacy/oltp.lua 

5、测试结果

测试结束后,查看输出文件,如下所示:

基准测试压力测试

其中,对于我们比较重要的信息包括:

queries:查询总数及qps

transactions:事务总数及tps

Latency-95th percentile:前95%的请求的最大响应时间,本例中是344毫秒,这个延迟非常大,是因为我用的MySQL服务器性能很差;在正式环境中这个数值是绝对不能接受的。

三、建议

下面是使用sysbench的一些建议。

1、在开始测试之前,应该首先明确:应采用针对整个系统的基准测试,还是针对MySQL的基准测试,还是二者都需要。

2、如果需要针对MySQL的基准测试,那么还需要明确精度方面的要求:是否需要使用生产环境的真实数据,还是使用工具生成也可以;前者实施起来更加繁琐。如果要使用真实数据,尽量使用全部数据,而不是部分数据。

3、基准测试要进行多次才有意义。

4、测试时需要注意主从同步的状态。

5、测试必须模拟多线程的情况,单线程情况不但无法模拟真实的效率,也无法模拟阻塞甚至死锁情况。

虽然mysql默认的有mysqlslap这个性能测试工具,但和sysbench比较来说,还逊色不少。

  1. 下载安装包 
shell> wget  -O "sysbench-1.0.zip"shell> unzip sysbench-1.0.zip
shell> cd sysbench-1.0123
  1. 安装依赖库
shell> yum install automake libtool -y1
  1. 开始安装
shell> ./autogen.sh
shell> ./configure#ERROR: cannot find MySQL libraries. If you want to compile with MySQL support 没找到mysql库 需要用参数指定下 --with-mysql-includes和--with-mysql-libsshell> ./configure --with-mysql-includes=/alidata/server/mysql5.7/include/ --with-mysql-libs=/alidata/server/mysql5.7/lib/
shell> make12345
  1. 执行下命令:
shell> sysbench --help#sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory#问题原因:sysbench无法找到mysql的库文件,可能是环境变量LD_LIBRARY_PATH没有设置,设置后即可解决该问题:shell> export LD_LIBRARY_PATH=/alidata/server/mysql5.7/lib/lib
shell> sysbench --version
sysbench 1.0123456
  1. 创建测试数据库sbtest
shell> mysqladmin create sbtest -uroot -p
Enter password:12
  1. 测试准备: 20个并发连接,20张表 每个表填充10W条数据 最大请求时间120s
#-test=tests/db/oltp.lua 表示调用 tests/db/oltp.lua 脚本进行 oltp 模式测试#--oltp_tables_count=10 表示会生成 10 个测试表#--oltp-table-size=100000 表示每个测试表填充数据量为 100000 #--rand-init=on 表示每个测试表都是用随机数据来填充的#-num-threads=8 表示发起 8个并发连接#--oltp-read-only=off 表示不要进行只读测试,也就是会采用读写混合模式测试#--report-interval=10 表示每10秒输出一次测试进度报告#--rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)#--max-time=120 表示最大执行时长为 120秒#--max-requests=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长#--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值shell> sysbench --test=oltp --oltp_tables_count=10 --oltp-table-size=100000 --mysql-user=root --mysql-password=123456 --num-threads=20 --max-time=120 --max-requests=0 --oltp-test-mode=complex prepare
sysbench 1.0:  multi-threaded system evaluation benchmark
Creating table 'sbtest1'...
Inserting 100000 records into 'sbtest1'Creating secondary indexes on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 100000 records into 'sbtest2'Creating secondary indexes on 'sbtest2'...
Creating table 'sbtest3'...
Inserting 100000 records into 'sbtest3'Creating secondary indexes on 'sbtest3'...
Creating table 'sbtest4'...
Inserting 100000 records into 'sbtest4'Creating secondary indexes on 'sbtest4'...
Creating table 'sbtest5'...
Inserting 100000 records into 'sbtest5'Creating secondary indexes on 'sbtest5'...
Creating table 'sbtest6'...
Inserting 100000 records into 'sbtest6'Creating secondary indexes on 'sbtest6'...
Creating table 'sbtest7'...
Inserting 100000 records into 'sbtest7'Creating secondary indexes on 'sbtest7'...
Creating table 'sbtest8'...
Inserting 100000 records into 'sbtest8'Creating secondary indexes on 'sbtest8'...
Creating table 'sbtest9'...
Inserting 100000 records into 'sbtest9'Creating secondary indexes on 'sbtest9'...
Creating table 'sbtest10'...
Inserting 100000 records into 'sbtest10'Creating secondary indexes on 'sbtest10'...123456789101112131415161718192021222324252627282930313233343536373839404142434445

7.开始测试

shell> sysbench --test=oltp --oltp_tables_count=10 --oltp-table-size=100000 --mysql-user=root --mysql-password=123456 --num-threads=20 --max-time=120 --max-requests=0 --oltp-test-mode=complex run >> /tmp/log/sysbench_oltpx_20161121.log#执行结束后查看测试报告shell> less /tmp/log/sysbench_oltpx_20161121.log
sysbench 1.0:  multi-threaded system evaluation benchmark#报告内容如下:Running the test with following options:
Number of threads: 20Initializing random number generator from current time
Initializing worker threads...
Threads started!
OLTP test statistics:
    queries performed:        read:                            935592 --读总数
        write:                           267295 --写总数
        other:                           133650 --其他操作(CURD之外的操作,例如COMMIT)
        total:                           1336537 --全部总数
    transactions:                        66822  (556.77 per sec.) --总事务数(每秒事务数)    read/write requests:                 1202887 (10022.55 per sec.) --读写总数(每秒读写次数)
    other operations:                    133650 (1113.58 per sec.)  --其他操作总数(每秒其他操作次数)
    ignored errors:                      6      (0.05 per sec.)  --总忽略错误总数(每秒忽略错误次数)
    reconnects:                          0      (0.00 per sec.) --重连总数(每秒重连次数)
General statistics: --常规统计
    total time:                          120.0180s --总耗时
    total number of events:              66822 --共发生多少事务数
    total time taken by event execution: 2399.7900s  --所有事务耗时相加(不考虑并行因素)
    response time:
         min:                                  2.76ms --最小耗时
         avg:                                 35.91ms --平均耗时
         max:                               1435.19ms --最长耗时
         approx.  95 percentile:              84.22ms --超过95%平均耗时
Threads fairness: --并发统计
    events (avg/stddev):           3341.1000/37.54 --总处理事件数/标准偏差
    execution time (avg/stddev):   119.9895/0.02--总执行时间/标准偏差


About Me

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2670273/,如需转载,请注明出处,否则将追究法律责任。