一、概述
对应用系统来说数据库性能的好坏直接影响应用系统的性能,对于数据库进行性能测试能更加准确地分析识别数据库是否可以有效地承受来自多个用户的并发访问。因此,数据库性能测试对应用系统性能有重要意义,在应用系统的测试工作中,将数据库作为一个独立的部分进行充分测试,能更准确地发现数据库相关问题并做出相关优化,为应用系统的质量增加可靠的保障。
1.1.数据库性能测试
数据库性能测试是在确定的环境下针对压测需求进行的一种测试,通过自动化测试工具模拟多种正常、峰值或者异常等负载条件来对数据库的各项性能指标进行测试。目的是通过数据库性能测试,测试是否满足负载需求,找到优化数据库并提高其性能的方法,对数据库的完善和进一步开发有着指导作用。数据库性能测试需要使用相关的工具,我们调研了以下开源/免费和商业的数据库性能测试工具(开源软件数据来自于GitHub,统计截至2020/2/21):
数据库性能测试相关的开源软件中,Apache基金会开源的JMeter、sysbench星级排名靠前,HammerDB是数据库事务处理性能委员会TPC组织下的数据库性能测试工具,所以本文选取了星级排名前两名的JMeter、sysbench和HammerDB。另外,本文还调研了Oracle员工开发的针对Oracle的数据库基准性能测试工具SwingBench和商业软件LoadRunner。
1.2.测试指标
对数据库性能测试结果进行分析需使用以下监控指标:并发数、响应时间、吞吐量。此外,数据库服务器上的监控指标也能辅助进行结果分析:CUP使用率、内存使用率
二、工具简介
2.1.Jmeter
2.1.1.简介
JMeter是Apache基金会开源的基于Java实现的压力测试工具,提供如下功能:1.对不同类型的应用/服务等进行性能测试;2.支持图形化界面和命令行模式;3.对性能测试结果提供图形分析功能;4.对于高负载施压的场景,支持部署分布式环境。JMeter作为一款开源软件,扩展性强,具有强大的开源社区支持,社区内开发者活跃程度高。
JMeter涉及到的主要组件如下:测试计划、取样器、前置处理器、配置元件、后置处理器、断言、监听器、逻辑控制器。
JMeter运行时,主要有以下步骤:
1.通过配置组件,进行数据、环境准备;
2.利用取样器模拟用户请求;
3.控制运行,使用线程组来设置运行场景,利用逻辑控制器来控制业务(实际上即是控制取样器);
4.收集结果,利用断言来验证测试结果,利用监听器来收集显示测试结果。
2.1.2.数据库性能测试
JMeter需要运行在Java 8以上的,能正确运行Java的操作系统均可安装JMeter。JMeter支持的数据库如下:hsqldb、Oracle、DB2、MySQL、Microsoft SQL Server、PostgreSQL、H2、MariaDB、Sybase AES等。JMeter进行数据库性能测试的步骤如下:
1.创建测试计划、线程组:线程组指示JMeter模拟的用户数量,发送请求的循环次数或请求持续的时间等。
2.添加JDBC连接池配置元件:进入JDBC连接配置页面,配置数据库连接信息,如数据库URL、JDBC驱动类、数据库用户名、密码、数据库连接池连接数等属性。
3.添加JDBC采样器:在线程组元素上添加JDBC请求采样器,在JDBC请求采样器中配置连接池信息、SQL执行类型、SQL语句、SQL参数等。测试可以使用参数来替换不同的插入记录或者查询语句、查询条件等,参数可以使用简单的随机字符串或随机数,或者准备参数化文件,读取文件中的参数值。
4.压测调试:添加结果树,用于进行调试结果查看,并将线程数和循环次数设置为比较小的值。调试运行时,要对JDBC请求发送内容、响应内容和结果进行查看,判断请求是否成功。调试运行完成后查看结果树内容。
5.压测运行:在运行测试之前需将聚合报告监听器添加到测试计划元素或线程组元素之下,聚合报告提供性能测试的汇总聚合结果。然后在线程组元素中进行压测运行设置,按测试需求进行并发用户数和运行时间等设置。压测设置准备完成后,启动场景。
测试结束后可以查看到性能测试的相关指标:
请求数、响应时间(平均、最大、最小、90%、95%、99%)、请求失败率、吞吐量(每秒请求数)。除此之外,JMeter在添加了监控插件后,能监控到测试过程中服务器CPU、内存、磁盘IO等监控指标。
2.2.Sysbench
2.2.1.简介
Sysbench是一个基于LuaJIT的可自定义脚本的多线程性能测试工具,主要包括CPU、磁盘IO、内存、数据库的性能基准测试。基准测试可以理解为针对系统的一种性能测试,基准测试不关心业务逻辑,使用Sysbench的基准测试脚本即可完成测试,数据可以由工具生成,更加简单易于测试;除了基准测试外,Sysbench还支持自定义脚本进行性能测试。
2.2.2.数据库性能测试
Sysbench可运行在Debian、Ubuntu、RHEL、CentOS、Fedora和macOS上,从1.0版本起放弃了对Windows的支持。1.0以后版本支持MySQL、PostgreSQL。
使用Sysbench可以进行OLTP基准测试,模拟一个简单事务处理系统的工作负载,OLTP基准测试可以使用Sysbench自带的Lua脚本。如果想结合应用自身的业务进行测试可以通过自定义的Lua脚本来进行测试。Sysbench自带的Lua测试的步骤大致分为以下四个步骤:
1.准备数据:创建好需要进行测试的数据库,使用命令行工具,通过脚本在指定数据库中创建相关表,并插入相关的数据;下面的命令以oltp.lua为脚本,在MySQL数据库创建了数据表sbtest1,并插入了1000条数据:
sysbench oltp.lua --oltp-table-size=1000 --mysql-user=用户名 --mysql-host=IP --mysql-password=密码 --mysql-port=3306 --mysql-db=sbtest prepare |
2.运行测试:使用命令行工具,指定并发数对上一步创建的表和数据进行测试,测试结束后会生成测试结果;下面的命令使用10线程(--threads=10)测试60秒(--max-time=60),测试执行了10次基于主键的简单查询,1次范围查询,1次求和计算,1次排序查询,1次去重加排序查询,1次小字段更新,1次长字段更新,1次插入:
sysbench oltp.lua --mysql-host=IP --mysql-port=3306 --mysql-user=用户名--mysql-password=密码 --oltp_tables_count=1 --oltp-table-size=1000 --threads=10 --oltp-read-only=off --report-interval=10 --rand-type=uniform --time=60 run |
运行后的结果如下:
...... SQL statistics: queries performed: read: 72282 write: 20652 other: 10326 total: 103260 transactions: 5163 (85.88 per sec.) queries: 103260 (1717.59 per sec.) ignored errors: 0 (0.00 per sec.) General statistics: total time: 60.1175s total number of events: 5163 Latency (ms): min: 46.34 avg: 116.28 max: 1547.41 95th percentile: 142.39 sum: 600377.93 Threads fairness: events (avg/stddev): 516.3000/1.35 execution time (avg/stddev): 60.0378/0.04 |
3.清理数据:使用命令行工具,测试结束后清理创建的表和测试数据。
sysbench oltp.lua --mysql-host=IP --mysql-port=3306 --mysql-user=用户名--mysql-password=密码 --oltp_tables_count=1 --oltp-table-size=1000 --threads=10 cleanup |
测试结束后生成的测试结构报告中主要包含以下指标:
事务总数、每秒事务数、查询总数、每秒查询数、响应时间(包括平均、最小、最大、95%)。
2.3.HammerDB
2.3.1.简介
Hammerdb作为一个开源的数据库压力和基准测试工具,有图形用户界面和命令行两种形式。支持标准的TPC-C和TPC-H两种测试模型。TPC-C测试模拟了一个批发商的仓储管理环境,由TPC(Transaction Processing Performance Council)事务处理性能委员会提出,TPC是一个非营利性组织,成员包括大多数数据库产品厂商及服务器硬件供应商。该组织定义了一系列数据库基准,规范了数据库在事务处理性能方面的评测标准和测评结果,是目前业界公认的评测数据库性能的主流国际标准之一。
2.3.2.数据库性能测试
HammerDB支持Linux和Windows系统。支持的数据库包括Oracle, SQL Server, DB2, MySQL, MariaDB, PostgreSQL, Redis等。
1.准备测试数据:选择要测试的数据库类型和使用的测试基准,在Schema Build中点击Options配置数据库相关信息,然后点击build开始创建基准测试数据库。数据创建完成后,可以登录数据库中查询到相关数据(如果查询无结果,说明造数失败,会导致后续load测试无法进行)。
2.配置测试脚本:第1步中按照创建好了测试数据库tpcc,现在基于tpcc库进行oltp测试。左侧列表点击Driver Script的Option,配置数据库相关信息、测试持续时间等。在右侧的Script Editor中将载入标准测试驱动程序脚本,该脚本是由左侧Virtual User配置的虚拟用户运行的脚本,用于执行基准测试,可以根据需求对脚本进行修改:
3.创建虚拟用户,运行测试:指定虚拟用户数,然后点击Virtual User下的Create,创建虚拟用户,最后Run,此时,登录到数据库中,可以发现有配置的虚拟用户的线程在运行。
测试结束后可以查看到HammerDB提供的监控指标:吞吐量,单位为TPM(每分钟事务数)。
2.4.SwingBench
2.4.1.简介
SwingBench是基于JAVA开发的Oracle数据库性能基准测试工具,是免费软件。SwingBench生成负载来进行数据库测试,最后生成相关的响应时间、事务数等测试结果图表,有三种前端:SwingBench、CharBench、MiniBench,其中CharBench是命令行模式。
SwingBench包含6个基准测试程序:OrderEntry、SalesHistory、CallingCircle、StressTest等,可以模拟OLTP的应用场景:
1.OrderEntry:进行订单查询、处理、下单等操作,主要用于少量表的测试;
2.SalesHistory:主要用于测试基于大表(从1GB到1TB)的复杂查询的性能;
3.CallingCircle(不推荐使用):模拟在线电信应用的SQL,所有的基准测试程序都是CPU密集型;4.StressTest:用于对已知表进行insert、update和select操作测试。
此外,SwingBench还可以根据测试需求修改或新增相关的SQL来进行测试。
2.4.2.数据库性能测试
SwingBench需要运行在Java 8之上,能正确运行Java的操作系统均可安装SwingBench。SwingBench目前支持Oracle数据库,支持的版本有Oracle 12c, 18c, 19c。SwingBench的数据库测试步骤如下:
1.初始化测试数据:SwingBench按基准程序规则初始化测试数据。如OrderEntry使用oewizard程序初始化测试数据,SalesHistory使用shwizard程序初始化测试数据。根据向导进行配置,配置测试数据库的连接字符串//ip/sid以及sysdba用户的密码。
然后进行数据库schema配置,如表空间名称、表空间数据文件所在路径、选择创建的数据量等后,SwingBench将初始化测试数据。
2.进行基准测试:运行swingbench.bat,配置相关参数数据库的连接字符串//ip/sid、设置 insert,update ,select的比例、并发数、测试时间等,然后开始运行测试。如下图所示:
测试结束过程中,右下角将展现测试的结果图表:每分钟事务数(TPM)、每秒事务数(TPS)、响应时间、数据库CPU、每秒执行的DML数等。
2.5.LoadRunner
LoadRunner是一款发布于1993年11月的性能测试工具,作为一款历史悠久的商业性能测试工具,LoadRunner可用于各种体系架构的负载测试,能预测系统行为评估系统性能。
但作为商业软件,LoadRunner价格较高,安装过程较复杂,体积大、过于笨重,在实际设计执行压测时需要编写相应的脚本,对使用人员来说学习成本较高,此外缺少监控告警等支持,性能测试过程中难以实时发现问题。
2.5.1.简介
LoadRunner可划分为如下四个部分:
1.虚拟用户生成器(VuGen):捕捉用户业务流程,用于录制和生成性能测试脚本;
2.控制器:用于提供场景设计与场景监控,能够实时监控脚本的运行情况;
3.负载生成器:模拟用户对服务器发起请求;
4.分析器:汇集来自各种负载生成器的日志并格式化报告,以便可视化运行结果数据和监控数据。
2.5.2.数据库性能测试
LoadRunner可运行在Windows 8.1(64 bit)、Windows 10(64 bit)、Windows Server 2012 R2/2016/2019(64 bit)、Red Hat系列Linux(包括Oracle Linux)、Ubuntu、SUSE Linux Enterprise Server。支持进行Microsoft SQL Server、Oracle、MySQL、Sybase、DB2等数据库的测试。
LoadRunner可以编写脚本进行数据库性能测试,数据库相关方法的列表:
数据库性能测试主要有以下步骤:
1.连接到数据库;使用lr_db_connect连接数据库,该方法中指定的数据库连接串可以通过LoadRunner内置的Connection String Generator来根据要连接的数据库生成对应的连接串。进行性能测试时,推荐将连接数据库步骤放到vuser_init,将断开数据库连接步骤放到vuser_end中。
2.通过SQL查询获取数据或进行插入、更新、删除等操作,以下脚本进行了Addresses表查询操作,然后获取一行的Name和city值:
Action() { lr_db_executeSQLStatement("StepName=MyStep", "ConnectionName=MyConnection","SQLQuery=SELECT * FROM Addresses", "DatasetName=ds1", LAST); lr_db_getvalue("StepName=MyStep", "DatasetName=ds1", "Column=Name", "Row=next", "OutParam=nameParam", LAST); lr_db_getvalue("StepName=MyStep", "DatasetName=ds1", "Column=city", "Row=current", "OutParam=cityParam", LAST); return 0; } |
3.验证数据库返回的值是否正确:根据需要加入检查点,验证数据库操作返回的值与对比值进行比较,如下验证了实际值city和从第2步中查询的数据库值是否相等:
lr_checkpoint("StepName=validateCityParam", "ActualValue={city}", "ExpectedValue={ cityParam }", "Compare=Equals", "StopOnValidationError=false", LAST); |
4,断开数据库连接:最后需断开数据库连接,推荐在vuser_end中断开连接,如下所示:
vuser_end() { lr_db_disconnect("StepName=myStep", "ConnectionString=Initial Catalog=MyDB;Data Source=LAB1.devlab.net;user id =sa ;password = soarnd1314;" ,"ConnectionName=MyConnection", "ConnectionType=SQL", LAST); return 0; } |
测试结束后,LoadRunner提供了丰富的图形化测试结果展示,如每秒事务数(TPS)、响应时间、数据库服务器CPU使用率、内存使用率等。
三、工具对比
对于上述工具,本文对比分析了各工具的优缺点,如下表所示:
四、总结
本文介绍了五种数据库性能测试工具的背景和原理,并进行了工具的对比分析,对于结合自身业务进行数据库性能测试的使用场景,JMeter在支持数据库类型、易用性、安装部署、生态发展等方面优势更多;对于基准测试的使用场景,sysbench在支持数据库类型、测试指标完备性方面弱于SwingBench,sysbench开源社区的生态发展优于HammerDB,SwingBench由个人开发,代码未开源,可能会出现软件bug得不到修复、使用得不到支持等风险。因此每种工具都有自身的优势和劣势,大家可以针对自身需求选取合适的工具。
本文转载51测试网公众号