【TiDB 4.0 PCTA 学习笔记】- 2.3.4 How to Benchmark(如何对 TiDB 进行基准测试)@2班+元峥

课程名称:课程版本(101/201/301)+ 课程名称

学习时长:

课程收获:

课程内容:

基准测试建议

  • 实例选择原则

    • TiDB 实例,使用高性能 CPU 的服务器
    • TiKV 实例,使用高性能 SSD 的服务器,大于 16C,内存不要低于单机数据量的 10%,至少3台服务器
    • PD 实例,不需要太高的 CPU 和内存(4C16GB),最好有 SSD
  • 单实例 TiDB 的并发数控制在 500个 以内

  • 多实例 TiDB 中

    • 运行多个 benchmark 同时连接不同的 TiDB 实例,测试结果是所有实例 QPS 的总和
    • 使用像 HAProxy 这样的负载均衡工具进行连接(可能会影响测试性能)
  • 配置优化

    • 参考官网中测试报告的配置
    • 参考 TiKV 优化的相关课程

Sysbench 工具介绍

  • Sysbench 是一个基于 LuaJIT 的脚本化多实例的基准测试工具,常用于做数据库 OLTP 性能测试
  • Sysbench 提供的测试场景
    • oltp_insert
    • oltp_point_select
    • oltp_update_index
    • oltp_update_non_index
    • oltp_read_write

安装 Sysbench

配置 Sysbench

  • 准备配置文件
    • time 表示测试的持续实践
    • threads 表示测试的并发数

Sysbench 加载数据

  • 创建一个测试数据库

create database sbtest;

  • 如果使用乐观锁事务,开启自动重试功能,避免提交冲突报错

set global tidb_disable_txn_auto_retry = off;

  • 使用指定配置文件启动 sysbench 加载数据
    • –tables,sysbench会创建指定数量的表
    • –table-size,sysbench在创建的每个表中,导入指定数量的数据

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

启动 Sysbench 测试

  • 收集每个表的统计信息

ANALYZE TABLE sbtest1;

ANALYZE TABLE sbtest7;

  • 数据预热,建议每次重启集群之后都执行该步骤

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

  • 使用指定配置文件启动 Sysbench 测试

sysbench --config-file=config oltp_read_wirte --tables=16 --table-size=10000000 run --threads=64

Tips:在前面加载完数据之后,对 data 目录进行备份,每次测试之后用原来备份的目录覆盖再重新启动,这样可以保证每次使用不同并发数测试的时候基础数据是一致的

  • 测试结果示例

TPC-C 工具介绍

  • TPC-C 是一个 OLTP 数据库性能测试工具。他使用一个电商平台销售模型进行测试,包括以下几种类型:

    • NewOrder
    • Payment
    • OrderStatus
    • Delivery
    • StockLevel
  • tpm-C 表示每分钟新订单的事务数

  • Warehouse ,表示货品仓库,会进行商品动态调度。

    • 2500 warehouse,大概160GB 的数据量
    • 5000 warehouse,大概280GB 的数据量
    • warehouse 数量越少,意味着越多客户从同一个仓库购买商品,以此事务冲突会越严重

安装 TPC-C

  • 安装 java,ant 包

yum install -y java ant

  • 修改 benchmarksql,添加兼容 MySQL 协议

git clone -b 5.0-mysql-suport-opt-2.1 https://github.com/pingcap/benchmarksql.git

cd benchmarksql; ant

配置 TPC-C

  • 修改 tpcc 配置文件
    • warehouse,商品仓库数量,影响数据量
    • terminals,并发数
    • loadWorkers,加载数据的并发数,不要设置过高,可能导致数据加载失败

TPC-C 加载数据

  • 创建一个测试数据库

create database sbtest;

  • 如果使用乐观锁事务,开启自动重试功能,避免提交冲突报错

set global tidb_disable_txn_auto_retry = off;

  • 创建 tpcc 表结构

cd run && ./runSQL.sh props.mysql sql.mysql/tableCreates.sql && \

./runSQL.sh props.mysql sql.mysql/indexCreates.sql

  • 导入 tpcc 数据
    • 整个 tpcc 测试最耗时,最容易报错的步骤
    • loadWorkers 参数不要设置过高

./runLoader.sh props.mysql

启动 TPC-C 测试

  • 启动 benchmark

./runBenchmark.sh props.mysql

  • 测试结果

    • tpmC
  • 数据一致性验证(可选)

    • 如果所有 SQL 返回结果为空 ,则表示测试过程中 数据没问题

./runSQL.sh props.mysql sql.common/test.sql

测试过程的常见问题

  • 增加并发数之后,为什么 TiKV 的 CPU 使用率仍然很低?

    • 检查负载是否均衡,是否存在写热点
  • 检查 TiKV 模块是否存在 CPU 瓶颈(查看监控模版:TiKV THread CPU Panel)

  • 增加并发数之后,TiKV 的 CPU 没有达到瓶颈,为什么 CPU 使用率仍然很低?

    • 考虑是否 NUMA 的影响,即跨服务器的内存访问
  • TiDB 和 TiKV 增大并发压力之后,为什么整体性能负载还是很低?

    • 检查监控面板 TiDB ideal QPS
      • 这里是根据并发和延迟反推出 QPS 的
      • 该值应该跟实际的 QPS 差不多,如果相差过大,可能是客户端并发度达到瓶颈
      • 也可能是 HAProxy 导致,可以尝试对单个 TiDB 进行测试

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