当前位置: 首页 > 科技观察

MySQLbenchmark测试和sysbench工具详解

时间:2023-03-12 10:19:16 科技观察

前言作为后台开发人员,对数据库进行benchmark是非常必要的,掌握数据库的性能。本文介绍了MySQL基准测试的基本概念以及使用sysbench对MySQL进行基准测试的详细方法。文中有疏漏,欢迎批评指正。一、基准测试简介1、什么是基准测试数据库基准测试是对数据库性能指标进行定量的、可重现的、可比较的测试。基准测试和压力测试基准测试可以理解为对系统的一种压力测试。但基准测试不关心业务逻辑,更简单、更直接、更容易测试。数据可由工具生成,不要求真实性;而压力测试一般会考虑业务逻辑(比如购物车业务),需要真实的数据。2.基准测试的作用对于大多数Web应用来说,整个系统的瓶颈在于数据库;原因很简单:web应用中的其他因素,如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数)等)、缓存,很容易提升性能通过横向扩展(俗称加法机)。对于MySQL,由于数据一致性的要求,无法通过增加机器来分散写入数据库的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表等方式来降低压力,但是相对于系统其他组件的横向扩展来说,实在是太有限了。数据库基准测试的作用是分析数据库在当前配置(包括硬件配置、操作系统、数据库设置等)下的性能,从而找出MySQL的性能阈值,并根据需要调整配置实际系统要求。3.基准测试指标常见的数据库指标包括:TPS/QPS:衡量吞吐量。响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等。时间百分比有更大的参考意义,比如前95%的请求的最大响应时间。.并发性:同时处理的查询请求数。4.基准测试的分类对于MySQL基准测试,有以下两种思路:(1)对整个系统进行基准测试:通过http请求进行测试,比如通过浏览器、APP或者postman等测试工具。该方案的优点是可以更好的针对整个系统,测试结果更加准确;缺点是设计复杂,实施困难。(2)只针对MySQL进行Benchmark测试:优缺点与针对整个系统的测试正好相反。在针对MySQL进行基准测试时,通常会使用专门的工具,例如mysqlslap、sysbench等。其中sysbench比mysqlslap更通用、更强大,更适合Innodb(因为它模拟了Innodb的很多IO特性)。下面介绍使用sysbench进行基准测试的方法。2、Sysbench1、sysbench简介sysbench是一个跨平台的基准测试工具,支持多线程和多数据库;主要包括以下测试:cpu性能、磁盘io性能、调度器性能、内存分配和传输速度、POSIX线程性能、数据库性能(OLTPBenchmarkTest)本文主要介绍数据库性能的测试。2、安装sysbench时,本文使用的环境是CentOS6.5;其他Linux系统的安装方法类似。MySQL版本是5.6。(1)下载并解压wgethttps://github.com/akopytov/sysbench/archive/1.0.zip-O"sysbench-1.0.zip"unzipsysbench-1.0.zipcdsysbench-1.0(2)安装依赖yuminstallautomakelibtool–y(3)安装在安装之前,请确保您位于先前解压缩的sysbench目录中。./autogen.sh./configureexportLD_LIBRARY_PATH=/usr/local/mysql/include#这里替换成本机mysql路径下的includemakemakeinstall(4)[root@testsysbench-1.0]#sysbench--版本sysbench1.0.93,sysbench语法执行sysbench–help,可以看到sysbench的详细用法。sysbench的基本语法如下:sysbench[options]...[testname][command]下面介绍实际使用中常用的参数和命令。(1)commandcommand是sysbench要执行的命令,包括prepare、run和cleanup。顾名思义,prepare是为测试提前准备数据,run是执行正式测试,cleanup是测试完成后清理数据库。(2)testnametestname指定要执行的测试。在老版本的sysbench中,可以通过--test参数指定测试脚本;在新版本中,-test参数已经被声明为废弃,可以使用-test代替直接指定脚本。例如下面两种方法效果一样:sysbench--test=./tests/include/oltp_legacy/oltp.luasysbench./tests/include/oltp_legacy/oltp.lua测试用的脚本是lua脚本,可以使用sysbench自带的脚本,也可以自己开发。对于大多数应用程序,使用sysbench附带的脚本就足够了。在不同版本的sysbench中,lua脚本的位置可能不同。您可以使用find命令在sysbench路径中搜索oltp.lua。P.S.:大部分数据业务都是oltp类型的。如果你不知道oltp是什么,那么你的数据服务大概率是oltp类型的。(3)optionsysbench的参数很多,其中比较常用的有:MySQL连接信息参数--mysql-host:MySQL服务器主机名,默认localhost;如果在本机使用localhost报错,提示无法连接MySQL服务器,更改成本机的IP地址应该就可以了。–mysql-port:MySQL服务器端口,默认3306–mysql-user:用户名–mysql-password:密码MySQL执行参数–oltp-test-mode:执行模式,包括simple、nontrx和complex,默认为complex。在简单模式下,只测试简单的查询;nontrx不仅可以测试查询,还可以插入更新等,但不使用事务;复杂模式下,测试最全面,会测试增删改查,会用到事务。您可以根据自己的需要选择测试模式。–oltp-tables-count:测试表的个数,根据实际情况选择–oltp-table-size:测试表的大小,根据实际情况选择–threads:并发连接数client–time:测试执行时间,单位是秒,值不能太短,可以选择120–report-interval:生成报告的时间间隔,单位是秒,比如104,sysbench使用example执行sysbench时要注意:(1)尽量不要在MySQL服务器上运行一方面,可能无法体现网络的影响(即使是局域网),另一方面,sysbench的运行(尤其是并发数设置高时)会影响MySQL服务器的性能。(2)可以逐渐增加客户端的并发连接数(-thread参数),观察不同连接情况下MySQL服务器的性能;例如设置为10、20、50、100等。(3)一般的执行方式可以很复杂。如果需要测试服务器的只读性能或不使用事务时的性能,可以选择简单模式或非trx模式。(4)如果连续进行了多次测试,确保之前测试的数据已经清理干净。下面是sysbench使用示例:(1)准备数据sysbench./tests/include/oltp_legacy/oltp.lua--mysql-host=192.168.65.66--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=10prepare其中,执行方式复杂,使用10张表,每张表10万条数据,客户端并发线程数10,执行时间120秒,每10秒生成一份报告。(2)执行测试,将测试结果导出到文件,供后续分析。sysbench./tests/include/oltp_legacy/oltp.lua--mysql-host=192.168.65.66--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=10run>>/home/test/mysysbench.log(3)清理数据测试完成后,清理数据,否则会影响后续测试。sysbench./tests/include/oltp_legacy/oltp.lua--mysql-host=192.168.65.66--mysql-port=3306--mysql-user=root--mysql-password=123456cleanup5。测试结果出来后,查看输出文件如下:其中,对我们比较重要的信息包括:queries:查询总数和qpstransactions:事务总数和tpsLatency-95thpercentile:最大响应时间前95%的请求,在本例中是344毫秒,这个延迟非常大,因为我使用的MySQL服务器的性能很差;这个值在正式环境中是绝对不能接受的。3、建议以下是使用sysbench的一些建议。1、在开始测试之前,应该明确:是用整个系统的benchmark测试,还是MySQL的benchmark测试,还是两者都用。2、如果需要对MySQL进行benchmark测试,还需要明确精度要求:是否需要使用生产环境的真实数据,还是使用工具生成;前者实施起来比较麻烦。如果要使用真实数据,尽量使用所有数据,而不是部分数据。3.基准测试需要多次运行才有意义。4、测试时注意主从同步状态。5.测试必须模拟多线程的情况。单线程的情况不仅不能模拟真正的效率,更不能模拟阻塞甚至死锁的情况。参考资料http://blog.csdn.net/oahz4699092zhao/article/details/53332105