对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)

1,290 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【掘金】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

1.为什么做性能测试

在工作中,完全基于新的数据库开发的场景并不是很多,毕竟现在这个年代,从头跟着公司干到上市的并不多了。因此我们常常遇到的是经过业务的迅速上升,会发现当初的数据库选型到目前为止,有诸多的不合适,那么就需要评估数据库的新选型了,既然是评估工作,避免不了性能的测试。

2.业界标准 TPC-C

TPC-C是业界较认可的在线事务处理基准。

TPC-C是一个在线事务处理(OLTP)基准,于1992年7月批准。TPC-C比以前的OLTP基准测试(如TPC-A)更复杂,因为它引入了更多的事务类型、更复杂的数据库和整体执行结构。

TPC-C混合了5个不同类型和复杂性的并发事务,它们要么在线执行,要么排队等待延迟执行。该数据库由9种类型的表组成,这些表的记录和填充大小各不相同。TPC-C是以每分钟事务数(tpmC)来衡量的。虽然基准描述以批发供应商的为例子,但TPC-C并不局限于任何特定业务部门的活动,而是代表必须管理、销售或分发产品或服务的任何行业。

其涉及的表以及业务数量如下,更详细的介绍可参见标准

image.png

3.测试工具

为了支持这些数据库的测试,当然需要选择一个合适的工具,而目前最合适的测试工具莫过于BenchmarkSQL

github地址如下.

BenchmarkSQL采用Java语言编写,使用JDBC对SQL数据库进行压力测试。整体架构是处理模拟终端、用户和应用程序线程的一系列数据结构、队列和线程组。

其架构上做了一系列优化,允许配置驱动至数千个仓库(称为缩放因子),而不会压倒测试驱动程序本身的工作机器,这是非常重要的。

从标椎上看,每个仓库必须有 10 个终端。将这些数字放在一起很容易看出,"每个终端一个线程"的实现很可能不得行哦。

如果要驱动一个 100GB 的数据库(在 2016 年,我认为是一个中小型服务器),我们需要配置 1,000 个仓库,这将导致 10,000 个终端线程。

在 CentOS-7 64bit 等操作系统上,每个线程默认使用 1MB 的堆栈空间,上下文切换在 10,000 个线程之间已经足够CPU忙碌的了,甚至于可能会影响测试的结果,而尝试为大型服务器驱动 1TB 数据库,那测试机器将崩溃。

而BenchmarkSQL采用了类似队列的结构而不是真正的线程去驱动它们,因此可以满足性能压测的要求。

image.png

4.安装 BenchmarkSQL 6.0

先配置编译环境:

  • Java 开发环境 (java-1.8.0-openjdk-devel or newer).
  • Maven build 工具.
  • Docker
  • Git

构建

git clone https://github.com/pgsql-io/benchmarksql.git
cd ~/benchmarksql
mvn

5.运行压测工具

先准备数据库测试配置文件:

$ cd benchmarksql/target/run
$ cp sample.RDBMS.properties my.properties
$ vi my.properties

目录中包含了支持数据库的测试配置文件,说明如下:

# firebird数据库配置
sample.firebird.properties  
# mariadb / MySQL 数据库配置
sample.mariadb.properties
# oracle数据库配置
sample.oracle.properties
# postgresql 数据库配置
sample.postgresql.properties
# SQL Server 数据库配置
sample.transact-sql.properties

特别需要注意的是MySQL数据库的配置,其和mariadb是兼容的,因此直接使用即可。

使用压测非常简单,配置好文件后,只需要运行三个命令即可。

# 销毁上次配置的数据库表数据
./runDatabaseDestroy.sh my.properties
# 初始化压测数据库数据
./runDatabaseBuild.sh my.properties
# 开始压测
./runBenchmark.sh my.properties

如果需要临时增大linux测试机线程数,请使用命令

ulimit -HSn 65536

测试结果如下:

2021-09-26 08:48:00,024  INFO - result,                                           _____ latency (seconds) _____
2021-09-26 08:48:00,024  INFO - result,   TransType              count |   mix % |    mean       max     90th% |    rbk%          errors
2021-09-26 08:48:00,024  INFO - result, +--------------+---------------+---------+---------+---------+---------+---------+---------------+
2021-09-26 08:48:00,025  INFO - result, | NEW_ORDER    |        18,909 |  43.934 |   0.053 |   0.146 |   0.073 |   1.026 |             0 |
2021-09-26 08:48:00,035  INFO - result, | PAYMENT      |        18,661 |  43.357 |   0.014 |   0.071 |   0.016 |   0.000 |             0 |
2021-09-26 08:48:00,036  INFO - result, | ORDER_STATUS |         1,851 |   4.301 |   0.005 |   0.011 |   0.006 |   0.000 |             0 |
2021-09-26 08:48:00,036  INFO - result, | STOCK_LEVEL  |         1,834 |   4.261 |   0.003 |   0.012 |   0.004 |   0.000 |             0 |
2021-09-26 08:48:00,036  INFO - result, | DELIVERY     |         1,785 |   4.147 |   0.000 |   0.001 |   0.001 |   0.000 |             0 |
2021-09-26 08:48:00,036  INFO - result, | DELIVERY_BG  |         1,785 |   0.000 |   0.098 |   0.191 |   0.104 |   0.000 |             0 |
2021-09-26 08:48:00,037  INFO - result, +--------------+---------------+---------+---------+---------+---------+---------+---------------+
2021-09-26 08:48:00,037  INFO - result,
2021-09-26 08:48:00,037  INFO - result, Overall NOPM:          630 (98.02% of the theoretical maximum)
2021-09-26 08:48:00,037  INFO - result, Overall TPM:         1,435

6. 配置文件参数说明

6.1 数据库驱动程序和连接参数

参数描述例子
db数据库类型postgres
driver要加载的 JDBC 类名称。driver=org.postgresql.Driver
application客户端应用程序类型,支持通用应用类型中的所有数据库类型,该类型使用 JDBC。application=Generic
connJdbc 连接 Uriconn=jdbc:postgresql://localhost:5432/postgres
user数据库用户名user
password数据库用户密码password

6.2 性能调节参数

参数描述
warehouses仓库数据库大小参数 这不仅影响初始数据库的大小,还影响将模拟多少终端,默认是10倍仓库数量
loadWorkers用于创建初始数据库内容的并行线程数。仅影响初始化,不影响压测。
monkeys用于处理终端输入和输出的猴子线的数量。
sutThreads要启动的应用程序线程数。将创建这么多并行数据库连接来处理传入请求。
maxDeliveryBGThreads允许在任何时候处理交付交易的背景部分的最大线程数。
maxDeliveryBGPerWarehouse允许"为同一仓库"处理交货交易的背景线程数。

7. 生成可视化统计界面

需要安装R包,来把测试报告数据转化为统计数据界面。

利用generateReport.py脚本来完成该项任务。

./generateReport.py --resultdir=my_result_2021-09-26_080750/

# 参数有下列可选,resultdir是必须参数
--template
--resultdir
--disk
--interface

image.png

8. 小结

性能测试的结果呢?

结果重要吗?掌握了方法,结果唾手可得。

嗯嗯,这点成果还是不太适合直接公开的,暂时保个密,等过段时间再来更新吧。

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?