本文首先分析了 MySQL 基准测试的必要性,随后简要介绍了几种常用的 MySQL 基准测试工具,接下来针对两个常用的工具(SysBench 和 Tpcc-MySQL)进行了测试案例分享,主要进行了性能指标的解读及测试流程的介绍,最后对本文的工作进行了总结。
1、引言
MySQL 作为软件开发人员工作中使用最多的数据库之一,了解它的性能情况是十分必要的。作为一种测量和评估软件性能指标的手段,基准测试可以通过建立在某个时间点的性能基准,方便了数据库开发人员在对系统优化后重新进行基准测试以评估变化对性能的影响。所以,通过对 MySQL 进行基准测试,建立性能基准线,可方便数据库开发人员了解对数据库的性能优化是否达到了预期的效果。常用的 MySQL 基准测试工具包括 SysBench、Tpcc-MySQL、YCSB 等。
2、MySQL 基准测试工具
2.1 SysBench
SysBench 是一个模块化,跨平台和多线程的基准测试工具。它可以执行多种类型的基准测试,不仅可以用来测试数据库的性能,也可以测试运行数据库的服务器的性能,如测试 CPU/ 内存 / 线程 /IO 等方面的性能测试。本文主要介绍用于评估测试各种不同系统参数下的数据库负载情况。
SysBench 对 OLTP 基准测试可以模拟测试多个简单事务处理系统的工作负载,可支持采用 lua 脚本编写的比较简单的测试数据库负载程序来进行基准测试。主要测试业务场景包括随机点查询(point select),简单的点更新(update where id=)和范围查询等。用户可以根据自己的业务场景,改写 sysbench 的 lua 脚本来进行测试。此外,通过改写 SysBench 的方式,还可以支持对 MySQL 集群做分发读写测试。
2.2 Tpcc-MySQL
TPC(Tracsaction Processing Performance Council)是一个针对大型数据库系统软硬件性能进行评测的非盈利的组织,它制定的 TPC-C 可用于规范对典型的复杂 OLTP 系统性能测试工作。
Tpcc-MySQL 是基于 TPC-C 衍生出来专用于开展 MySQL 基准测试的工具。该工具模拟了电商环境平台,通过搭建一套可支持下单、支付、查订单、发货、查库存的运营环境,模拟各个环节,然后获取数据,来评估在当前环境下数据库系统能承担的吞吐量。相比于 SysBench 基准测试,Tpcc-MySQL 更能够接近业务的真实负载。
2.3 YCSB
YCSB(Yahoo! Cloud Serving Benchmark)是雅虎开源的一款通用的基准测试工具。它默认提供了许多工作负载,每个工作负载可提供一些混合读写的操作、键 - 值存储、请求分布等。用户可以根据不同的工作负载(如:Insert、Update、Read、Scan 等)多维度的对系统进行测试。
3、SysBench 工具使用方法
3.1 SysBench 标准 OLTP 实例基准测试的性能指标
(1)TPS(Transactions Per Second),每秒执行的事务数,以完成 COMMIT 操作的次数为准。
(2)QPS(Queries Per Second),每秒执行的 SQL 数,包含 SELECT、INSERT、DETELE、UPDATE、COMMIT 等。
(3)RT(Response Time),数据库系统对请求做出响应的时间(单位:ms)。包括最小响应时间、最大响应时间、平均响应时间等。前 95-99%的最大响应时间往往会决定该系统大多数情况下的短板。
3.2 测试用例介绍
3.2.1 数据准备
(1)客户端创建空数据库:
create database sbtest;
(2)导入数据:
数据准备命令:
sysbench oltp_read_only.lua --db-driver=mysql --mysql-host=xxx --mysql-user=xxx --mysql-password=xxx --mysql-db=sbtest --table_size=100000 --tables=10 --threads=4 prepare
图 1、prepare 数据准备图例
图 1 所示是执行数据准备命令后的结果,具体实现的作用就是进入到指定的数据库服务器中,在空数据库 sbtest 中创建 10 张表,每张表的大小为 10W,选择创建数据的线程为 4。详细的 SysBench 主要参数介绍如表 1 所示。
表 1、SysBench 主要参数
3.2.2 MySQL 单机版业务测试
SysBench 自带的常用测试脚本如下:
(1)oltp_point_select.lua:用于测试 OLTP 的定点查询性能(如根据主键查询);
(2)oltp_update_index.lua:用于测试 OLTP 的更新索引字段的性能;
(3)oltp_read_only.lua:用于测试 OLTP 的只读性能;
(4)oltp_write_only.lua:用于测试 OLTP 的只写操作性能;
(5)oltp_read_write.lua:用于测试 OLTP 的读写操作性能。
测试命令:
sysbench xxx.lua --db-driver=mysql --mysql-host=xxx --mysql-user=xxx --mysql-password=xxx --mysql-db=sbtest --time=180 --table_size=100000 --tables=10 --threads=128 run
其中 xxx.lua 为选择的对应测试业务所需的 lua 脚本
3.2.3 MySQL 主从模式测试
主从模式测试,使用 SysBench 的改写版本可以实现在一主多从部署下的只写、只读、混合读写测试:
(1)只写测试:从机空载,利用 SysBench 对主机进行只写压测,测试方法与单机版一致;
(2)只读测试:改写的 SysBench 通过测试命令指定将所有读均匀分摊到指定的从机上,每台从机接收到的读数量都是一致的;
(3)混合读写测试:改写的 SysBench 直接缓存与主机和从机的请求,自动将写全部定向到主机,将所有读均匀分摊到各个从机。
一主二从模式混合读写测试命令示例:
sysbench xxx.lua --db-driver=mysql --mysql-host=xxx --mysql-user=xxx --mysql-password=xxx --mysql-db=sbtest --time=180 --report-interval=10 --table_size=100000 --tables=10 --threads=128 --slaves=2 --slave-host="host1,host2" --slave-user=xxx --slave-password=xxx --slave-db=sbtest run
改写 SysBench 补充参数解读:
slaves:主从模式的从机数量
slave-host:从机数据库实例的连接地址
slave-user:从机数据库实例的用户名
slave-password:从机数据库实例的密码
slave-db: 从机数据库实例名
其中 xxx.lua 为选择的对应测试业务所需的 lua 脚本
3.2.4 测试结果分析
如图 2 所示,是跑出的混合读写的测试样例结果:
图 2、SysBench 测试结果图例
测试参数选择:128 线程+10 张表+10w 表大小+60s 测试时长
主要关注测试结果为:15652 QPS+313052 TPS+ 11.04ms RT(95%)
3.2.4 清理数据
每项测试完成,进行清空测试数据库操作
sysbench oltp_read_only.lua --db-driver=mysql --mysql-host=xxx --mysql-user=xxx --mysql-password=xxx --mysql-db=sbtest --table_size=100000 --tables=10 --threads=64 cleanup
4、Tpcc-MySQL 工具使用方法
4.1 Tpcc-MySQL 的业务逻辑及相关表
(1)业务逻辑
New_Order:新订单,处理一次完整的订单事务
Payment:支付,客户账户余额更新,反映其支付情况
Order-Status:订单状态,客户最新交易状态查询
Delivery:发货(模拟批处理交易)
Stock-Level:库存,仓库库存状况查询,便于商家能够及时补货
(2)相关表
Customer:客户表
District:地区表
Item:商品表
Warehouse:仓库表
4.2 主要测试性能指标
TpmC(transactions per minute): 每分钟处理订单交易的能力。即在数据库系统执行支付操作、订单状态查询、发货任务和查询库存状态这 4 种交易的同时,该指标每分钟能够处理新订单交易的个数。此外,所有交易数量所占的比例需要满足 TPC-C 规范的要求,且各种交易数量所占的比例也应该满足 TPC-C 规范的要求。在这种情况下,TpmC 值越大说明系统的 OLTP 能力越高。
4.3 测试用例介绍
4.3.1 数据准备
(1)客户端创建空数据库:
create database tpcctest;
(2)创建测试表结构:
./bin/mysql -uroot -p tpcctest < create_table.sql
./bin/mysql -uroot -p tpcctest < add_fkey_idx.sql
(3)创建数据:
使用命令行工具 tpcc_load 来提供初始化数据的功能。
如表 2 所示,介绍了 Tpcc-MySQL 在测试过程中常用的参数,需要特别介绍的是 warehouses,它代表了电商仓库的数量,每个仓库负责一定区域,每个顾客购买商品会随机选择一个仓库,在这个仓库中随机选择一些物品,仓库数量越多意味着测试的数据集越大(如果 warehouses 设置为 2500,会创建 160GB 左右的数据,warehouses 设为 5000 时,数据量大小在 280GB 左右)。
表 2、Tpcc-MySQL 测试参数介绍
数据加载命令:
./tpcc_load -h xxx -P 3306 -d tpcctest -u xxx -p xxx -w 10
图 3 示例显示了配置过程,创建了一个小型(十个仓库)测试数据集,数据库名为 tpcctest。
图 3、Tpcc-MySQL 数据创建图例
4.3.2 业务场景测试
使用命令行工具 tpcc_start 来进行压力测试。
./tpcc_start -h xxx -P 3306 -d tpcctest -u root -p '' -w 10 -c 32 -r 180 -l 360 -i 10 -f tpcc-mysql.log -t tpcc_mysql.rtx
图 4、Tpcc-MySQL 测试图例
图 4 为执行测试命令后的部分显示内容。在该项测试过程中选择的仓库数为 10,连接数为 32,热身时长为 180s,测试时长为 360s,打印报告的间隔时间为 10s,各项操作记录输出到 tpcc-mysql.log 文件中,更详细的操作信息输出到 tpcc_mysql.rtx 中。
4.3.2 测试结果分析
如图 5 所示,是跑出的 tpcc 业务场景测试结果:
图 5、Tpcc-MySQL 测试结果图例
测试结果的含义分别如下:
[0]:新订单业务
[1]:支付业务
[2]:订单状态查询业务
[3]:物流相关业务
[4]:仓储相关业务
sc: 表示执行成功且请求延时在最大阀值之内(5ms)的事务数
lt: 表示执行成功,但请求延时在最大阀值之外(5ms)的事务数
rt: 表示通过重试后执行成功的事务数
fl: 表示执行失败的事务数
avg_rt: 表示事务的平均处理延迟
主要测试结果:TmpC=96812.164
5、结语
MySQL 基准测试是数据库性能优化中非常重要的一个环节,针对不同的业务场景采用不同的基准测试方案。如果用户只是想测试简单的 OLTP 事务,可以选择采用 SysBench 来做基准测试。如果需要模拟一个完整的事务处理系统,可以采用 Tpcc-MySQL 来进行基准测试。当然,在 MySQL 系统上运行基准测试,就其技术本身而言在日常业务运维也是非常必要的,希望这些测试实例可以对大家开展相关基准测试工作能有所帮助。