MySQL服务器基准测试

1、基准测试简介

一、什么是基准测试

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

基准测试与压力测试mysql

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

二、基准测试的做用

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

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

三、基准测试的指标

常见的数据库指标包括:数据库

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

四、基准测试的分类

对MySQL的基准测试,有以下两种思路:浏览器

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

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

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

2、sysbench

一、sysbench简介

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

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

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

二、sysbench安装

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

(1)下载解压

wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0.zip"
unzip sysbench-1.0.zip
cd sysbench-1.0

(2)安装依赖

yum install automake libtool –y

 (3)安装

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

./autogen.sh
./configure
export LD_LIBRARY_PATH=/usr/local/mysql/include #这里换成机器中mysql路径下的include
make
make install

(4)安装成功

[root@test sysbench-1.0]# sysbench --version
sysbench 1.0.9

三、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,而是直接指定脚本。

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

sysbench --test=./tests/include/oltp_legacy/oltp.lua
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

四、sysbench使用举例

在执行sysbench时,应该注意:

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

(2)能够逐步增长客户端的并发链接数(--thread参数),观察在链接数不一样状况下,MySQL服务器的表现;如分别设置为10,20,50,100等。

(3)通常执行模式选择complex便可,若是须要特别测试服务器只读性能,或不使用事务时的性能,能够选择simple模式或nontrx模式。

(4)若是连续进行屡次测试,注意确保以前测试的数据已经被清理干净。

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

(1)准备数据

单表: 
  # sysbench  
  --test=$SYSBENCH_HOME/sysbench/tests/db/oltp.lua  
  --mysql-user=$MYSQL_USER  
  --mysql-password=$MYSQL_PASSWORD 
  --mysql-host=$MYSQL_HOST 
  --mysql-port=$MYSQL_PORT 
  --mysql-socket=$MYSQL_SOCKET 
  --mysql-table-engine=$MYSQL_TABLE_ENGINE //表引擎,建议值innodb 
  --oltp-table-count=1 //表数 
  --oltp-table-size=N //表大小,建议值2000W 
  --num-threads=$NUM_THREADS //线程数,建议值$MAX_CORE_NUM/2 
注:  $MAX_CORE_NUM:$(grep "processor" /proc/cpuinfo | wc -l)

多表: 
  # sysbench 
  --test=$SYSBENCH_HOME/sysbench/tests/db/oltp.lua  
  --mysql-user=$MYSQL_USER  
  --mysql-password=$MYSQL_PASSWORD 
  --mysql-host=$MYSQL_HOST 
  --mysql-port=$MYSQL_PORT 
  --mysql-socket=$MYSQL_SOCKET 
  --mysql-table-engine=$MYSQL_TABLE_ENGINE //表引擎,建议值innodb 
  --oltp-table-count=N //表数,建议值为32~256,步长2n 
  --oltp-table-size=N //表大小,建议值2亿
   --num-threads=$NUM_THREADS //线程数,建议值$MAX_CORE_NUM/2 

如:

sysbench --test=oltp --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=120 --report-interval=10 prepare

注:sysbench 0.5及之后版本已取消OLTP模块,开始使用Lua脚本,Lua脚本的位置默认在$SYSBENCH_HOME/sysbench/tests/db/xxx.lua

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

 

(2)执行测试

测试用例1 单表OLTP -> 只读测试

# sysbench  
 --test=$SYSBENCH_HOME/sysbench/tests/db/oltp.lua
 --mysql-user=$MYSQL_USER
  --mysql-password=$MYSQL_PASSWORD
  --mysql-host=$MYSQL_HOST 
  --mysql-port=$MYSQL_PORT 
  --mysql-socket=$MYSQL_SOCKET 
  --mysql-db=$MYSQL_DB 
  --oltp-read-only=$OLTP_READ_ONLY 
  --max-requests=$MAX_REQUESTS 
  --num-threads=$NUM_THREADS 
  --oltp-dist-type=$OLTP_DIST_TYPE 
  --report-interval=$REPORT_INTERVAL  run  

测试参数: 
--mysql-db=STRING //测试库,默认值sbtest 
--oltp-read-only //是否开启只读 
--max-requests=N //请求数,建议值50W 
--num-threads=N //线程数,建议值16~$MYSQL_THREAD_CACHE_SIZE ,步长2n 
--oltp-dist-type=STRING //oltp测试数据分布类型,建议值uniform 
 
 注:--oltp-read-only参数不要跟STRING值。默认为OFF。若是添加STRING值会出现重复键错误

 测试用例2:单表OLTP -> 混合读写测试

# sysbench  
--test=$SYSBENCH_HOME/sysbench/tests/db/oltp.lua 
--mysql-user=$MYSQL_USER  
--mysql-password=$MYSQL_PASSWORD 
 --mysql-host=$MYSQL_HOST 
--mysql-port=$MYSQL_PORT 
--mysql-socket=$MYSQL_SOCKET 
--mysql-db=$MYSQL_DB 
--max-requests=$MAX_REQUESTS 
--num-threads=$NUM_THREADS 
--oltp-dist-type=$OLTP_DIST_TYPE 
 --report-interval=$REPORT_INTERVAL  run 

测试参数: 
--mysql-db=STRING //测试库,默认值sbtest 
--max-requests=N //请求数,建议值50W 
--num-threads=N //线程数,建议值16~$MYSQL_THREAD_CACHE_SIZE ,步长2n 
--oltp-dist-type=STRING //oltp测试数据分布类型,建议值uniform 

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

sysbench --test=oltp --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=120 --report-interval=10 run >> /home/test/mysysbench.log

(3)清理数据

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

sysbench --test=oltp --mysql-host=192.168.10.10 --mysql-port=3306 --mysql-user=root --mysql-password=123456 cleanup

五、测试结果

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

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

queries:查询总数及qps

transactions:事务总数及tps

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

3、建议

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

一、在开始测试以前,应该首先明确:应采用针对整个系统的基准测试,仍是针对MySQL的基准测试,仍是两者都须要。

二、若是须要针对MySQL的基准测试,那么还须要明确精度方面的要求:是否须要使用生产环境的真实数据,仍是使用工具生成也能够;前者实施起来更加繁琐。若是要使用真实数据,尽可能使用所有数据,而不是部分数据。

三、基准测试要进行屡次才有意义。

四、测试时须要注意主从同步的状态。

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

 

参考文献:

https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html

相关文章
相关标签/搜索