暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiDB系统调参实操

原创 谭磊Terry 恩墨学院 2022-08-04
2260

硬件环境调整

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

  • 参数文件修改
## 编辑配置文件
tiup cluster edit-config tidb-test

## 在tidb模块添加配置
server_configs:
   tidb:
      mem-quota-query: 10737418240
 
## 滚动重启tidb
tiup cluster reload tidb-test -R tidb

## 查看变量值
show session variables like 'tidb_mem_quota_query';

## 检查配置是否生效,连接tidb集群并执行命令检查确认是否生效:
show config where type= 'tidb' and name like '%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。

  • 参数文件修改
## 编辑配置文件
tiup cluster edit-config tidb-test

## 在tidb模块添加配置
server_configs:
   tidb:
      performance.txn-total-size-limit: 10737418240
 
## 滚动重启tidb
tiup cluster reload tidb-test -R tidb

## 检查配置是否生效,连接tidb集群并执行命令检查确认是否生效:
show config where type= 'tidb' and name = 'performance.txn-total-size-limit';

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 在表和索引上留下的统计信息。执行大批量更新或导入记录后,或查询执行计划不是最佳时就需要执行统计更新操作。

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

  • tidb_build_stats_concurrency

    • 作用域:SESSION | GLOBAL
    • 是否持久化到集群:是
    • 默认值:4
    • 这个变量用来设置 ANALYZE 语句执行时并发度。
    • 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响
  • tidb_distsql_scan_concurrency

    • 作用域:SESSION | GLOBAL
    • 是否持久化到集群:是
    • 默认值:15
    • 范围:[1, 256]
    • 这个变量用来设置 scan 操作的并发度。
    • AP 类应用适合较大的值,TP 类应用适合较小的值。对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
    • 若表的分区较多可以适当调小该参数(取决于扫描数据量的大小以及扫描频率),避免 TiKV 内存溢出 (OOM)。
  • tidb_index_serial_scan_concurrency

    • 作用域:SESSION | GLOBAL
    • 是否持久化到集群:是
    • 默认值:1
    • 范围:[1, 256]
    • 这个变量用来设置顺序 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值
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 的命令方式会持久化到集群,集群reload或者restart仍会有效。

  • tidb_ddl_reorg_worker_cnt

    • 作用域:GLOBAL
    • 是否持久化到集群:是
    • 默认值:4
    • 范围:[1, 256]
    • 这个变量用来设置 DDL 操作 re-organize 阶段的并发度
  • tidb_ddl_reorg_batch_size

    • 作用域:GLOBAL
    • 是否持久化到集群:是
    • 默认值:256
    • 范围:[32, 10240]
    • 这个变量用来设置 DDL 操作 re-organize 阶段的 batch size。比如 ADD INDEX 操作,需要回填索引数据,通过并发 tidb_ddl_reorg_worker_cnt 个 worker 一起回填数据,每个 worker 以 batch 为单位进行回填。
      • 如果 ADD INDEX 操作时有较多 UPDATE 操作或者 REPLACE 等更新操作,batch size 越大,事务冲突的概率也会越大,此时建议调小 batch size 的值,最小值是 32。
      • 在没有事务冲突的情况下,batch size 可设为较大值(需要参考 worker 数量,见线上负载与 ADD INDEX 相互影响测试),最大值是 10240,这样回填数据的速度更快,但是 TiKV 的写入压力也会变大。
  • 为了减少对在线业务的影响,添加索引的默认速度会比较保守。当添加索引的目标列仅涉及查询负载,或者与线上负载不直接相关时,可以适当调大上述变量来加速添加索引:

SET @@global.tidb_ddl_reorg_worker_cnt = 16;
SET @@global.tidb_ddl_reorg_batch_size = 4096;
  • 当添加索引操作的目标列被频繁更新(包含 UPDATE、INSERT 和 DELETE)时,调大上述配置会造成较为频繁的写冲突,使得在线负载较大;同时添加索引操作也可能由于不断地重试,需要很长的时间才能完成。此时建议调小上述配置来避免和在线业务的写冲突:
SET @@global.tidb_ddl_reorg_worker_cnt = 4;
SET @@global.tidb_ddl_reorg_batch_size = 128;

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

总结

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论