作者:leeray



TiDB 5.0 部分新特性试用



一、引言

2021年 04 月 07 日 TiDB 5.0.0版本正式发版。每一个大版本的更新都有一个主题。如果说 TiDB 4.0 的关键词是更多新功能与新特性。TiDB 5.0 的关键词可以说是“内功”。根据官方文档(https://docs.pingcap.com/zh/tidb/stable/release-5.0.0#whats-new-in-tidb-50)​ 可以了解到新增特性。
在发布的核心关键特性中,大部分都是性能提升,还有另外一部分是关于系统稳定性提升的特性。今天就针对部分性能提升的特性做一些简要的测试,通过实验数据对比 TiDB 5.0 与 TiDB 4.0 的差别。



二、特性验证

1、TiDB 5.0 引入聚簇索引功能,提升数据库性能。这方面以 TPC-C tpmC 性能提升 39% 为例。下面的验证性实验将使用 tiup 的 bench 组件进行 TiDB 4.0 和 5.0 的 TPC-C 测试。

TPC-C 是一个对 OLTP(联机交易处理)系统进行测试的规范,使用一个商品销售模型对 OLTP 系统进行测试,其中包含五类事务:

  • NewOrder – 新订单的生成
  • Payment – 订单付款
  • OrderStatus – 最近订单查询
  • Delivery – 配送
  • StockLevel – 库存缺货状态分析

TPC-C 使用 tpmC 值(Transactions per Minute)来衡量系统最大有效吞吐量(MQTH, Max, Qualified Throughput)。其中 Transaction 以NewOrder Transaction 为准,即最终衡量单位为每分钟处理的新订单数。

下面使用 300 WAREHOUSE 为例进行测试。在相同的资源分配情况下分别对 TiDB 4.0 和 5.0 进行测试。

两次测试均使用以下硬件配置,集群架构则是 1PD、1TiDB、5TiKV。

| IP | 部署节点 | OS | 网卡 | CPU | 内存 | 存储 | | ----------- | ----- | ------- | -- | --- | --- | ---- | | 10.3.72.145 | PD,监控 | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.87 | TiDB | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.83 | TiKV | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.125 | TiKV | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.90 | TiKV | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.86 | TiKV | Centos7 | 千兆 | 4核 | 20G | 120g | | 10.3.72.88 | TiKV | Centos7 | 千兆 | 4核 | 20G | 120g |

使用 tiup 命令分别测试集群 TPC-C 能力,每一个版本都测试多次取平均值,排除偶然误差。

## 导入数据
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 1000 prepare

## 运行测试
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 1000 run

## 清理数据
tiup bench tpcc -H 10.3.72.87 -P 4000 -D tpcc --warehouses 4 cleanup

TiDB 5.0 部分新特性试用_centos

从 tpm 的柱状图中可以看出v5,0在 new_order,payment 等事务的tpm数值都高于 v4.0。增长幅度在 20% -30% 之间,与官网提供的增长幅度数据 39% 有一定差距。由于实验环境的影响,实验数据的偏差在这个范围内也是可以接受的。

TPC-C 的实验比较耗时,导入数据以及运行实验都会花费较长时间,最好将实验数据保存到文本中,即 run 命令之后再加上">> tpc.log",以免过程中 ssh 连接工具意外断开丢失实验结果,导致前功尽弃。

2、TiDB 5.0 默认开启异步提交事务功能。数据库的客户端会同步等待数据库系统通过两阶段 (2PC) 完成事务的提交,事务在第一阶段提交成功后就会返回结果给客户端,系统会在后台异步执行第二阶段提交操作,降低事务提交的延迟。据官网文档所述,在一定配置情况下,Sysbench 设置 64 线程测试 Update index 时, 平均延迟由 12.04 ms 降低到 7.01ms ,降低了 41.7%。接下来在我的本地环境下分别对 TiDB 5.0 和 TiDB 4.0 进行Sysbench 测试,验证一下性能提升效果。

使用 Sysbench 自带 oltp_update_index.lua 脚本分别对 5.0 和 4.0 的 TiDB 集群进行多次测试,取测试结果的平均值作为参考。集群配置与上一点中的表格内容相同

使用如下命令测试集群。测试规模为20张表,每张表100w行数据,并发线程为64。

## 初始化库表结构以及数据
sysbench oltp_update_index --config-file=tidb-config --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 prepare

## 运行只写脚本,触发cdc同步任务。
sysbench oltp_update_index --config-file=tidb-config --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 run

##清理数据
sysbench oltp_update_index --config-file=tidb-config --tables=20 --table-size=1000000 --report-interval=10 --threads=64 --time=100 cleanup

对比测试结果如下图

TiDB 5.0 部分新特性试用_性能提升_02

v4.0 和 v5.0 平均时延分别是 74.40 ms 和 43.71 ms, 性能提升 41.25%。基本符合官网提供的数据。

3、通过提升优化器的稳定性及限制系统任务对 I/O、网络、CPU、内存等资源的占用,降低系统的抖动。例如:测试 8 小时,TPC-C 测试中 tpmC 抖动标准差的值小于等于 2%。对于系统稳定性提升的感受,从第二点测试中95%的时延也可以看出来,v5.0 绝大部分查询都在一个稳定的 QPS 下完成,所以 95% 时延与其平均时延基本持平。而 v4.0 的 95% 时延数值则偏大。说明其系统存在比较明显的抖动情况,造成一部分查询完成时间较长。

官网使用tpc-c实验数据计算tpmC的抖动标准差来反映v5.0稳定性的提升,我们这里就使用Sysbench一段时间内的 QPS 来计算标准差来看一下 v4.0 和 v5.0 稳定性的差别。

使用 Sysbench 的 update_index 脚本在相同情况下分别对v4.0 和 v5.0 进行 1000 秒的测试,计算过程中报告的实时QPS计算得出v4.0与v5.0的实时QPS标准差分别是 634.1 和 127.4。通过这种粗略的方式可以看出二者QPS的稳定性确实有比较大的差别,由于时间有限,只进行了1000s 的实验,所得数据可能不太能准确反映二者实际稳定性的表现。只能大致了解一下稳定性的提升效果。



三、总结

总结上面的验证结果,我们可以直观地了解到TiDB通过内部代码的优化,实实在在地提高了数据库各方面的性能以及稳定性。通过异步提交事务,引入聚簇索引提升数据库性能,降低写入数据延迟。通过提升优化器的稳定性及限制系统任务对I/O,网络,内存资源的占用,降低系统抖动。通过这次实验,在一定配置和软件环境下通过实验数据大致了解到TiDB V5.0.0 所带来的提升。除了这次实验所说的部分特性,还有很多特性有待大家一起探索,比如TiFlash引入的MPP架构,备份到云存储,TiCDC等。