购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 上线前的压力测试

数据库压力测试的关键点,就是查看数据库在多个用户并发压力下的表现,以及在高并发情况下系统的处理能力和系统资源的使用情况,从而找出相应的性能瓶颈所在。

数据库性能测试指标主要可分为以下三大类。

·数据库并发数:当前系统所能承受的最大用户数,也就是系统能够支持的最大客户端数量。

·服务器资源(CPU、I/O、内存)使用率:在各种负载压力下,服务器CPU的处理时间,I/O响应情况和内存使用率。

·数据库的可靠性:在连续运行的状态下,系统正常运行的时间。

大多数负载测试工具可以分为以下几大类。

·I/O测试。

·RDBMS(Relational Database Management System,关系数据库管理系统)层I/O测试。

·数据库方面的应用程序级别测试工具。

·应用方向的应用程序级别测试工具。

由于第四种负载测试工具涉及真实的应用场景建模,一般需要应用配合完成。而前三种不需要应用的参与,DBA也可以自行完成。下面就来详细介绍前三种测试方法。

1.2.1 I/O测试

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工具,不需要单独下载。

1.2.2 RDBMS层I/O测试

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.2.3 模拟应用程序层测试

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均达到了峰值。由于测试环境资源有限,此测试结果仅供参考。建议大家进行实际业务模拟测试,以评估出理想的数值。 xlRNhwYFBZL9tTMiZSSo0wjdvPUSCk0vdpJ023AXuAzaNAwlmE07IjWSqI1pp+lm

点击中间区域
呼出菜单
上一章
目录
下一章
×