【TiDB 4.0 PCTA 学习笔记】- 2.3.4 How to Benchmark(如何对 TiDB 进行基准测试)@3+ 邓喆

课程名称:2.3.4 How to Benchmark(如何对 TiDB 进行基准测试)

学习时长:

20分钟

课程收获:

本课程简要介绍了 TiDB 性能测试的最佳实践,其中主要包括了如果使用 Sysbench 和 TPCC 对 TiDB 进行 OLTP 性能测试,以及影响测试结果的一些要点。

课程内容:

测试环境

  • 硬件要求
  • 参考 TiDB 部署文档部署 TiDB 集群。在 3 台服务器的条件下,建议每台机器部署 1 个 TiDB,1 个 PD,和 1 个 TiKV 实例。关于磁盘,以 32 张表、每张表 10M 行数据为例,建议 TiKV 的数据目录所在的磁盘空间大于 512 GB。 对于单个 TiDB 的并发连接数,建议控制在 500 以内,如需增加整个系统的并发压力,可以增加 TiDB 实例,具体增加的 TiDB 个数视测试压力而定。

IDC 机器:

类别 名称
OS Linux (CentOS 7.3.1611)
CPU 40 vCPUs, Intel® Xeon® CPU E5-2630 v4 @ 2.20GHz
RAM 128GB
DISK Intel Optane SSD P4800X 375G * 1
NIC 10Gb Ethernet

测试方案

TiDB 版本信息

组件 GitHash
TiDB 7a240818d19ae96e4165af9ea35df92466f59ce6
TiKV e26ceadcdfe94fb6ff83b5abb614ea3115394bcd
PD 5e81548c3c1a1adab056d977e7767307a39ecb70

集群拓扑

机器 IP 部署实例
172.16.30.31 3*sysbench
172.16.30.33 1tidb 1pd 1*tikv
172.16.30.34 1tidb 1pd 1*tikv
172.16.30.35 1tidb 1pd 1*tikv

TiDB 配置

升高日志级别,可以减少打印日志数量,对 TiDB 的性能有积极影响。开启 TiDB 配置中的 prepared plan cache,以减少优化执行计划的开销。具体在 TiDB 配置文件中加入:

[log]
level = "error"
[prepared-plan-cache]
enabled = true

TiKV 配置

升高 TiKV 的日志级别同样有利于提高性能表现。

TiKV 集群存在多个 Column Family,包括 Default CF、Write CF 和 LockCF,主要用于存储不同类型的数据。对于 Sysbench 测试,需要关注 Default CF 和 Write CF,导入数据的 Column Family 在 TiDB 集群中的比例是固定的。这个比例是:

Default CF : Write CF = 4 : 1

在 TiKV 中需要根据机器内存大小配置 RocksDB 的 block cache,以充分利用内存。以 40 GB 内存的虚拟机部署一个 TiKV 为例,其 block cache 建议配置如下:

log-level = "error"
[rocksdb.defaultcf]
block-cache-size = "24GB"
[rocksdb.writecf]
block-cache-size = "6GB"

对于 3.0 及以后的版本,还可以使用共享 block cache 的方式进行设置:

log-level = "error"
[storage.block-cache]
capacity = "30GB"

更详细的 TiKV 参数调优请参考 TiKV 内存参数性能调优

测试过程

注意:

此次测试并没有使用如 HAproxy 等负载均衡工具。在 TiDB 单一节点上进行 Sysbench 测试,并把结果相加。负载均衡工具和不同版本参数也会影响性能表现。

Sysbench 配置

以下为 Sysbench 配置文件样例:

mysql-host={TIDB_HOST}
mysql-port=4000
mysql-user=root
mysql-password=password
mysql-db=sbtest
time=600
threads={8, 16, 32, 64, 128, 256}
report-interval=10
db-driver=mysql

可根据实际需求调整其参数,其中 TIDB_HOST 为 TiDB server 的 IP 地址(配置文件中不能写多个地址),threads 为测试中的并发连接数,可在 “8, 16, 32, 64, 128, 256” 中调整,导入数据时,建议设置 threads = 8 或者 16。调整后,将该文件保存为名为 config 的文件。

配置文件参考示例如下:

mysql-host=172.16.30.33
mysql-port=4000
mysql-user=root
mysql-password=password
mysql-db=sbtest
time=600
threads=16
report-interval=10
db-driver=mysql

数据导入

在数据导入前,需要对 TiDB 进行简单设置。在 MySQL 客户端中执行如下命令:

set global tidb_disable_txn_auto_retry = off;

然后退出客户端。TiDB 使用乐观事务模型,当发现并发冲突时,会回滚事务。将 tidb_disable_txn_auto_retry 设置为 off 会开启事务冲突后的自动重试机制,可以尽可能避免事务冲突报错导致 Sysbench 程序退出的问题。

重新启动 MySQL 客户端执行以下 SQL 语句,创建数据库 sbtest

create database sbtest;

调整 Sysbench 脚本创建索引的顺序。Sysbench 按照“建表->插入数据->创建索引”的顺序导入数据。该方式对于 TiDB 需要花费更多的导入时间。用户可以通过调整顺序来加速数据的导入。

假设用户使用的 Sysbench 版本。我们可以通过以下两种方式来修改。

  1. 直接下载为 TiDB 修改好的 oltp_common.lua 文件,覆盖 /usr/share/sysbench/oltp_common.lua 文件。
  2. /usr/share/sysbench/oltp_common.lua 的第 235 行到第 240 行移动到第 198 行以后。

注意:

此操作为可选操作,仅节约了数据导入时间。

命令行输入以下命令,开始导入数据,config 文件为上一步中配置的文件:

sysbench --config-file=config oltp_point_select --tables=32 --table-size=10000000 prepare

数据预热与统计信息收集

数据预热可将磁盘中的数据载入内存的 block cache 中,预热后的数据对系统整体的性能有较大的改善,建议在每次重启集群后进行一次数据预热。

Sysbench 1.0.14 没有提供数据预热的功能,因此需要手动进行数据预热。如果使用更新的 Sysbench 版本,可以使用自带的预热功能。

以 Sysbench 中某张表 sbtest7 为例,执行如下 SQL 语句 进行数据预热:

SELECT COUNT(pad) FROM sbtest7 USE INDEX (k_7);

统计信息收集有助于优化器选择更为准确的执行计划,可以通过 analyze 命令来收集表 sbtest 的统计信息,每个表都需要统计。

ANALYZE TABLE sbtest7;

Point select 测试命令

sysbench --config-file=config oltp_point_select --tables=32 --table-size=10000000 run

Update index 测试命令

sysbench --config-file=config oltp_update_index --tables=32 --table-size=10000000 run

Read-only 测试命令

sysbench --config-file=config oltp_read_only --tables=32 --table-size=10000000 run

学习过程中参考的其他资料

同学你好,感谢参与 TiDB 4.0 课程的学习!

本篇笔记逻辑清晰、内容丰富,被评选为优质笔记,将额外获得 20 积分,并在 「TiDB 培训」分类下获得“置顶”权益,积分兑换规则将于近期开放,敬请关注!

期待您继续产出优质内容!

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。