📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
📢本文作者:由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并不局限于任何特定业务部门的活动,而是代表必须管理、销售或分发产品或服务的任何行业。
其涉及的表以及业务数量如下,更详细的介绍可参见标准:
3.测试工具
为了支持这些数据库的测试,当然需要选择一个合适的工具,而目前最合适的测试工具莫过于BenchmarkSQL
。
github地址如下.
BenchmarkSQL采用Java语言编写,使用JDBC对SQL数据库进行压力测试。整体架构是处理模拟终端、用户和应用程序线程的一系列数据结构、队列和线程组。
其架构上做了一系列优化,允许配置驱动至数千个仓库(称为缩放因子),而不会压倒测试驱动程序本身的工作机器,这是非常重要的。
从标椎上看,每个仓库必须有 10 个终端。将这些数字放在一起很容易看出,"每个终端一个线程"的实现很可能不得行哦。
如果要驱动一个 100GB 的数据库(在 2016 年,我认为是一个中小型服务器),我们需要配置 1,000 个仓库,这将导致 10,000 个终端线程。
在 CentOS-7 64bit 等操作系统上,每个线程默认使用 1MB 的堆栈空间,上下文切换在 10,000 个线程之间已经足够CPU忙碌的了,甚至于可能会影响测试的结果,而尝试为大型服务器驱动 1TB 数据库,那测试机器将崩溃。
而BenchmarkSQL采用了类似队列的结构而不是真正的线程去驱动它们,因此可以满足性能压测的要求。
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
# 开始压测
./runDatabaseBuild.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 |
conn | Jdbc 连接 Uri | conn=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
8. 小结
性能测试的结果呢?
结果重要吗?掌握了方法,结果唾手可得。
嗯嗯,这点成果还是不太适合直接公开的,暂时保个密,等过段时间再来更新吧。
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?