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. 我用 Laf 开发了一个非常好用的密码管理工具

    [KeePass 密码管理]是一款简单.安全简洁的账号密码管理工具,服务端使用 Laf 云开发,支持指纹验证.FaceID,N 重安全保障,可以随时随地记录我的账号和密码. 写这个小程序之前,在国内市 ...

  2. 构建万物互联,华为云IoT+鸿蒙重燃物体感知

    摘要:鸿蒙的出现,让硬件.软件行业面临着变革与重构的洪流,但激流勇进中,也潜藏着巨大机遇.物联网设备与鸿蒙结合成为必然趋势,本文将解读华为云IoT+鸿蒙如何强强联合,为物联网行业提供新的思路和方法. ...

  3. Flutter App混淆加固、保护与优化原理

    ​ 引言 在移动应用程序开发中,保护应用程序的代码和数据安全至关重要.本文将探讨如何对Flutter应用程序进行混淆.优化和保护,以提高应用程序的安全性和隐私. 一.混淆原理 混淆是一种代码保护技术, ...

  4. 新能源物流车行业如何服务升级?地上铁联合火山引擎VeDI“破题”

    今年以来,克服种种不利因素影响,我国工业经济实现企稳回升,一些行业逆势而上,表现亮眼.尤其是新能源车行业,得益于技术创新与系列重大政策利好推动,在国内和国外市场均实现了快速增长,中国汽车工业协会最新统 ...

  5. Codeforces Round 908 (Div. 2)

    总结 T1 题目大意: A,B两人玩游戏,游戏规则如下: 整场游戏有多轮,每轮游戏先胜 \(X\) 局的人获胜,每场游戏先胜 \(Y\) 局的人获胜. 你在场边观看了比赛,但是你忘记了 \(x\) 和 ...

  6. 动作捕捉系统验证OPT追踪井下无人机的性能

    井下无人机长时间在恶劣环境下执行勘测.救援任务,通讯系统可能会陷入两难的境地--传输高精度坐标伴随着大量耗能.为解决这项难题,中国矿业大学计算机科学和技术学院陈朋朋教授团队提出了一种基于超宽带(UWB ...

  7. xv6book阅读 chapter2

    一个操作系统至少应该满足三个需求:多路复用.隔离.交互.本章主要介绍如何组织操作系统来实现以上的三个需求,本文关注的是一种围绕单核进行设计的方法,这种设计是被许多uinx操作系统所使用的.Xv6运行在 ...

  8. Asp .Net Core 系列:集成 Ocelot+Consul实现网关、服务注册、服务发现

    什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由.认证.限流.监控等. Ocelot是一个简单.灵活且功能强大的API网关,它 ...

  9. C# 实用第三方库

    C# 实用第三方库 Autofac 依赖注入IOC框架 NuGet安装:Autofac.Autofac.Extras.DynamicProxy AutoMapper 对象映射 Mapster 对象映射 ...

  10. 使用nginx代理emqx的TCP、WS、WSS连接请求

    项目代理关系: 注:主机上已存在名为:nginx-proxy 的一级 nginx 的代理,将监听了主机的 80.443端口 docker-compose.yml version: "3.7& ...