MySQL · 最佳实践 · 一个TPC-C测试工具sqlbench使用

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: TPC-C是数据库系统经常使用的一个性能测试标准,目前开源社区里有几个可以使用的TPC-C测试工具,如BenchmarkSQL、DBT2、 tpcc-mysql等。今天这里要介绍的是另一个TPC-C测试工具: sqlbench。

TPC-C是数据库系统经常使用的一个性能测试标准,目前开源社区里有几个可以使用的TPC-C测试工具,如BenchmarkSQL、DBT2、 tpcc-mysql等。今天这里要介绍的是另一个TPC-C测试工具: sqlbench

sqlbench 特性

sqlbench fork自DBT2,改写了整个架构,原来的DBT2把整个测试过程分成client和 driver 两个应用程序,每个terminal需要 2个线程。如果测试的warehouse较多需要占用机器大量资源。 而sqlbench对这方面做了优化,合并了这两个应用程序,同时优 化了线程的使用,使用1个线程处理多个terminal,大大减少了机器资源的使用。使一台机器可以运行更多的warehouse。另外 DBT2外部依赖较多,如对R环境的依赖,sqlbench去掉了不必要的外部依赖,目前sqlbench只依赖测试数据库的客户端库。下面 是sqlbench的部分特性:

  • 支持多种数据库,目前支持PostgreSQL、MySQL、Kingbase、ODBC
  • 支持多种协议和SQL执行方式,包括普通的SQL语句、PBE(Prepare、Bind、Execute)和存储过程1
  • 支持每种数据库的数据快速加载接口,如:PostgreSQL的 Copy,MySQL的 Load Data Local InFile,同时实现并行加载使数 据加载更快

下面将主要以测试PostgreSQL为例介绍sqlbench的安装和使用,这里我们装载20个warehouse并运行测试120秒。

sqlbench编译安装

sqlbench代码目前托管在github上,可以下载发布的版本,也可以直接使用仓库中的代码,这里以仓库中的代码为例。 下载代码解压后进入sqlbench目录先执行autreconf -if,然后执行configure:

autoreconf -if
./configure --with-postgresql=yes --with-mysql=yes \
   --with-kingbase=<kingbase-installation-path> --with-odbc=yes
  • 这里使用 –with-postgresql指定支持postgresql测试,如果–with-postgresql指定yes,configure会在当前PATH下找 pg_config,通过pg_config配置编译的选项
  • –with-postgresql也可以接PostgreSQL的安装路径,它会根据指定的安装配置编译选项
  • –with-mysql与–with-postgresql类似,只是当指定yes时使用的是mysql_config
  • –with-kingbase只支持指定kingbase安装的路径
  • –with-odbc打开ODBC支持只能指定yes

还可以通过给configure加上–prefix选项指定安装路径。configure执行完后执行make && make install安装

创建测试表

使用psql连接到数据库通过执行源代码目录下src/scripts/create-tables.sql文件来创建测试所需的表:

psql tpcc -f src/scripts/create-tables.sql
# 对于MySQL使用:
mysql -D tpcc <src/scripts/create-tables.sql

我们先不创建索引,这样装载数据会快一些,当装载完数据再创建索引。

装载数据

src/core/datagen用来装载数据:

src/data/datagen -t postgresql --dbname=tpcc --host=127.0.0.1 -w 20 -j5
# 对于MySQL类似

第一个选项使用-t来指定数据库类型(如果指定-t选项,-t必须是第一个选项,这和后面的sqlbench命令是一样的),后面的 长选项是该数据库的连接参数。对于PostgreSQL和MySQL可以指定数据库名、主机名、端口号等,具体可通过datagen –help查 看。这里如果没有指定-t选项,datagen会将数据写到文本文件,然后可通过数据库内置装载命令装载的数据库,默认文件会生 成在当前目录,可以-d改变生成文件的位置。上面还通过-w选项指定了要测试的warehouse数和-j指定了使用多少个并发装载数 据。

创建索引

数据装载完就可以创建索引了,类似于创建表,通过psql或mysql命令来执行src/scripts/create-indexes.sql脚本。创建完索 引后通过analyze命令对数据库进行analyze(MySQL对每个表运行analyze table),使用数据库在运行测试时可以生成正确的 查询计划。

运行测试

执行src/core/sqlbench命令运行测试:

src/core/sqlbench -t postgresql --dbname=tpcc --host=127.0.0.1 -w 20 -l 120 -r 20 -c 5

这里:

  • -t 指定PostgreSQL数据库 –dbname和–host为数据库的连接参数,其他没指定的使用默认参数
  • -w 指定测试数据为20个warehouse
  • -l 共运行测试时间为120秒
  • -r 其中ramp up的时间为20秒
  • -c 共使用5个数据库连接

sqlbench其他的常用参数包括:

  • –no-thinktime 默认的TPC-C测试是有keying time和thinking time的,模拟真正的用户场景,可通过指定这个参数将相应 的时间设置成0,来只对CPU加压
  • –sqlapi 选择SQL执行的方式,可选:
    • simple 为普通SQL方式
    • extended 使用prepare/bind/execute方式,该方式先生成查询计划缓存起来,后面直接执行,效率更高
    • storeproc 使用存储过程,这种方式与比extended相比还节省了与数据库服务器通信的开销
  • -s与-e指定开始和结束的warehouse数,在更多warehouse时,可以使用这2个选项分配warehouse,分成多个sqlbench压测同 一个数据库
  • –altered默认情况sqlbench下根据TPC-C标准生成terminal数(每个terminal代表一个user,每个warehouse 10个terminal, 也可以使用–tpw改变),这个参数直接指定了terminal个数,被这些warehouse平均分。
  • –sleep指定每创建一个线程后sleep的时间,默认为1s
  • -o 用来指定output目录,用来存储错误日志及测试结果文件

sqlbench的其他参数是用来定制TPC-C标准的各个部分的,包括keying time、thinking time的时间,各个事务所占比率,各个 表的数据量等,默认值都是遵从TPC-C标准的。

查看测试结果

sqlbench测试过程中会将测试数据写到output目录下的mix.log中,而src/utils/post-process命令是用来处理这个文件查看测 试结果的:

src/utils/post_process -l mix.log
                         Response Time (s)
 Transaction      %   Average : 90th %   Total     Rollbacks       %
------------  -----  -----------------  -------  ------------  -----
    Delivery   3.96     0.061 :  0.071       45             0   0.00
   New Order  46.21     0.038 :  0.052      525             5   0.95
Order Status   3.61     0.007 :  0.010       41             0   0.00
     Payment  43.13     0.013 :  0.017      490             0   0.00
 Stock Level   3.08     0.011 :  0.016       35             0   0.00
------------  -----  -----------------  -------  ------------  -----

262.50 new-order transactions per minute (NOTPM)
2.0 minute duration
0 total unknown errors
20 second(s) ramping up

以上结果第1列为事务类型,第2列为该事务类型所占的比例,第3列和第4列分别为平均响应时间和90百分位数响应时间(90th percentile),TPC-C要求这2个响应时间必须小于5秒。第5列每种事务总数,第6列和第7列回滚事务数和回滚率,TPC-C要求New Order事务有一定的回滚率。最后的262.50为每分钟New Order事务的个数,这是TPC-C比较重要的一个性能指标。

post_process还可以通过-t选项输出每种事务随时间变化的每分钟执行事务数的统计数据,再配合脚本 src/utils/plot_transaction_rate可以得到对应每分钟事务数的变化曲线2

src/utils/post_process -l mix.log -t transactions-rate.log
src/utils/plot_transaction_rate transaction-rates.log \
  transactions-rate.png

下图是上面测试结果的每分钟事务数的变化曲线。 img

写在最后

目前sqlbench工具还不完善,欢迎试用这个工具,如果遇到什么问题可以在Github上提issue,如果感兴趣希望做改进也欢迎提 merge request。

Footnotes

1 目前MySQL、ODBC只支持普通的SQL方式

2 plot_transaction_rate需要系统安装gnuplot

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
25 6
|
6天前
|
存储 监控 测试技术
测试脚本编写和维护的最佳实践有哪些?
测试脚本编写和维护的最佳实践有哪些?
|
9天前
|
关系型数据库 MySQL 测试技术
【赵渝强老师】MySQL的基准测试与sysbench
本文介绍了MySQL数据库的基准测试及其重要性,并详细讲解了如何使用sysbench工具进行测试。内容涵盖sysbench的安装、基本使用方法,以及具体测试MySQL数据库的步骤,包括创建测试数据库、准备测试数据、执行测试和清理测试数据。通过这些步骤,可以帮助读者掌握如何有效地评估MySQL数据库的性能。
|
8天前
|
缓存 JavaScript 测试技术
Vue 3 单元测试最佳实践
Vue 3 单元测试最佳实践
13 1
|
1月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
49 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
18天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
35 2
|
19天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
28 2
|
1月前
|
安全 Java 测试技术
最佳实践:通义灵码生成单元测试,让单测更简单
本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则,进而引入如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试的。
|
12天前
|
测试技术 持续交付
软件测试中的自动化测试策略与最佳实践
【10月更文挑战第31天】 在当今快速迭代的软件开发环境中,自动化测试成为确保软件质量和加速产品上市的关键。本文探讨了自动化测试的重要性、实施策略以及一些最佳实践。通过分析不同类型的自动化测试工具和框架,本文旨在为软件开发团队提供一套实用的指导方案,以提高测试效率和质量。
|
1月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
114 5

相关产品

  • 云数据库 RDS MySQL 版