数据库压力测试的关键点,就是查看数据库在多个用户并发压力下的表现,以及在高并发情况下系统的处理能力和系统资源的使用情况,从而找出相应的性能瓶颈所在。
数据库性能测试指标主要可分为以下三大类。
·数据库并发数:当前系统所能承受的最大用户数,也就是系统能够支持的最大客户端数量。
·服务器资源(CPU、I/O、内存)使用率:在各种负载压力下,服务器CPU的处理时间,I/O响应情况和内存使用率。
·数据库的可靠性:在连续运行的状态下,系统正常运行的时间。
大多数负载测试工具可以分为以下几大类。
·I/O测试。
·RDBMS(Relational Database Management System,关系数据库管理系统)层I/O测试。
·数据库方面的应用程序级别测试工具。
·应用方向的应用程序级别测试工具。
由于第四种负载测试工具涉及真实的应用场景建模,一般需要应用配合完成。而前三种不需要应用的参与,DBA也可以自行完成。下面就来详细介绍前三种测试方法。
I/O测试将I/O请求发送到存储设备并测量响应时间。I/O测试主要分为只读、读/写、随机I/O、顺序I/O等几大类,可使用Oracle自带的I/O测试工具Orion对Oracle RDBMS I/O工作负载进行建模。
对于OLTP(Online Transactional Processing,联机事务处理)系统,一般需要大量并发小I/O,混合少量大I/O,测试时我们可以不断增加随机小I/O的并发数来观察IOPS(Input/Output Per Second,每秒I/O数)情况。而对于OLAP(Online Analytical Processing,联机分析处理)系统则恰恰相反,需要并发大I/O,固定少量小I/O。
(1)使用参数说明
强制参数项:运行的工作负载类型(simple、normal、advanced、dss、oltp),主要区别如表1-7所示。
表1-7 工作负载类型
自定义参数项,如表1-8所示。
表1-8 自定义参数
(2)Orion测试用例
<!--OLTP可伸缩性测试--> shell> orion -testname baseoltp -run advanced -duration 180 -matrix row -num_large 0 -write 20 shell> orion -testname oltp -run advanced -duration 600 -matrix point -num_large 0 -num_small 10 -write 20 & <!--#模拟LGWR(日志写进程)--> shell> orion -testname lgwr -run advanced -duration 120 -matrix point -num_large 1 -num_small 0 -type seq -num_streamIO 1 -size_large 5 -write 100 & <!--#模拟ARCH--> shell> orion -testname arch -run advanced -duration 180 -matrix point -num_large 2 -num_small 0 -type seq -num_streamIO 1 -size_large 1024 -write 50 &
以下是Orion I/O测试性能指标。
小I/O包含iops和lat两个性能测试指标,具体说明如下。
·iops:每秒平均I/O数,{test name}_{date}_{time}_iops.csv。
·lat:平均I/O响应时间,{test name}_{date}_{time}_lat.csv。
大I/O的性能测试指标为mbps,说明如下。
mbps:每秒吞吐量,{test name}_{date}_{time}_mbps.csv。
Oracle RDBMS 11.2.0.1及以上版本已经集成了Orion工具,不需要单独下载。
Orion仅停留在操作系统层,无法模拟RDBMS层的I/O情况。本节介绍的工具将进一步反映RDBMS层I/O的调用。
1.SLOB
可以使用简单的数据库操作来模拟负载,然后根据分配给数据库的SGA大小,测试CPU、内存(逻辑I/O)和存储(物理I/O)。该工具通过索引范围扫描和数据块查找来模拟整个过程。SLOB(Silly Little Oracle Benchmark,Oracle基准测试)支持的测试类型具体如下。
·支持Oracle逻辑读。
·支持物理随机单块读取(按数据文件顺序读取)。
·支持随机单块写入。
·支持大量redo日志写入。
SLOB下载地址为 https://kevinclosson.net/slob/ 。
进行SLOB测试的前提条件具体如下。
·需要创建测试表空间,用于容纳SLOB初始化创建的对象。
·运行初始化setup.sh,默认空间要求大小约为15GB。
·将system用户密码修改为manager。
千万不要在生产环境上测试。
解压工具包的命令如下:
shell> tar -xvf 2020.01.30.slob_2.5.2.4.tar shell> cd SLOB
运行初始化脚本的命令如下:
shell> sh setup.sh OLTP 20 NOTIFY : 2020.06.14-16:29:44 : Begin SLOB 2.5.2.4 setup. NOTIFY : 2020.06.14-16:29:44 : ADMIN_CONNECT_STRING: "system/manager" NOTIFY : 2020.06.14-16:29:44 : Load parameters from slob.conf: SCALE: 80M (10240 blocks) SCAN_TABLE_SZ: 1M (128 blocks) LOAD_PARALLEL_DEGREE: 2 ADMIN_SQLNET_SERVICE: "" SYSDBA_PASSWD: "manager" DBA_PRIV_USER: "system" Note: setup.sh will use the following connect strings as per slob.conf: Admin Connect String: "system/manager" Non-Admin Connect String: " " NOTIFY : 2020.06.14-16:29:44 : Testing Admin connect using "sqlplus -L system/manager" NOTIFY : 2020.06.14-16:29:49 : Dropping prior SLOB schemas. This may take a while if there is a large number of old schemas. ………… NOTIFY : 2020.06.14-16:35:57 : NOTIFY : 2020.06.14-16:35:57 : NOTE: No errors detected but if ./slob_data_ load_summary.txt shows errors then NOTIFY : 2020.06.14-16:35:57 : examine /tmp/SLOB_distribution-2.5.2.4/SLOB/cr_ tab_and_load.out NOTIFY : 2020.06.14-16:35:57 : SLOB setup complete. Total setup time: (373 seconds) NOTIFY : 2020.06.14-16:35:57 : Please do not forget to compile the wait kit. NOTIFY : 2020.06.14-16:35:57 : Please change directories to ./wait_kit and execute make(1). NOTIFY : 2020.06.14-16:35:57 : Example: NOTIFY : 2020.06.14-16:35:57 : $ cd ./wait_kit NOTIFY : 2020.06.14-16:35:57 : $ make
OLTP是用于压力测试而创建的表空间名字,20表示需要创建的用户数量(默认是128)。
根据提示编译工具包,命令如下:
shell> cd ./wait_kit shell> make
默认情况下,setup.sh执行时应读取slob.conf配置文件。
SLOB执行测试的命令如下:
shell> sh ./runit.sh NOTIFY : 2020.06.14-17:05:55 : For security purposes all file and directory creation and deletions NOTIFY : 2020.06.14-17:05:55 : performed by ./runit.sh are logged in: /tmp/ SLOB_distribution-2.5.2.4/SLOB/.file_operations_audit_trail.out. NOTIFY : 2020.06.14-17:05:55 : SLOB TEMPDIR is /tmp/.SLOB.2020.06.14.170555. SLOB will delete this directory at the end of this execution. NOTIFY : 2020.06.14-17:05:55 : Sourcing in slob.conf ………… <!--读取到的配置信息--> EXTERNAL_SCRIPT: "" Note: runit.sh will use the following connect strings as per slob.conf settings: Admin Connect String: "system/manager" NOTIFY : 2020.06.14-17:05:57 : Clearing temporary SLOB output files from previous SLOB testing. NOTIFY : 2020.06.14-17:05:57 : Testing admin connectivity to the instance to validate slob.conf settings. NOTIFY : 2020.06.14-17:05:57 : Testing connectivity. Command: "sqlplus -L system/manager". NOTIFY : 2020.06.14-17:05:58 : Next, testing 20 user (non-admin) connections... NOTIFY : 2020.06.14-17:05:58 : Testing connectivity. Command: "sqlplus -L user1/ user1". NOTIFY : 2020.06.14-17:05:59 : Testing connectivity. Command: "sqlplus -L user20/user20". NOTIFY : 2020.06.14-17:06:00 : Performing redo log switch. NOTIFY : 2020.06.14-17:06:45 : Redo log switch complete. Setting up trigger mechanism. NOTIFY : 2020.06.14-17:06:55 : Running iostat, vmstat and mpstat on current host--in background. NOTIFY : 2020.06.14-17:06:55 : Connecting 1 (THREADS_PER_SCHEMA) session(s) to 20 schema(s) ... NOTIFY : 2020.06.14-17:06:56 : NOTIFY : 2020.06.14-17:06:56 : Pausing for 3 seconds before triggering the test. NOTIFY : 2020.06.14-17:06:59 : Test has been triggered. Processes are executing. Warm-up phase. NOTIFY : 2020.06.14-17:07:29 : Executing awr "before snap" procedure. Command: "sqlplus -S -L system/manager". NOTIFY : 2020.06.14-17:12:57 : Before awr snap ID is 2738 NOTIFY : 2020.06.14-17:12:57 : NOTIFY : 2020.06.14-17:12:57 : List of monitored sqlplus PIDs written to /tmp/. SLOB.2020.06.14.170555/32236.f_wait_pids.out. FATAL : 2020.06.14-17:13:07 : FATAL : 2020.06.14-17:13:07 : FATAL : 2020.06.14-17:13:07 : SLOB process monitoring discovered 20 sqlplus processes have aborted. FATAL : 2020.06.14-17:13:07 : Please examine /tmp/SLOB_distribution-2.5.2.4/ SLOB/slob_debug.out. FATAL : 2020.06.14-17:13:07 : FATAL : 2020.06.14-17:13:07 : Terminating the remaining SLOB sqlplus processes... FATAL : 2020.06.14-17:13:09 : This is not a successful SLOB test. Some sqlplus processes aborted. FATAL : 2020.06.14-17:13:09 : Aborting execution. Cleaning up SLOB temporary directory (/tmp/.SLOB.2020.06.14.170555).
runit.sh脚本是性能测试驱动程序,默认情况下使用的是slob.conf中的参数设置,如果有需要,则可以使用命令行或直接修改slob.conf配置文件,重点参数列举如下。
·UPDATE_PCT=10:DML(Data Manipulation Language,数据操纵语言)占比,默认为10%。
·SCALE=80M:数据加载大小,默认为80MB。
·SCAN_TABLE_SZ=1M:单个测试表格的大小。
·LOAD_PARALLEL_DEGREE=2:数据加载并发量。
·RUN_TIME=300:测试时间,默认为5min,超过时间会自动结束。
可以根据不同的测试场景修改配置文件slob.conf的参数。
参数较多,这里就不逐一介绍了,有兴趣的读者可以参考SLOB官方文档。
SLOB执行前会创建快照点,如上述代码段所示。2738为笔者的快照点,结束后会在当前目录下生成I/O的测试结果信息mpstat.out、iostat.out和vmstat.out。
2.Oracle自带I/O测试功能
除了SLOB,Oracle官方还提供了DBMS_RESOURCE_MANAGER.CALIBRATE_IO存储过程,用于测试当前数据库实例的I/O性能。相比于Orion使用程序模拟Oracle的I/O操作,DBMS_RESOURCE_MANAGER.CALIBRATE_IO是在真实的实例环境中进行测试,其更能反映真实情况。
DBMS_RESOURCE_MANAGER.CALIBRATE_IO参数如下:
DBMS_RESOURCE_MANAGER.CALIBRATE_IO ( num_physical_disks IN PLS_INTEGER DEFAULT 1, max_latency IN PLS_INTEGER DEFAULT 20, max_iops OUT PLS_INTEGER, max_mbps OUT PLS_INTEGER, actual_latency OUT PLS_INTEGER);
常用的输入参数具体如下。
·num_physical_disks:当前系统中存储盘的个数,根据实际情况填写即可。
·max_latency:所能容忍的最大延迟(单位为ms),对于OLTP系统,建议将该值设置在20以内。
测试之前需要确认当前环境是否开启了异步I/O,命令如下:
SQL> SELECT d.name, i.asynch_io FROM v$datafile d, v$iostat_file i WHERE d.file# = i.file_no AND i.filetype_name = 'Data File'; NAME ASYNCH_IO -------------------------------------- --------- +DATA/jason/datafile/system01.dbf ASYNC_OFF +DATA/jason/datafile/sysaux01.dbf ASYNC_OFF +DATA/jason/datafile/undotbs01.dbf ASYNC_OFF +DATA/jason/datafile/users01.dbf ASYNC_OFF <!--AYNC_OFF表示未开启,开启异步I/O(需要重启数据库才能生效)--> SQL> ALTER SYSTEM SET filesystemio_options=setall SCOPE=SPFILE; SQL> set serveroutput on; SQL> DECLARE lat INTEGER; iops INTEGER; mbps INTEGER; BEGIN DBMS_RESOURCE_MANAGER.CALIBRATE_IO(1, 20, iops, mbps, lat); DBMS_OUTPUT.PUT_LINE('max_iops = ' || iops); DBMS_OUTPUT.PUT_LINE('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); end;
输出结果具体如下:
Max IOPS = 51800 Max MBPS = 654 Latency = 8
·max_iops:表示每秒可以维持的最大I/O请求数。
·max_mbps:表示可以维持的最大I/O吞吐量。
·actual_latency:以max_iops表示当前I/O请求的平均延迟,单位为ms。
同样,我们也可以通过视图v$io_calibration_status查看测试结果。
1.Swingbench
Swingbench是一个免费的负载生成器和基准测试工具,其支持Oracle数据库(11g、12c、18c、19c)。Swingbench的开发目的主要是展示RAC的负载和测试,也可用于单实例环境。下载地址为 http://www.dominicgiles.com/downloads.html 。
安装Swingbench 2.5或2.6,运行环境需要是Java 8及以上版本,如果系统JDK版本为1.8以下的版本,则需要将JDK版本升级到1.8及以上版本。上传安装包解压即可。
Swingbench模拟了一套订单业务逻辑,通过创建SOE用户,模拟产品和订单业务,可以自定义数据量的大小,本次测试将生成1GB的业务数据。由于条件有限,下面笔者使用虚拟机演示用户并发数分别为5、10、20和30的并发测试。
测试环境前期初始化导入1GB的数据量,测试过程中,我们需要关注服务器CPU、内存、磁盘在压力期间的性能数据,以及测试返回的TPS(吞吐量)、IOPS(每秒读写次数)、RT(响应时间)等数据。
进入Swingbench/bin目录运行Swingbench,执行测试,修改数据库连接名、用户连接数设置,每项的测试时间均为10min。
并发数为5时,Swingbench指标如图1-2所示,AWR(Automatic Workload Repository,自动工作负载库)报告部分指标如图1-3所示。
并发数为10时,Swingbench指标如图1-4所示,AWR报告部分指标如图1-5所示。
并发数为15时,Swingbench指标如图1-6所示,AWR报告部分指标如图1-7所示。
并发数为20时,Swingbench指标如图1-8所示,AWR报告部分指标如图1-9所示。
并发数为30时,Swingbench指标如图1-10所示,AWR报告部分指标如图1-11所示。
图1-2 并发数为5时的Swingbench指标
图1-3 并发数为5时的AWR报告部分指标
图1-4 并发数为10时的Swingbench指标
图1-5 并发数为10时的AWR报告部分指标
图1-6 并发数为15时的Swingbench指标
图1-7 并发数为15时的AWR报告部分指标
图1-8 并发数为20时的Swingbench指标
图1-9 并发数为20时的AWR报告部分指标
图1-10 并发数为30时的Swingbench指标
图1-11 并发数为30时的AWR报告部分指标
测试过程中,结合数据库性能表现及压测数据,重复测试,最终形成测试报告,如表1-9和表1-10所示。
表1-9 不同并发数下Swingbench的响应指标
表1-10 不同并发数下数据库响应指标
对于读写混合模式,IOPS的理想值大约为158 820,在该理想值时,TPS达到峰值940。OLTP系统在并发数为30时,CPU资源达到瓶颈,此时可以考虑增加CPU计算能力。
结合数据库性能表现以及压力测试的数据来看,在测试环境中,当并发数为20时,IOPS、CPU、TPS均达到了峰值。由于测试环境资源有限,此测试结果仅供参考。建议大家进行实际业务模拟测试,以评估出理想的数值。