BenchmarkSQL使用教程

1. TPC-C介绍

    Transaction Processing Performance Council (TPC) 事务处理性能委员会,是一家非盈利IT组织,他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本,在这之前还有TPC-A、TPC-B。A / B 两个版本模拟的是银行转账业务,相对业务模型比较简单。TPC-C自92年初发布,在过去20多年,不管是在业界还是学术界都是应用最为广泛的OLTP压测工具。

    TPC-C测试用到的模型是一个大型的商品批发销售公司,它拥有若干个分布在不同区域的商品仓库。当业务扩展的时候,公司将添加新的仓库。每个仓库负责为10个销售点供货,其中每个销售点为3000个客户提供服务,每个客户提交的订单中,平均每个订单有10项产品,所有订单中约1%的产品在其直接所属的仓库中没有存货,必须由其他区域的仓库来供货。同时,每个仓库都要维护公司销售的100000种商品的库存记录。

1.1 TPC-C表结构

    TPC-C测试系统数据库由9张表组成,它们的关系如下图所示,表框里的数字表示该表将要存放多少条记录,仓库数W的调整在测试中能够体现数据库所能够支持的数据规模的能力:

  •     Warehouse(仓库表,W表示仓数,能够体现数据库所能够支持的数据规模)
  •     District(区域表,W*10表每个仓为10个销售点供货)
  •     Customer(用户表,W*30k表示每个供货点为3000个客户提供服务)
  •     Stock(库存表,W*100k表示每个仓库维护10w种商品库存记录)
  •     Order(订单表)
  •     New-Order(新订单表)
  •     Item(商品表,表固定大小为10w)
  •     Order-Line(订单行)
  •     History(历史表)
1.2 TPC-C事务模型 

TPC-C需要处理的交易事务主要为以下几种:

  1. 新订单(New-Order,占比45%) :客户输入一笔新的订货交易;
  2. 支付操作(Payment,占比43%) :更新客户帐户余额以反映其支付状况;
  3. 发货(Delivery,占比4%) :发货(模拟批处理交易);
  4. 订单状态查询(Order-Status,占比4%) :查询客户最近交易的状态;
  5. 库存状态查询(Stock-Level,占比4%) :查询仓库库存状况,以便能够及时补货。

    TPC-C五种交易类型中StockLevel和OrderStatus这两种交易属于只读事务,NewOrder 、Payment、Delivery属于读写事务,这五种请求是互相独立运行的,在交易组合中读写操作占92%,只读操作占8%。TPC-C通过tpmC值(Transactions per Minute)来衡量系统最大有效吞吐量(MQTh,Max Qualified Throughput),其中Transactions以NewOrder Transaction为准,即最终衡量单位为每分钟处理的新订单数,这就说明了:如果一台机器有 1000 tpmc (Transactions per Minute),那么它实际上处理的交易(请求)为 1000/45% = 2222。 

2. BenchmarkSQL使用教程

    目前做TPC-C压测的开源工具很多,如mysql-tpcc、HammerDB、Benchmarksql等。这三种是在做TPC-C压测使用最多的,也是资料比较丰富的工具。由于我们在工作使用的数据库种类会比较多,mysql-tpcc只能用在MySQL或者兼容MySQL的数据库。HammerDB使用方便,图形化界面可测DB2、PG、Oracle、MySQL等但是对于NewSQL类数据库兼容不是很友好。因为BenchmarkSQL支持多种TPC模型,并且支持不同的数据库类型(如Oracle, PG, MySQL), 本篇文章介绍BenchmarkSQL的使用教程。

2.1 安装BenchmarSQL

下载安装包:https://sourceforge.net/projects/benchmarksql/?source=typ_redirect

上传到服务器解压:

unzip benchmarksql-5.0.zip

安装编译工具ant:

apt install ant

 使用ant编译BenchmarkSQL:

> cd benchmarksql-5.0
> ant
init:[mkdir] Created dir: /root/code/benchmark/benchmarksql-5.0/buildcompile:[javac] Compiling 11 source files to /root/code/benchmark/benchmarksql-5.0/builddist:[mkdir] Created dir: /root/code/benchmark/benchmarksql-5.0/dist[jar] Building jar: /root/code/benchmark/benchmarksql-5.0/dist/BenchmarkSQL-5.0.jarBUILD SUCCESSFUL
Total time: 1 second
2.2 创建数据库

登录PG数据库:

su -u postgres
psql

创建数据库tpcc和用户root,并且把tpcc库的所有权限授权给root用户:

postgres=# create database tpcc;
CREATE DATABASEpostgres=# create user root with password 'xxx';postgres=# grant all privileges on database tpcc to root;

修改PG数据库配置文件的认证方式,主要涉及两个文件,/etc/postgresql/14/main/postgresql.conf和 /etc/postgresql/14/main/pg_hba.conf:

# 修改postgresql.conf,修改监听地址
listen_addresses = '*'# 修改pg_hba.conf,修改IPv4 local connections
host    all             all             0.0.0.0/0            trust# 重启PG数据库
systemctl restart postgresql

修BenchmarkSQL的改配置文件:

cd benchmark/benchmarksql-5.0/run   # 这里props.ora和props.pg是针对oracle和pg的配置文件
cp props.pg props.pg.bak  # 将pg的配置文件进行备份
vim props.pg              # 修改mysql的连接信息
参数说明
dbpostgres指定数据库类型,这里为postgres或者oracle
driverorg.postgresql.Driver数据库的驱动类名称
connjdbc:postgresql://localhost:5432/tpcc连接字符串,tpcc为新创建的库名
user

root

用户名,PG库的用户名需要和OS的用户一致
passwordxxxxx用户密码
warehouses1初始化加载数据时,需要创建多少仓库的数据。每仓库约80MB数据
loadWorkers8表示加载数据时,开启加载数据的进程数。
terminals1终端数量,指同时有多少终端并发执行,表示并发程度,压测时该值可以不断调整
runTxnsPerTerminal0每分钟每个终端执行的事务数,0表示不限制
runMins10执行多少分钟。
limitTxnsPerMin0限制每分钟执行的事务总数。0表示不限制
terminalWarehouseFixedtrue用于指定终端和仓库的绑定模式,设置为true时可以运行4.x兼容模式,意思为每个终端都有一个固定的仓库。设置为false时可以均匀的使用数据库整体配置。

注意:runMins和runTxnsPerTerminal这两个参数指定了两种运行方式,前者是按照指定运行时间执行,以时间为标准;后者以指定每个终端的事务数为标准执行。两者不能同时生效,必须有一个设定为0。 

2.3 创建表并且加载数据

    这里会创建并初始化表—共9张表(warehouse, Stock, Item, Order-Line, New-Order, History, District, Customer,Order),外加一个配置表。 同时会创建相应的索引、主外键参考。

cd run
./runDatabaseBuild.sh props.pg# ------------------------------------------------------------
# Loading SQL file ./sql.common/tableCreates.sql
# ------------------------------------------------------------
create table bmsql_config (
cfg_name    varchar(30) primary key,
cfg_value   varchar(50)
);
create table bmsql_warehouse (
w_id        integer   not null,
w_ytd       decimal(12,2),
w_tax       decimal(4,4),
w_name      varchar(10),
w_street_1  varchar(20),
w_street_2  varchar(20),
w_city      varchar(20),
w_state     char(2),
w_zip       char(9)
);
create table bmsql_district (
d_w_id       integer       not null,
d_id         integer       not null,
d_ytd        decimal(12,2),
d_tax        decimal(4,4),
d_next_o_id  integer,
d_name       varchar(10),
d_street_1   varchar(20),
d_street_2   varchar(20),
d_city       varchar(20),
d_state      char(2),
d_zip        char(9)
);
create table bmsql_customer (
c_w_id         integer        not null,
c_d_id         integer        not null,
c_id           integer        not null,
c_discount     decimal(4,4),
c_credit       char(2),
c_last         varchar(16),
c_first        varchar(16),
c_credit_lim   decimal(12,2),
c_balance      decimal(12,2),
c_ytd_payment  decimal(12,2),
c_payment_cnt  integer,
c_delivery_cnt integer,
c_street_1     varchar(20),
c_street_2     varchar(20),
c_city         varchar(20),
c_state        char(2),
c_zip          char(9),
c_phone        char(16),
c_since        timestamp,
c_middle       char(2),
c_data         varchar(500)
);
create sequence bmsql_hist_id_seq;
create table bmsql_history (
hist_id  integer,
h_c_id   integer,
h_c_d_id integer,
h_c_w_id integer,
h_d_id   integer,
h_w_id   integer,
h_date   timestamp,
h_amount decimal(6,2),
h_data   varchar(24)
);
create table bmsql_new_order (
no_w_id  integer   not null,
no_d_id  integer   not null,
no_o_id  integer   not null
);
create table bmsql_oorder (
o_w_id       integer      not null,
o_d_id       integer      not null,
o_id         integer      not null,
o_c_id       integer,
o_carrier_id integer,
o_ol_cnt     integer,
o_all_local  integer,
o_entry_d    timestamp
);
create table bmsql_order_line (
ol_w_id         integer   not null,
ol_d_id         integer   not null,
ol_o_id         integer   not null,
ol_number       integer   not null,
ol_i_id         integer   not null,
ol_delivery_d   timestamp,
ol_amount       decimal(6,2),
ol_supply_w_id  integer,
ol_quantity     integer,
ol_dist_info    char(24)
);
create table bmsql_item (
i_id     integer      not null,
i_name   varchar(24),
i_price  decimal(5,2),
i_data   varchar(50),
i_im_id  integer
);
create table bmsql_stock (
s_w_id       integer       not null,
s_i_id       integer       not null,
s_quantity   integer,
s_ytd        integer,
s_order_cnt  integer,
s_remote_cnt integer,
s_data       varchar(50),
s_dist_01    char(24),
s_dist_02    char(24),
s_dist_03    char(24),
s_dist_04    char(24),
s_dist_05    char(24),
s_dist_06    char(24),
s_dist_07    char(24),
s_dist_08    char(24),
s_dist_09    char(24),
s_dist_10    char(24)
);
2.4 开始压测

   压测前先看看1仓数据每个表有多少行数据:

  •     bmsql_warehouse:1行,8192Byte
  •     bmsql_district:10行,8192Byte
  •     bmsql_customer:30000行,大小为18MB
  •     bmsql_oorder表:30000行,1936KB
  •     bmsql_history表:30000行,2592KB
  •     bmsql_new_order表:9000行, 392KB
  •     bmsql_order_line表:2999929行,29MB
  •     bmsql_item表:100000行,10MB
  •     bmsql_stock表:100000行,34MB
  •     bmsql_config表:4行,8192Byte

  整个tpcc库大小为123MB,也就是说1仓数据总大小为123MB。如果改成100仓,则整个数据库的大小为10GB。

./runBenchmark.sh props.pg

 执行结束后,取tpmC和tpmTOTAL作为测试指标。测试测试软硬件环境如下:

  •  CPU:16核,13th Gen Intel(R) Core(TM) i5-1340P,1.90 GHz
  •  内存:7.6GB
  •  硬盘:1TB SSD
  • 操作系统:ubuntu 22.04.5 LTS
  • 压测时间:10min
  • 仓数大小:100仓,数据量大小为10GB
线程数tpmC (NewOrders)tpmTOTAL
11201526690
22227149611
42928865130
83566079185
2.5 删除数据库和数据
./runDatabaseDestroy.sh props.pg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react 3种方法] 获取ant组件ref用ts如何定义?

获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…

【ES6复习笔记】let 和 const 命令(1)

ES6 中的 let 和 const 关键字 1. let 关键字 let 关键字用于声明一个变量&#xff0c;它具有块级作用域&#xff0c;这意味着变量只在声明它的块内有效。与 var 不同&#xff0c;let 不允许在同一作用域内重复声明同一个变量。 2. const 关键字 const 关键字用于声明一个常…

mysql,数据库主从同步搭建

1.mysql主从同步1.主从同步原理(1)复现binlog日志中的sql语句(2)主服务器启动binlog日志(3)从服务器启动binlog日志,io线程,sql线程2.主从同步结构一主一从一主多从级联复制互为主从(keepalived高可用)3.mysql复制模式异步复制:主服务器处理完sql直接返回给客户端结果半同步复制…

从Condition开始,回顾AQS

Synchronized和Reentrantlock的挂起逻辑 synchronized中有两个核心的结构 EntryList cxq&#xff1a;等待拿锁的线程存储位置Waitset&#xff1a;被执行wait方法的线程存储位置 流转&#xff1a; 线程获取锁资源失败&#xff0c;扔到EntryList cxq线程持有锁资源&#x…

预览和下载 (pc和微信小程序)

1.微信小程序 预览pdf 或者 图片等 //utils.js 文件//通过接口返回文件链接 打开文档 export default function previewFile({ downLinkUrl, tempFilePath }) {let url "https://" downLinkUrl.replace("http://", "").replace("https:…

用例图和活动图的区别与联系

在软件开发过程中&#xff0c;需求分析是至关重要的一步。为了更好地理解和描述系统的功能需求&#xff0c;开发人员通常会使用各种图形化工具。其中&#xff0c;用例图和活动图是两种非常常用的工具。虽然它们都用于描述系统的行为&#xff0c;但各自具有不同的特点和适用场景…

PCL-计算点云AABB包围盒

PCL-计算点云AABB包围盒 一、概述二、实验代码三、效果展示四、总结 一、概述 点云包围盒也叫外接最小矩形,是一种求解离散点集最优包围空间的算法&#xff0c;基本思想是用体积稍大且特性简单的几何体&#xff08;称为包围盒&#xff09;来近似地代替复杂的几何对象。常见的包…

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…

单片机:实现可调时钟(附带源码)

单片机实现可调时钟设计 在许多嵌入式系统中&#xff0c;时钟功能是非常重要的&#xff0c;尤其是在需要实时显示或调节时间的应用中。例如&#xff0c;我们可以设计一个可调时钟&#xff0c;用户可以通过按键或者外部信号调节时钟的时间&#xff08;例如调节时、分、秒&#…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

代码随想录day25 | leetcode 491.递增子序列 46.全排列 回溯总结

考试周连考不复习就挂科了 一直没更新十分抱歉 今天开始在周日前补回来 491.递增子序列 在90.子集I中我们是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排完序的数组都是自增子序列了。 …

车载U盘制作教程:轻松享受个性化音乐

车载U盘播放音乐相较于蓝牙播放具有一些明显的优势&#xff0c;这些优势主要体现在音质、稳定性、音乐管理以及兼容性等方面。以下是车载U盘播放音乐的一些优势&#xff1a; 音质更佳&#xff1a;车载U盘播放音乐时&#xff0c;音乐文件是直接被解码并播放的&#xff0c;这意味…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

三相电机怎么换向

三相电机是现代工业中常用的驱动设备&#xff0c;其优越的性能及稳定性使其在多种应用场景中得以广泛采用。然而&#xff0c;在某些情况下&#xff0c;电机的换向是必不可少的操作&#xff0c;特别是在需要改变电机旋转方向时。 一、三相电机的基本工作原理 三相电机的工作原…

重温设计模式--8、命令模式

文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式&#xff0c;它旨在将一个请求封装成一个对象&#xff0c;从而让你可以用不同的请求对客户端进行参数化&#xff0c;将请求的发送者和接收者解耦&#xff0c;并且能…

oracle怎样使用logmnr恢复误删除的数据

如果有同事误删除数据了&#xff0c;可以用logmnr挖掘归档日志&#xff0c;生成回滚sql&#xff0c;快速恢复数据&#xff0c;比用整个库的备份恢复要快得多。 一 操作步骤 1.1 创建目录 su - oracle mkdir logmnr create directory logmnr_dir as /home/oracle/logmnr; …

zookeeper+kafka的windows下安装

【Zookeeper】Windows下安装Zookeeper&#xff08;图文记录详细步骤&#xff0c;手把手包安装成功&#xff09;-CSDN博客 【Kafka】Windows下安装Kafka&#xff08;图文记录详细步骤&#xff09;_windows安装kafka-CSDN博客 【Kafka】Kafka消息乱码解决_读取kafka数据格式乱码…

读取文件内容、修改文件内容、识别文件夹目录(Web操作系统文件文件夹详解)

前言 因 Unicode IDE 编辑器导入文件、文件夹需要&#xff0c;研究了下导入文件/文件夹的功能实现&#xff0c;发现目前相关文章有点少&#xff0c;故而记录下过程&#xff0c;如果有误&#xff0c;还望指正。(API的兼容性及相关属性、接口定义&#xff0c;请自行查看文件系统…

【Python知识】Python面向对象编程知识

Python面向对象编程知识 概述1. 类&#xff08;Class&#xff09;2. 对象&#xff08;Object&#xff09;3. 封装&#xff08;Encapsulation&#xff09;4. 继承&#xff08;Inheritance&#xff09;5. 多态&#xff08;Polymorphism&#xff09;6. 抽象&#xff08;Abstractio…

AI Agent开源框架汇总(持续更新)

文章目录 AI Agent开源框架汇总什么是AI Agent为什么需要智能体(Agent)Web3 AI Agent使用场景框架分类低代码(No-Code/Low-Code)框架基础框架代码框架Multi-Agent 框架 / 架构热门开源框架PhidataRigai16z的AI Agent框架ElizaLangChain和phidata对比OpenAI SwarmAI Agent开…