暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

扩展一下BenchmarkSQL,新增支持ASE/HANA/DB2/SQLServer,可以随便用了

数据库杂记 2023-03-22
54

1背景
提到数据库的性能,自然就避不开性能测试。有专用于测试OLTP的,也有偏重于OLAP的。本文介绍的BenchmarkSQL就属于测试OLTP中的一个,基于TPCC的。网上有很多介绍TPC*的相关测试的文章,大家可以自行脑补。而PostgreSQL自带的pgbench是属于TPCC的前一个基准测试程序,偏重于数据库的重度写操作。

由于pgbench仅作用于PG一种数据库,如果拿来横向比较不太好处理了。毕竟别的数据用不了pgbench。同样,有另一种测试程序:sysbench,也仅能支持少数几种数据库:如oracle, mysql, postgresql。这在某些情况下确实也能测一测。更为通用的横向比较,又有它的局限。不可否认,他们使用起来非常方便。

而本文介绍的BenchmarkSQL是用Java编写的一套测试程序。可扩展性非常好。并且,我在原有的5.0基础上,扩展了支持多种DBMS,可以满足大多数常见数据库的性能测试。

进一步介绍

不多说,已经在github上开源:https://github.com/iihero/benchmarksql-v5

我在原有的基础上提供了对下述数据库的支持:

Version 5.10 Sean He (iihero):

  • Use Maven instead of Ant for the build. Easy to maintain.

  • Upgrade all the jdbc drivers to the latest version.

  • Add support for ASE, HANA, HANA-COL, MSSQL(TSQL), DB2

下图是测试某个数据库的结果:

当然如果要想拿到更好的分数,必须想方设法的进行相关参数的调优。同时,它还有一个好处,一个数据库上来,看它好不好,先调个几轮,看它的分数到底是啥样的,至少你有一个横向的比较。

比如相同的物理配置,A数据库能跑80000 tpmTotal,  而你的数据库只能跑50000,那证明,要不好好调下参数,要不然可能真的要认输了。

3、使用的简要说明

基本的运行情况,就分为3步。

1) 先用mvn + JDK8直接编译源码包:mvn clean package

当然,你有可能在编译时说找不到ASE, DB2等的jdbc 包,可以从Release tag里头下载下来,替一下就行。把pom里头的不能下载的包的依赖先给注释掉。

2) 进入target/run目录:

修改或复制一份配置文件模板,形成自己的配置文件。下边以Sybase ASE为例 :

将props.ase改一下,修改里边的相关连接属性:

// You need enable SELECT FOR UPDATE by: sp_configure 'select for update'1  in advance
// to run the case. Otherwise there will be lots of DUPLICATE KEY exception when inserting orders.

db=ase
driver=com.sybase.jdbc4.jdbc.SybDriver
application=Generic
conn=jdbc:sybase:Tds:localhost:5000?ServiceName=benchmarksql
user=benchmarksql
password=PWbmsql

warehouses=1
loadWorkers=4

terminals=1
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=10
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=0
//Number of total transactions per minute
limitTxnsPerMin=300

//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 454344 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

参数简要说明:

前置说明,ASE上要跑benchmarkSQL,必须先在服务器端配置好参数:sp_configure 'select for update'1

即必须事先打开:select for update这个选项。

db=ase
driver=com.sybase.jdbc4.jdbc.SybDriver
application=Generic
conn=jdbc:sybase:Tds:localhost:5000?ServiceName=benchmarksql
user=benchmarksql
password=PWbmsql

上边的是标准的jdbc连接信息,修改相应的值就可以了。db=ase标明这个数据库类型是Sybase ASE。

warehouses=32 这个是反映数据量的数仓的总数。在实际跑的过程可以,可设的很大,跟实际要跑的数据量有关。
loadWorkers=8 并发加载的线程数, 可以设成你的CPU的核数的一半左右。

terminals=64,这个就是并发的线程数. 一般可以弄到逻辑核数附近。
runTxnsPerTerminal=0 每个线程跑的总事务数。
runMins=10, 每个线程跑的总时长
limitTxnsPerMin=10000000, 每个线程每分钟的最多处理事务数

这里也提示了:

如果限定了每个线程的事务数: runTxnsPerTerminal(非0值),那么总时长runMins就必须是0.

如果限定了总时长runMins为非0值,那么每个线程的事务数就必须是0.这两个参数的设置是互斥的。

至于limitTxnsPerMin,它的值,想限定的话,不要设得太小,刚跑这个test的朋友,值设得太小(比如设成1000以内),结果跑出来的测试结果很差。放开限制,可以把它设为0。

warehouses=32
loadWorkers=8

terminals=64
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10
//Number of total transactions per minute
// limitTxnsPerMin=10000000
limitTxnsPerMin=0

配置好了上边这些,可以简单的做如下几步动作:

3)  ./runDatabaseBuild.sh ase.props

4)  ./runBenchmark.sh ase.props

这一步跑完以后,可以得到如前上边的结果。

5) ./runDatabaseDestroy.sh ase.props

这是完全清除待测的数据库。

3), 4), 5)可以反复不断进行。当然清理完以后,可以对数据库的物理环境 进行一些优化。

在初始验证环境 的时候 ,可以将参数值调的尽量小一些,先让它能跑起来,然后再加大量。要想跑出好的结果,对数据库服务器进行不断的调优和监控是必须的。这整个过程也能加深你对数据库性能调优的整体认识。从CPU利用率,I/O (disk, network),  Memory,多线程/多进程,SQL语句的性能,等各个方面考虑。

针对ASE,必要的索引是肯定要的,另外,可能需要进行一些cache的绑定,以提高内存缓存的利用率。然后CPU 引擎数量也是需要配置的。


[---END---]

文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论