PingCAP
  • PingCAP University
  • 文档
  • 案例
  • 社区
  • 博客
  • 关于
  • 问答
  • 联系我们
PingCAP
  • 文档
  • 案例
  • 社区
  • 博客
  • 关于
  • 问答
  • 联系我们
  • PingCAP University

Contact

  • Wechat qrCode

    微信扫一扫
    微信ID:pingcap2015

English
文档
v3.0 (stable) dev v2.1
  • 关于 TiDB
    • TiDB 简介
    • Benchmark 测试
      • 如何用 Sysbench 测试 TiDB
      • 如何对 TiDB 进行 TPC-C 测试
      • Sysbench 性能对比 - v3.0 对比 v2.1
      • TPC-C 性能对比 - v3.0 对比 v2.1
      • 线上负载与 `Add Index` 相互影响测试
      • TiDB in Kubernetes Sysbench 性能测试
      • DM 1.0-GA 性能测试
  • 主要概念
    • 整体架构
    • 核心特性
      • 水平扩展
      • 高可用
  • 操作指南
    • 快速上手
      • 创建集群
        • 使用 Docker Compose 部署 TiDB 集群
      • SQL 基本操作
      • 读取历史数据
      • TiDB Binlog 教程
      • TiDB Data Migration 教程
      • TiDB Lightning 教程
      • TiSpark 教程
    • 部署
      • 软硬件环境需求
      • 集群部署方式
        • 使用 Ansible 部署(推荐)
        • 使用 Ansible 离线部署
        • 使用 Docker 部署
      • 跨地域冗余
        • 跨数据中心部署方案
        • 配置集群拓扑
      • 使用 Ansible 部署 DM 集群
    • 配置
      • 时区
      • 内存控制
    • 安全
      • 安全传输层协议 (TLS)
        • 为 MySQL 客户端开启 TLS
        • 为 TiDB 组件间开启 TLS
      • 生成自签名证书
    • 监控
      • 概述
      • 监控 TiDB 集群
    • 迁移
      • 概述
      • 从 MySQL 迁移
        • 全量迁移
        • 增量复制
      • 从 Amazon Aurora MySQL 迁移数据
      • 从 CSV 迁移
    • 运维
      • Ansible 常见运维操作
      • 备份与恢复
        • 使用 Mydumper/Loader 进行备份与恢复
        • 使用 BR 进行备份与恢复
      • 定位慢查询
    • 扩容缩容
      • 使用 Ansible 扩容缩容
    • 升级
      • 升级至 TiDB 3.1
    • 故障诊断
      • 集群配置诊断
      • TiDB Lightning 故障诊断
  • 参考手册
    • SQL
      • 与 MySQL 兼容性对比
      • SQL 语言结构
        • 字面值
        • Schema 对象名
        • 关键字和保留字
        • 用户自定义变量
        • 表达式语法
        • 注释语法
      • 数据类型
        • 概述
        • 默认值
        • 数值类型
          • `BIT`
          • `BOOL|BOOLEAN`
          • `TINYINT`
          • `SMALLINT`
          • `MEDIUMINT`
          • `INT|INTEGER`
          • `BIGINT`
          • `DECIMAL`
          • `FLOAT`
          • `DOUBLE`
        • 日期和时间类型
          • `DATE`
          • `DATETIME`
          • `TIMESTAMP`
          • `TIME`
          • `YEAR`
        • 字符串类型
          • `CHAR`
          • `VARCHAR`
          • `TEXT`
          • `LONGTEXT`
          • `BINARY`
          • `VARBINARY`
          • `TINYBLOB`
          • `BLOB`
          • `MEDIUMBLOB`
          • `LONGBLOB`
          • `ENUM`
          • `SET`
        • JSON Type
      • 函数与操作符
        • 函数与操作符概述
        • 表达式求值的类型转换
        • 操作符
        • 控制流程函数
        • 字符串函数
        • 数值函数与操作符
        • 日期和时间函数
        • 位函数和操作符
        • Cast 函数和操作符
        • 加密和压缩函数
        • 信息函数
        • JSON 函数
        • GROUP BY 聚合函数
        • 窗口函数
        • 其它函数
        • 精度数学
        • 下推到 TiKV 的表达式列表
      • SQL 语句
        • `ADD COLUMN`
        • `ADD INDEX`
        • `ADMIN`
        • `ALTER DATABASE`
        • `ALTER TABLE`
        • `ALTER USER`
        • `ANALYZE TABLE`
        • `BEGIN`
        • `COMMIT`
        • `CREATE DATABASE`
        • `CREATE INDEX`
        • `CREATE TABLE LIKE`
        • `CREATE TABLE`
        • `CREATE USER`
        • `CREATE VIEW`
        • `DEALLOCATE`
        • `DELETE`
        • `DESC`
        • `DESCRIBE`
        • `DO`
        • `DROP COLUMN`
        • `DROP DATABASE`
        • `DROP INDEX`
        • `DROP TABLE`
        • `DROP USER`
        • `DROP VIEW`
        • `EXECUTE`
        • `EXPLAIN ANALYZE`
        • `EXPLAIN`
        • `FLUSH PRIVILEGES`
        • `FLUSH STATUS`
        • `FLUSH TABLES`
        • `GRANT <privileges>`
        • `INSERT`
        • `KILL [TIDB]`
        • `LOAD DATA`
        • `MODIFY COLUMN`
        • `PREPARE`
        • `RECOVER TABLE`
        • `RENAME INDEX`
        • `RENAME TABLE`
        • `REPLACE`
        • `REVOKE <privileges>`
        • `ROLLBACK`
        • `SELECT`
        • `SET [NAMES|CHARACTER SET]`
        • `SET PASSWORD`
        • `SET TRANSACTION`
        • `SET [GLOBAL|SESSION] <variable>`
        • `SHOW CHARACTER SET`
        • `SHOW COLLATION`
        • `SHOW [FULL] COLUMNS FROM`
        • `SHOW CREATE TABLE`
        • `SHOW CREATE USER`
        • `SHOW DATABASES`
        • `SHOW ENGINES`
        • `SHOW ERRORS`
        • `SHOW [FULL] FIELDS FROM`
        • `SHOW GRANTS`
        • `SHOW INDEXES [FROM|IN]`
        • `SHOW INDEX [FROM|IN]`
        • `SHOW KEYS [FROM|IN]`
        • `SHOW PRIVILEGES`
        • `SHOW [FULL] PROCESSSLIST`
        • `SHOW SCHEMAS`
        • `SHOW [FULL] TABLES`
        • `SHOW TABLE REGIONS`
        • `SHOW TABLE STATUS`
        • `SHOW [GLOBAL|SESSION] VARIABLES`
        • `SHOW WARNINGS`
        • `SPLIT REGION`
        • `START TRANSACTION`
        • `TRACE`
        • `TRUNCATE`
        • `UPDATE`
        • `USE`
      • 约束
      • 生成列
      • 分区表
      • 字符集
      • SQL 模式
      • 视图
    • 配置
      • tidb-server
        • MySQL 系统变量
        • TiDB 特定系统变量
        • 配置参数
        • 配置文件描述
      • pd-server
        • 配置参数
        • 配置文件描述
      • tikv-server
        • 配置参数
        • 配置文件描述
    • 安全
      • 与 MySQL 的安全特性差异
      • TiDB 数据库权限管理
      • TiDB 用户账户管理
      • 基于角色的访问控制
    • 事务
      • 事务语句
      • 事务模型
      • 隔离级别
      • 悲观事务
    • 系统数据库
      • `mysql`
      • `information_schema`
    • 错误码
    • 支持的连接器和 API
    • 垃圾回收 (GC)
      • GC 机制简介
      • GC 配置
    • 性能调优
      • SQL 优化流程
      • 理解 TiDB 执行计划
      • 执行计划绑定
      • 统计信息概述
      • Optimizer Hints
      • Follower Read
      • 使用 SQL 语句检查 TiDB 集群状态
      • Statement Summary Table
      • TiKV 调优
      • TiDB 最佳实践
    • 监控指标
      • Overview 面板
      • TiDB 面板
      • PD 面板
      • TiKV 面板
    • 报警规则
    • 最佳实践
      • HAProxy 最佳实践
      • Java 应用开发最佳实践
      • 高并发写入场景最佳实践
      • Grafana 监控最佳实践
      • PD 调度策略最佳实践
      • 海量 Region 集群调优最佳实践
      • 乐观锁事务最佳实践
    • TiSpark 使用指南
    • TiDB Binlog
      • 概述
      • 部署使用
      • 运维管理
      • 版本升级
      • 监控告警
      • 增量恢复
      • Kafka 自定义开发
      • 故障诊断
        • 故障诊断
        • 常见错误修复
      • FAQ
    • 周边工具
      • Mydumper
      • Loader
      • Syncer
      • Data Migration
        • 概述
          • DM 架构
          • 同步功能介绍
          • 使用限制
          • DM-worker 简介
          • DM Relay Log
        • 核心特性
          • Table Routing
          • Black & White Lists
          • Binlog Event Filter
          • 同步延迟监控
          • Shard Support
            • 简介
            • 使用限制
            • 手动处理 Sharding DDL Lock
        • 使用场景
          • 简单的从库同步场景
          • 分库分表合并场景
          • 分表合并数据迁移最佳实践
          • DM-worker 在上游 MySQL 主从间切换
        • 部署使用
        • 配置
          • 概述
          • DM-master 配置
          • DM-worker 配置
          • 任务配置
        • DM 集群管理
          • 集群操作
          • 集群升级
        • DM 同步任务管理
          • 管理数据同步任务
          • 任务前置检查
          • 任务状态查询
          • 跳过或替代执行异常的 SQL 语句
        • 监控 DM 集群
        • 从与 MySQL 兼容的数据库迁移数据
          • 从 Amazon Aurora MySQL 迁移数据
        • DM Portal
        • DM 故障诊断
          • 故障诊断
          • 错误含义
          • 常见错误修复
        • DM FAQ
        • 版本发布历史
          • v1.0
            • 1.0.2
        • TiDB DM 术语表
      • TiDB Lightning
        • 概述
        • 部署执行
        • 断点续传
        • 表库过滤
        • CSV 支持
        • 监控告警
        • 故障诊断
        • FAQ
      • sync-diff-inspector
      • PD Control
      • PD Recover
      • TiKV Control
      • TiDB Controller
      • 工具下载
  • TiDB in Kubernetes
    • TiDB Operator 简介
    • 快速上手
      • kind
      • GKE
      • Minikube
    • 部署
      • 集群环境要求
      • 部署 TiDB Operator
      • 标准 Kubernetes 上的 TiDB 集群
      • AWS EKS 上的 TiDB 集群
      • GCP 上的 TiDB 集群
      • 阿里云上的 TiDB 集群
      • 访问 Kubernetes 上的 TiDB 集群
    • 配置
      • 初始化集群
    • 监控
    • 运维
      • 销毁 TiDB 集群
      • 维护 TiDB 集群所在节点
      • 备份与恢复
      • 恢复 Kubernetes 上的 TiDB 集群数据
      • 收集日志
      • 集群故障自动转移
      • TiDB Binlog
    • 扩缩容
    • 升级
      • TiDB 集群
      • TiDB Operator
    • 参考信息
      • 配置
        • 集群配置
        • 备份配置
        • PV 配置
        • TiDB Drainer
      • 工具
        • tkctl
        • 相关工具使用
    • 故障诊断
    • 常见问题
  • 常见问题 (FAQ)
    • TiDB FAQ
    • TiDB Lightning FAQ
    • 升级 FAQ
  • 技术支持
    • 支持渠道
    • 反馈问题
  • 贡献
    • 贡献代码
    • 改进文档
  • TiDB 路线图
  • 版本发布历史
    • v3.0
      • 3.0.7
      • 3.0.6
      • 3.0.5
      • 3.0.4
      • 3.0.3
      • 3.0.2
      • 3.0.1
      • 3.0 GA
      • 3.0.0-rc.3
      • 3.0.0-rc.2
      • 3.0.0-rc.1
      • 3.0.0-beta.1
      • 3.0.0-beta
    • v2.1
      • 2.1.18
      • 2.1.17
      • 2.1.16
      • 2.1.15
      • 2.1.14
      • 2.1.13
      • 2.1.12
      • 2.1.11
      • 2.1.10
      • 2.1.9
      • 2.1.8
      • 2.1.7
      • 2.1.6
      • 2.1.5
      • 2.1.4
      • 2.1.3
      • 2.1.2
      • 2.1.1
      • 2.1 GA
      • 2.1 RC5
      • 2.1 RC4
      • 2.1 RC3
      • 2.1 RC2
      • 2.1 RC1
      • 2.1 Beta
    • v2.0
      • 2.0.11
      • 2.0.10
      • 2.0.9
      • 2.0.8
      • 2.0.7
      • 2.0.6
      • 2.0.5
      • 2.0.4
      • 2.0.3
      • 2.0.2
      • 2.0.1
      • 2.0
      • 2.0 RC5
      • 2.0 RC4
      • 2.0 RC3
      • 2.0 RC1
      • 1.1 Beta
      • 1.1 Alpha
    • v1.0
      • 1.0
      • Pre-GA
      • RC4
      • RC3
      • RC2
      • RC1
  • 术语表

如何用 Sysbench 测试 TiDB

本次测试使用的是 TiDB 3.0 Beta 和 Sysbench 1.0.14。建议使用 Sysbench 1.0 或之后的更新版本,可在 Sysbench Release 1.0.14 页面下载。

测试环境

  • 硬件要求

  • 参考 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 1*tidb 1*pd 1*tikv
172.16.30.34 1*tidb 1*pd 1*tikv
172.16.30.35 1*tidb 1*pd 1*tikv

TiDB 配置

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

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

TiKV 配置

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

由于 TiKV 是以集群形式部署的,在 Raft 算法的作用下,能保证大多数节点已经写入数据。因此,除了对数据安全极端敏感的场景之外,raftstore 中的 sync-log 选项可以关闭。

TiKV 集群存在两个 Column Family(Default CF 和 Write CF),主要用于存储不同类型的数据。对于 Sysbench 测试,导入数据的 Column Family 在 TiDB 集群中的比例是固定的。这个比例是:

Default CF : Write CF = 4 : 1

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

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

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

log-level = "error"
[raftstore]
sync-log = false
[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

测试结果

测试了数据 32 表,每表有 10M 数据。

对每个 tidb-server 进行了 Sysbench 测试,将结果相加,得出最终结果:

oltp_point_select

类型 Thread TPS QPS avg.latency(ms) .95.latency(ms) max.latency(ms)
point_select 3*8 67502.55 67502.55 0.36 0.42 141.92
point_select 3*16 120141.84 120141.84 0.40 0.52 20.99
point_select 3*32 170142.92 170142.92 0.58 0.99 28.08
point_select 3*64 195218.54 195218.54 0.98 2.14 21.82
point_select 3*128 208189.53 208189.53 1.84 4.33 31.02

oltp_point_select

oltp_update_index

类型 Thread TPS QPS avg.latency(ms) .95.latency(ms) max.latency(ms)
oltp_update_index 3*8 9668.98 9668.98 2.51 3.19 103.88
oltp_update_index 3*16 12834.99 12834.99 3.79 5.47 176.90
oltp_update_index 3*32 15955.77 15955.77 6.07 9.39 4787.14
oltp_update_index 3*64 18697.17 18697.17 10.34 17.63 4539.04
oltp_update_index 3*128 20446.81 20446.81 18.98 40.37 5394.75
oltp_update_index 3*256 23563.03 23563.03 32.86 78.60 5530.69

oltp_update_index

oltp_read_only

类型 Thread TPS QPS avg.latency(ms) .95.latency(ms) max.latency(ms)
oltp_read_only 3*8 2411.00 38575.96 9.92 20.00 92.23
oltp_read_only 3*16 3873.53 61976.50 12.25 16.12 56.94
oltp_read_only 3*32 5066.88 81070.16 19.42 26.20 123.41
oltp_read_only 3*64 5466.36 87461.81 34.65 63.20 231.19
oltp_read_only 3*128 6684.16 106946.59 57.29 97.55 180.85

oltp_read_only

常见问题

在高并发压力下,TiDB、TiKV 的配置都合理,为什么整体性能还是偏低?

这种情况可能与使用了 proxy 有关。可以尝试直接对单个 TiDB 加压,将求和后的结果与使用 proxy 的情况进行对比。

以 HAproxy 为例。nbproc 参数可以增加其最大启动的进程数,较新版本的 HAproxy 还支持 nbthread 和 cpu-map 等。这些都可以减少对其性能的不利影响。

在高并发压力下,为什么 TiKV 的 CPU 利用率依然很低?

TiKV 虽然整体 CPU 偏低,但部分模块的 CPU 可能已经达到了很高的利用率。

TiKV 的其他模块,如 storage readpool、coprocessor 和 gRPC 的最大并发度限制是可以通过 TiKV 的配置文件进行调整的。

通过 Grafana 的 TiKV Thread CPU 监控面板可以观察到其实际使用率。如出现多线程模块瓶颈,可以通过增加该模块并发度进行调整。

在高并发压力下,TiKV 也未达到 CPU 使用瓶颈,为什么 TiDB 的 CPU 利用率依然很低?

在某些高端设备上,使用的是 NUMA 架构的 CPU,跨 CPU 访问远端内存将极大降低性能。TiDB 默认将使用服务器所有 CPU,goroutine 的调度不可避免地会出现跨 CPU 内存访问。

因此,建议在 NUMA 架构服务器上,部署 n 个 TiDB(n = NUMA CPU 的个数),同时将 TiDB 的 max-procs 变量的值设置为与 NUMA CPU 的核数相同。

"如何用 Sysbench 测试 TiDB" 更新于 Nov 11 2019: dev, v2.1, v3.0: update sysbench config (#1549) (5a95624)
修改本文 反馈文档问题

本页导航

产品

  • TiDB
  • TiSpark
  • TiDB 路线图

文档

  • 快速入门
  • 最佳实践
  • 常见问题解答
  • TiDB 周边工具
  • 版本发布说明

资源

  • 博客
  • GitHub
  • 知乎专栏
  • PingCAP University
  • 联合解决方案
  • Ask TUG

公司

  • 关于我们
  • 招贤纳士
  • 新闻报道

联系我们

  • Twitter
  • LinkedIn
  • Reddit
  • Google Group
  • Stack Overflow
  • 微信公众号
    Wechat qrCode

    微信扫一扫
    微信ID:pingcap2015

© 2019 北京平凯星辰科技发展有限公司

English