https://tidb.net/blog/c9466c40#TiDB%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%8F%82%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C/%E5%9B%9B%E3%80%81%E6%80%BB%E7%BB%93

  

TiDB系统调参实战经验

一、引言

这次跟大家分享关于tidb软硬件调参方面的经验。

作为一名开源爱好者,go 语言开发者,笔者接触 TiDB 主要关注其对 MySQL 的高度兼容特性,分布式一致性保障等技术性的特点。得益于完善的生态工具支持,普通开发者想要体验 TiDB 十分容易。只需要使用 tiup playground 就可以迅速在本机启动一个仅供本机访问的TiDB集群。再或者恰好你有几台闲置的主机。编写好 deploy 文件。使用 tiup 一键发布也可以搭建起一个稍微正式的 TiDB 集群。但是笔者之前一直从未体验到一些不起眼的参数或者是系统设置会对 TiDB 系统的性能,稳定性造成如此大的影响。这些影响在实际大型项目中被数以十亿计的数据压力放大,从而影响到业务系统。笔者在解决这些问题中也积累了一点经验。遂记录一些要点与大家分享。

二、硬件环境调整

1、ntp同步服务

在 TiDB 实际生产落地时,检查硬件环境漏掉了 ntp 同步。马马虎虎地就把集群给启动起来并接入业务数据。之后查看监控所有面板都没有数据。

之后进行了长达 4 小时的排查过程。查监控组件日志,查系统日志等等,期间还重启了一次集群。都没有解决问题。在百思不得其解之际,笔者将 grafana 的监控时间选项调整为 “Last 7 days”。然后就看到面板上有数据,但是落后很长一段时间。遂检查集群中每个主机的时间。发现集群中主机时间不一致,都或多或少落后于标准时间。后续通过配置 ntp,指向统一的 ntp 服务器。之后 grafana 恢复正常,所有面板数据都能正常显示。

2、系统最大可打开文件数量

这一点主要在备份性能要求高时可能遇到,在使用 TiDB 的备份还原生态工具时,当备份程序打开文件数超过系统限制时,将中断备份还原操作。主要修改以下配置。

vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle: 0
net.ipv4.tcp_syncookies: 0
net.core.somaxconn: 32768
vm.swappiness: 0
vm.overcommit_memory: 0 or 1
fs.file-max: 1000000 vi /etc/security/limits.conf
<tidb-user> soft nofile 1000000
<tidb-user> hard nofile 1000000
<tidb-user> soft stack 32768
<tidb-user> hard stack 32768 其中<tidb-user>为发布集群时,设置的tidb用户

这一点可能会犯两个错,第一时忘记修改了这些配置,导致进行高速备份还原时,发生超出系统读取文件限制而中断。

另外一点就是即使配置了这些参数,调大了系统读取文件限制。但是没有用 tidb 的用户去操作备份还原工具,比如 br、dumpling、lightning,同样会报读取文件数超出限制。笔者就是在这里犯了错。发布时配置文件中写的用户是 tidb。备份还原使用的是 root 用户。

三、软件调参

1、mem-quota-query

单条 SQL 语句可以占用的最大内存阈值,单位为字节。

官网文档:https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file#mem-quota-query

这个配置值默认为1GB,当一条查询语句超过这个值就会触发OOM,导致查询失败。我们在日常使用过程中可能不会遇到这个限制。但是当数据量达到亿级以上,sql语句中嵌套join等复杂情况时,就可能发生OOM。

与其对应的系统变量是 tidb_mem_quota_query

官网文档:https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_mem_quota_query

这是一个 SESSION 级别的变量,只对当前会话有效。对于因为默认 mem-quota-query 阈值太小而发生OOM的情况。可以先设置会话级别的变量 tidb_mem_quota_query

2、txn-total-size-limit

TiDB 单个事务大小限制,默认大小 100M。

https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file#txn-total-size-limit

笔者在进行亿级大表更新时,发生了事务超出最大限制错误。原因是集群还部署了 binlog,当发生大表更新时,binlog 组件 pump 将抓取这个时间段的 binlog,并保证事务性。但是事务默认最大值是 100M,更新亿级大表的事务远大于 100M,遂发生报错。

可以根据实际业务情况,修改该配置值。但是最大不能超过10GB。

3、切分 Region

在对一张表进行大批量导入数据操作时,将会导致热点问题。这是由于 TiDB 新建一个表后,默认单独切分出一个 Region 来存储这个表的数据,等这个region数据超过 Region 默认大小限制后才会分裂成2个 Region。这样在大批量写入一个新表时,不仅所有的写入流量都集中在一个 Region,并且期间 Region分裂也需要时间调度。所以最佳的实践就是在大批量操作之前为表切分出更多 Region。这样写入流量就不会受region数量过少的限制。

例如将一个表切分16个region:

SPLIT TABLE t BETWEEN (0) AND (9223372036854775807) REGIONS 16;

4、SHARD_ROW_ID_BITS

对于非整数主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。大量执行 INSERT 插入语句时会把数据集中写入单个 Region,造成写入热点。

通过设置 SHARD_ROW_ID_BITS 可以把 rowid 打散写入到多个不同的 Region 中,以及缓解写入热点问题。但是也不能设置过大,过大会导致RPC请求数偏大,增加系统负载压力。

例如,将一个表分4片:

CREATE TABLE: CREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4;
ALTER TABLE: ALTER TABLE t SHARD_ROW_ID_BITS = 4;

调整分片数量需要根据实际表大小和业务情况酌情考虑,在笔者实际运维工作中,发现一张8亿大表出现写热点后,执行分片处理,分成3片就可以有效缓解写入热点问题了。

5、加快统计更新速度

统计更新用于更新 TiDB 在表和索引上留下的统计信息。执行大批量更新或导入记录后,或查询执行计划不是最佳时就需要执行统计更新操作。

默认的统计更新速度比较慢,可以通过调整参数的方式大大加快统计更新的速度。

set session tidb_build_stats_concurrency=30;
set session tidb_distsql_scan_concurrency=30;
set session tidb_index_serial_scan_concurrency=2;

6、加快建立索引速度

在 TiDB 数据迁移操作过程中经常会采取先迁移数据到目标库,然后在目标库上还原原本的索引。建立索引的速度可以通过调整两个参数来加快。

set global tidb_ddl_reorg_worker_cnt = 30
set global tidb_ddl_reorg_batch_size = 30

建立索引将占用大量的系统 I/O 资源,需要按经验适当调整参数来加快但不至于影响系统正常运行。

四、总结

在实际的 TiDB 实施工作中,客户往往会提出一些性能或者功能上的要求。TiDB 要求的硬件很高,无论是 CPU 核数,内存,硬盘,网卡等。TiDB 常规默认的配置旨在维护系统正常运行,要释放出 TiDB 较高的性能,需要合理调整参数,提高使用 TiDB 的效率。

另外,除了对 TiDB 实践项目应用适配的工作,笔者也在为 TiDB 相关仓库贡献代码。

 

TIDB for PG( https://github.com/DigitalChinaOpenSource/TiDB-for-PostgreSQL)

 

TiDB for PG 是笔者主要关注的开源项目之一。它在 TiDB 的基础上实现兼容pg语法的工作。是一件非常有趣且有意义的事情。感兴趣的小伙伴们可以关注一下哟

[转帖]TiDB系统调参实战经验的更多相关文章

  1. 数据库MySQL调优实战经验总结<转>

    数据库MySQL调优实战经验总结 MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证.仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设 ...

  2. 100天搞定机器学习|Day56 随机森林工作原理及调参实战(信用卡欺诈预测)

    本文是对100天搞定机器学习|Day33-34 随机森林的补充 前文对随机森林的概念.工作原理.使用方法做了简单介绍,并提供了分类和回归的实例. 本期我们重点讲一下: 1.集成学习.Bagging和随 ...

  3. 数据库MySQL调优实战经验总结

    MySQL 数据库的使用是非常的广泛,稳定性和安全性也非常好,经历了无数大小公司的验证.仅能够安装使用是远远不够的,MySQL 在使用中需要进行不断的调整参数或优化设置,才能够发挥 MySQL 的最大 ...

  4. JVM 性能调优实战之:一次系统性能瓶颈的寻找过程

    玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈.性能优化分为好几个层次,比如系统层次.算法层次.代码层次…JVM 的性能优化被认为是底层优化,门槛较高, ...

  5. 高性能 Java 计算服务的性能调优实战

    作者:vivo 互联网服务器团队- Chen Dongxing.Li Haoxuan.Chen Jinxia 随着业务的日渐复杂,性能优化俨然成为了每一位技术人的必修课.性能优化从何着手?如何从问题表 ...

  6. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  7. xgboost入门与实战(实战调参篇)

    https://blog.csdn.net/sb19931201/article/details/52577592 xgboost入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...

  8. XGboost数据比赛实战之调参篇(完整流程)

    这一篇博客的内容是在上一篇博客Scikit中的特征选择,XGboost进行回归预测,模型优化的实战的基础上进行调参优化的,所以在阅读本篇博客之前,请先移步看一下上一篇文章. 我前面所做的工作基本都是关 ...

  9. [调参]CV炼丹技巧/经验

    转自:https://www.zhihu.com/question/25097993 我和@杨军类似, 也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的 ...

  10. 听说你不会调参?TextCNN的优化经验Tricks汇总

    前言:本篇是TextCNN系列的第三篇,分享TextCNN的优化经验 前两篇可见: 文本分类算法TextCNN原理详解(一) TextCNN代码详解(附测试数据集以及GitHub 地址)(二) 调优模 ...

随机推荐

  1. 2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短字符串。 如果答案不止一个,则可以返回满足条件的任意一个答案。 输入:str1 =

    2023-07-07:给出两个字符串 str1 和 str2. 返回同时以 str1 和 str2 作为子序列的最短字符串. 如果答案不止一个,则可以返回满足条件的任意一个答案. 输入:str1 = ...

  2. 2023-05-31:给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数 在你跳跃的过程中,第 1、3、5... 次跳跃称为奇数跳跃 而第 2、4、6... 次跳跃称为偶数跳跃 你可以按以下

    2023-05-31:给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数 在你跳跃的过程中,第 1.3.5... 次跳跃称为奇数跳跃 而第 2.4.6... 次跳跃称为偶数跳跃 你可以按以下 ...

  3. 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎

    摘要:昇腾AI计算解决方案以极致算力,端边云融合.全栈创新,开放生态的硬核实力.用户可以使用标准的Matrix接口实现业务引擎,对外释放昇腾AI加速能力. 从卷积神经网络中的矩阵乘法(GEMM)说起 ...

  4. MySQL数据库技术与应用:数据查询

    摘要:数据查询是数据库系统应用的主要内容,也是用户对数据库最频繁.最常见的基本操作请求. 数据查询 数据查询是数据库系统应用的主要内容,也是用户对数据库最频繁.最常见的基本操作请求.数据查询可以根据用 ...

  5. 解析Spring内置作用域及其在实践中的应用

    摘要:本文详细解析了Spring的内置作用域,包括Singleton.Prototype.Request.Session.Application和WebSocket作用域,并通过实例讲解了它们在实际开 ...

  6. 带你认识MindSpore量子机器学习库MindQuantum

    摘要:MindSpore在3.28日正式开源了量子机器学习库MindQuantum,本文介绍MindQuantum的关键技术. 本文分享自华为云社区<MindSpore量子机器学习库MindQu ...

  7. SimpleDateFormat线程不安全了?这里有5种解决方案

    摘要:我们知道SimpleDateFormat是线程不安全,本文会介绍多种解决方案来保证线程安全. 本文分享自华为云社区<java的SimpleDateFormat线程不安全出问题了,虚竹教你多 ...

  8. GIS常用npm包:GeoJSON文件合并与元素过滤\属性过滤\图形合并

    GeoJSON文件合并 普通的geoJSON文件合并,只需geojson-merge插件就够了,https://www.npmjs.com/package/@mapbox/geojson-merge ...

  9. Log4Shell 漏洞披露已近一年,它对我们还有影响吗?

    在 Log4Shell 高危漏洞事件披露几乎整整一年之后,新的数据显示,对全球大多数组织来说,补救工作是一个漫长.缓慢.痛苦的过程. 根据漏洞扫描领先者 Tenable 公司的遥测数据来看,截至今年1 ...

  10. 火山引擎DataLeap数据调度实例的 DAG 优化方案(三):技术实现

    在原始数据中,是以一个数组的形式返回节点信息及依赖关系.所以,需要对数据进行处理形成图所需要的数据,同时,利用多个 map 对数据进行存储,方便后续对数据进行检索,减少时间复杂度. 实例节点的样式需要 ...