在传统的OLTP业务领域,很多应用系统是基于Java开发的,并且通常不建议使用存储过程。在这种情况下,想要公平地测试数据库性能以及JDBC驱动的表现,benchmarksql是个很不错的工具。下面就来详细介绍如何使用benchmarksql进行数据库处理能力的测试。

一、tpmC性能测试要点解析

(一)流量指标(tpmC)

按照TPC组织给出的定义,流量指标tpmC主要衡量的是系统在同时执行支付操作、订单状态查询、发货以及库存状态查询这4种交易时,每分钟能够处理新订单交易的数量。需要注意的是,所有交易的响应时间必须符合TPC-C测试规范的要求,而且各种交易数量所占的比例也要满足规范。简单来说,tpmC的值越高,就意味着系统的联机事务处理能力越强。

(二)测试时长

在使用benchmarksql进行测试时,测试时间越长,数据库的规模会逐渐变大。一般当数据库大小超过数据库共享缓存3倍的时候,系统性能就会出现比较明显的下降。所以在测试时,要合理把控测试时长,这样才能更准确地评估数据库性能。

(三)cpu负荷

为了监测数据库服务端和tpcc客户端的CPU利用情况,可以借助htop工具。在理想的性能测试状态下,各个业务的CPU占用率都应该尽可能地高。要是发现有CPU占用率没有达到预期标准,有可能是绑核方式存在问题,此时可以尝试采用CPU绑定技术来解决。

(四)warehouses(仓库数)

仓库数在性能测试中起着关键作用,它直接影响测试成绩。如果希望获得较高的测试结果,仓库数就不能设置得过低。在生产环境的机器测试中,一般建议从5000仓库起步。不过,结合实际业务场景来看,100仓可能更为合适。

(五)terminals(并发数)

这个参数指的是性能压测时的并发数。通常建议并发数不要超过仓库数乘以10,否则可能会出现不必要的锁等待情况,影响测试结果。在生产环境里,并发数设置到1000就算是比较高的了。而在一般的测试环境中,建议从100开始设置并发数。

(六)runMins(测试持续时间)

该参数用于指定性能测试持续的时长。测试时间越久,就越能全面地考验数据库的性能和稳定性。一般来说,建议测试时间不少于10分钟;如果是在生产环境的机器上进行测试,建议时长不少于1小时。

二、详细测试步骤

(一)benchmarksql下载

通过以下命令进行下载:

wget https://gitee.com/MapLover/benchmarksql5.1/repository/archive/master.zip 

(二)环境配置

  1. 配置ant和java
    可以使用yum命令进行安装:
yum install -y ant java 

要是无法直接安装ant,那么在安装好java之后,手动下载ant。下载地址可以参考:https://ant.apache.ac.cn/bindownload.cgi,确认最新版本后下载,例如https://mirrors.nju.edu.cn/apache/ant/binaries/apache-ant-1.10.14-bin.tar.gz 。运行Ant前,需要做一些设置:
– 仅bin和lib目录是运行Ant所必需的。选择一个目录,将下载的发行版文件复制到该目录,这个目录就是ANT_HOME。
– 把bin目录添加到系统路径中。
– 设置ANT_HOME环境变量,值为安装Ant的目录。
– 可选地,设置JAVA_HOME环境变量。
示例设置如下:

ln -s /u01/nfs/soft/apache-ant-1.10.14 /opt/ant vim /etc/profile export JAVA_HOME=/u01/app/oracle/product/19.3.0/db_1/jdk export ANT_HOME=/opt/ant export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH 
  1. 配置python
    在采集cpu、disk、network等相关性能信息时,需要调用python程序。注意,这里支持的python版本是2,如果使用3版本会报错,如下:
2024-07-31 15:15:52: osCollectorScript=./misc/os_collector_linux.py 2024-07-31 15:15:52: osCollectorInterval=1 2024-07-31 15:15:52: osCollectorSSHAddr=null 2024-07-31 15:15:52: osCollectorDevices=net_ens39 blk_sda 2024-07-31 15:15:52: Term-00, File "<stdin>", line 63 print ",".join([str(x) for x in sysInfo]) ^ SyntaxError: invalid syntax 2024-07-31 15:15:52: OSCollector, unexpected EOF while reading from external helper process 

因此,需要下载python 2.7.18版本:https://mirrors.nju.edu.cn/python/2.7.18/Python-2.7.18.tgz ,下载后进行解压缩和配置:

./configure --enable-optimizations --prefix=/usr/local/python2.7/ 

接着修改配置文件:

vim Modules/Setup _ssl _ssl.c -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl -L$(SSL)/lib -lssl -lcrypto 

默认这段内容是注释状态,放开注释即可开启SSL模块,不然安装完成后可能会提示找不到ssl模块。之后进行编译和安装:

make -j8 && make install 

最后建立新的软链:

mv /usr/bin/python /usr/bin/python.bak ln -s /usr/local/python2.7/bin/python2.7 /usr/bin/python python -V 

(三)编译BenchmarkSQL源代码

一切准备就绪后,就可以编译BenchmarkSQL了,执行命令:

[root@BC86 benchmarksql5.1-master]# ant Buildfile: /u01/nfs/soft/benchmark/benchmarksql5.1-master/build.xml init: [mkdir] Created dir: /u01/nfs/soft/benchmark/benchmarksql5.1-master/build compile: [javac] Compiling 11 source files to /u01/nfs/soft/benchmark/benchmarksql5.1-master/build dist: [jar] Building jar: /u01/nfs/soft/benchmark/benchmarksql5.1-master/dist/BenchmarkSQL-5.1.jar BUILD SUCCESSFUL 

要是遇到如下错误,那就需要配置JAVA_HOME:

BUILD FAILED /u01/nfs/soft/benchmarksql5.1-master/build.xml:24: Unable to find a javac compiler; com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK. It is currently set to "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-11.oe2203.aarch64/jre" 

(四)创建测试配置文件

进入run目录,创建测试的配置文件:

cd run cp props.pg my_postgres.properties vim my_postgres.properties 

配置文件内容如下:

db=postgres driver=org.postgresql.Driver conn=jdbc:postgresql://192.168.10.108:5432/postgres user=postgres password=passwdsefsdfsdf # 每个W约100MB,则100个约10G warehouses=5 # 加载数据的线程数 loadWorkers=5 # 终端数,即并发客户端数量,通常设置为CPU线程总数的2~6倍 terminals=5 # To run specified transactions per terminal- runMins must equal zero # 每个终端运行的固定事务数量,如该值为10, 则每个terminal运行10个事务,如果有32个终端,那整体运行320个事务后,测试结束。该参数配置为非0值时,下面的runMins参数必须设置为0。 runTxnsPerTerminal=0 # To run for specified minutes- runTxnsPerTerminal must equal zero # runMins表示要压测的时间长度,单位为分钟。该值为非0值时,runTxnsPerTerminal参数必须设置为0。这两个参数不能同时设置为正整数,如果设置其中一个,另一个必须为0,主要区别是runMins定义时间长度来控制测试时间;runTxnsPerTerminal定义事务总数来控制时间。 runMins=5 # 每分钟总的事务数量限制 limitTxnsPerMin=100000000 # Set to true to run in 4.x compatible mode. Set to false to use the entire configured database evenly. terminalWarehouseFixed=true # The following five values must add up to 100 # The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec newOrderWeight=45 paymentWeight=43 orderStatusWeight=4 deliveryWeight=4 stockLevelWeight=4 # Directory name to create for collecting detailed result data. # Comment this out to suppress. resultDirectory=pg_result_%tY-%tm-%td_%tH%tM%tS osCollectorScript=./misc/os_collector_linux.py osCollectorInterval=1 # osCollectorSSHAddr=root@192.168.81.23 osCollectorDevices=net_ens39 blk_sda 

官方文档也提到,示例配置主要用于测试环境搭建的功能性,并非真正的基准测试。要进行有效的测试,需要根据数据库服务器的规模和实际工作负载来调整配置。数据库每个配置的仓库初始大小约为100 – 100MB,一般建议数据库大小为服务器物理内存的2 – 5倍。并发数据库连接数(config参数terminals)通常设置为CPU线程数的2 – 6倍。而且,基准测试通常要持续数小时甚至数天,这样才能确保数据库达到稳定状态,涵盖所有与性能相关的功能,如检查点和清理操作等。对于拥有32 – 256个CPU线程和64 – 512GB内存的现代服务器来说,测试时往往会涉及数千个仓库和数百个并发数据库连接。

(五)构建模式并初始化数据库

执行以下命令创建模式并初始化数据库:

./runDatabaseBuild.sh my_postgres.properties > load_`date '+%Y-%m-%d-%H%M'`.log 2>&1 & tail -100f load_*.log 

(六)oracle数据库的特殊操作(可选)

如果使用的是oracle数据库,在执行测试前可以先生成一个awr快照:

exec dbms_workload_repository.create_snapshot(); 

(七)运行配置好的基准测试

执行测试命令:

./runBenchmark.sh my_postgres.properties > run_`date '+%Y-%m-%d-%H%M'`.log 2>&1 & tail -100f run_*.log 

基准测试会按照配置的并发连接数(terminals)和持续时间或事务数量来运行。

(八)oracle数据库测试后的操作(可选)

对于oracle数据库,测试完成后,再生成一个awr快照,然后获取测试期间的awr报告:

exec dbms_workload_repository.create_snapshot(); 

(九)调整基准测试配置

根据测试需求,修改my_postgres.properties文件中的配置参数,比如调整仓库数和并发连接数/终端数。同时,从基于事务计数切换到基于时间的测试方式:

runTxnsPerTerminal=0 runMins=5 

(十)重新构建数据库

为了方便多次测试,减少导入数据的时间,可以先停止数据库,将整个数据目录进行拷贝备份。之后重新创建测试库:

./runDatabaseDestroy.sh my_postgres.properties ./runDatabaseBuild.sh my_postgres.properties 

(十一)生成测试报告

执行以下命令生成数据库测试报告:

./generateReport.sh pg_result_2024-07-31_195621 

如果在生成报告时提示“无法打开链结到X11显示”,那就需要开启vncserver服务。

(十二)配置R

安装R时,先下载安装包:

wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/base/R-4/R-4.4.1.tar.gz 

然后进行配置、编译和安装:

./configure make -j18 make install 

在configure过程中,如果出现错误,缺什么就安装什么,例如:

yum install -y gcc gcc-c++ gcc-gfortran readline-devel yum install -y gcc-gfortran 

要是报错“configure: error: –with-x=yes (default) and X11 headers/libs are not available”,则执行:

yum install -y libX11-devel libXt-devel 

如果报错“liblzma library and headers are required”,则执行:

yum install -y xz-devel 

要是报错“configure: error: libcurl >= 7.28.0 library and headers are required with support for https”,则执行:

yum install -y libcurl-devel 

如果遇到不支持png的情况,解决办法如下:

yum install -y libpng-devel libtiff-devel libjpeg-turbo-devel pango-devel 

再次configure即可。正确的结果应该是png为TRUE,bitmapType是cairo,如下:

R capabilities() > capabilities() jpeg png tiff tcltk X11 aqua TRUE TRUE TRUE FALSE TRUE FALSE http/ftp sockets libxml fifo cledit iconv TRUE TRUE FALSE TRUE TRUE TRUE NLS Rprof profmem cairo ICU long.double TRUE TRUE FALSE FALSE FALSE TRUE libcurl TRUE getOption("bitmapType") [1] "cairo" 

另外,还有使用Cairo配置支持png的可选操作:

wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/contrib/png_0.1-8.tar.gz wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/contrib/Cairo_1.6-2.tar.gz install.packages("Cairo_1.6-2.tar.gz",repos=NULL) 

如果报错“configure: error: Cannot find cairo.h!”,则执行:

yum install -y cairo* libxt* 

最后执行:

install.packages("png_0.1-8.tar.gz",repos=NULL) library(Cairo) library(png) Cairo.capabilities() 

按照上述步骤,就能使用benchmarksql对数据库处理能力进行全面且准确的测试啦。希望这篇文章能帮助大家更好地掌握数据库性能测试的方法。