TPC-C 是一个联机事物处理基准,tpcc-mysql 是 percona 基于 TPC-C 衍生出来的产品,专用于 mysql 基准测试。TPC-C 测试规范中模拟了一个比较复杂并具有代表意义的 OLTP 应用环境:假设有一个大型商品批发商,它拥有若干个分布在不同区域的商品库;每个仓库负责为 10 个销售点供货;每个销售点为 3000 个客户提供服务;每个客户平均一个订单有 10 项产品;由于一个仓库中不可能存储公司所有的货物,有一些请求必须发往其它仓库,因此,数据库在逻辑上是分布的。
该系统需要处理的交易为以下几种:
交易类型 | 说明 |
---|---|
New-Order | 客户输入一笔新的订货交易 |
Payment | 更新客户账户余额以反映其支付状况 |
Delivery | 发货(模拟批处理交易) |
Order-Status | 查询客户最近交易的状态 |
Stock-Level | 查询仓库库存状况,以便能够及时补货 |
对于前四种类型的交易,要求响应时间在 5 秒以内;对于库存状况查询交易,要求响应时间在 20 秒以内。
测试程序使用 terark/tpcc-mysql,我们在原版 tpcc-mysql 的基础上添加了读取文本文件作为数据源的功能。
测试的数据库有:TerarkSQL (下简称 TerarkDB),官方原版 MySQL(下简称 InnoDB)。MySQL 开启压缩。
CPU | Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz x2 (共 16 核 32 线程) |
---|---|
内存 | DDR4 16G @ 1866 MHz x 12 (共 192 G) |
SSD | INTEL SSDSC2BP48 0420 IOPS 49000(共 480 G) |
操作系统 | CentOS 7 |
测试中使用的官方原版 MySQL 版本为 Ver 5.6.35 for linux-glibc2.5 on x86_64。
下文 G, GB 230,而非 109。
tpcc-mysql 原版只能导入自动生成的数据,这样的数据无法体现压缩算法的优劣,所以我们修改了 tpcc-mysql 源码,以支持读取指定文件中的数据。数据导入后,数据库尺寸大小如下:
数据库尺寸 | 压缩率 | 索引+数据大小 | ||
---|---|---|---|---|
InnoDB | 66 G | 60.8% 或 1.64倍 | 108.5 G | |
TerarkDB | 39 G | 35.9% 或 2.78倍 |
导入数据所使用的命令如下:
./tpcc_load 127.0.0.1:3346 tpcc_test root '' 1000 data.txt
参数分别代表 hostname:port, database_name, user, password, warehouse, filename。
更改 warehouse 会改变数据库的整体大小。
每次测试中 InnoDB 的 innodb_buffer_pool_size 总是设置为可用内存的 70%,TerarkDB 的 softZipWorkingMemLimit 和 hardZipWorkingMemLimit 分别设置为可用内存的 1/8 和 1/4. 事务隔离级别设置为 Read committed.
所有的测试均使用 32 个线程,每次测试前先 warm up 300 秒,每次测试持续 30 分钟。
测试记录了 New-Order、Payment、Delivery、Order-Status、Stock-Level 五种业务的总业务次数,单位为 T(Transactions)和每分钟 New-Order 业务次数——TPMC,单位为 TPM(Transactions Per Minute)。
下表同时列出了更通用的 TPS(Transactions Per Second) 指标(直接从上述 TPC-C 指标换算过来)。
内存 | 业务类型 | 30 分钟总计 | TPS | TPMC | |||
---|---|---|---|---|---|---|---|
TerarkDB | InnoDB | TerarkDB | InnoDB | TerarkDB | InnoDB | ||
192G | New-Order | 1,882,344 | 625,808 | 1,046 | 348 | 62,741 | 20,860 |
Payment | 1,882,347 | 625,506 | 1,046 | 348 | |||
Order-Status | 188,234 | 62,583 | 105 | 35 | |||
Delivery | 188,233 | 62,574 | 105 | 35 | |||
Stock-Level | 188,233 | 62,587 | 105 | 35 | |||
32G | New-Order | 1,568,769 | 472,355 | 872 | 262 | 52,289 | 15,746 |
Payment | 1,568,773 | 472,398 | 872 | 262 | |||
Order-Status | 156,878 | 47,234 | 87 | 26 | |||
Delivery | 156,878 | 47,238 | 87 | 26 | |||
Stock-Level | 156,877 | 47,240 | 87 | 26 | |||
24G | New-Order | 1,400,550 | 437,695 | 778 | 243 | 46,683 | 14,591 |
Payment | 1,400,549 | 437,740 | 778 | 243 | |||
Order-Status | 140,055 | 43,775 | 78 | 24 | |||
Delivery | 140,056 | 43,774 | 78 | 24 | |||
Stock-Level | 140,054 | 43,775 | 78 | 24 | |||
8G | New-Order | 499,297 | 306,670 | 277 | 170 | 16,643 | 10,222 |
Payment | 499,307 | 306,671 | 277 | 170 | |||
Order-Status | 49,930 | 30,668 | 28 | 17 | |||
Delivery | 49,929 | 30,665 | 28 | 17 | |||
Stock-Level | 49,936 | 30,669 | 28 | 17 | |||
将该表格中的 New-Order TPS 指标做成更直观的图表,如下: