课程名称:3.7.6 TiDB optimization(TiDB Server 优化)
学习时长:40min
课程收获:
TiDB 性能优化相关的配置和系统变量参数。
课程内容:
1.操作系统参数
- CPU
处理器——动态节能技术
cpufreq 是一个动态调整 CPU 频率的模块,可支持五种模式。为保证服务性能应选用 performance 模式,将 CPU 频率固定工作在其支持的最高运行频率上,不进行动态调节,操作命令为 cpupower frequency-set --governor performance
。
NUMA 绑核
为尽可能的避免跨 NUMA 访问内存,可以通过设置线程的 CPU 亲和性来实现 NUMA 绑核。对于普通程序,可使用 numactl
命令来绑定,具体用法请查询 man
手册。
- 内存
内存——透明大页
对于数据库应用,不推荐使用 THP,因为数据库往往具有稀疏而不是连续的内存访问模式,且当高阶内存碎片化比较严重时,分配 THP 页面会出现较大的延迟。若开启针对 THP 的直接内存规整功能,也会出现系统 CPU 使用率激增的现象,因此建议关闭 THP。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
内存——虚拟内存参数
dirty_ratio
百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统将开始使用 pdflush 操作将脏的 page cache 写入磁盘。默认值为 20%,通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,降低其值有利于提高内存回收时的效率。dirty_background_ratio
百分比值。当脏的 page cache 总量达到系统内存总量的这一百分比后,系统开始在后台将脏的 page cache 写入磁盘。默认值为 10%,通常不需调整。对于高性能 SSD,比如 NVMe 设备来说,设置较低的值有利于提高内存回收时的效率。
- 磁盘
I/O 调度器
I/O 调度程序确定 I/O 操作何时在存储设备上运行以及持续多长时间。也称为 I/O 升降机。对于 SSD 设备,宜设置为 noop。
echo noop > /sys/block/${SSD_DEV_NAME}/queue/scheduler
挂载参数
noatime
读取文件时,将禁用对元数据的更新。它还启用了 nodiratime 行为,该行为会在读取目录时禁用对元数据的更新。
2.TiDB 系统参数
Concurrency并发数量
tidb_distsql_scan_concurrency
- 作用域:SESSION | GLOBAL
- 默认值:15
- 这个变量用来设置 scan 操作的并发度。
- AP 类应用适合较大的值,TP 类应用适合较小的值。对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
- 若表的分区较多可以适当调小该参数,避免 TiKV 内存溢出 (OOM)。
tidb_index_lookup_concurrency
- 作用域:SESSION | GLOBAL
- 默认值:4
- 这个变量用来设置 index lookup 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值。
tidb_build_stats_concurrency
- 作用域:SESSION
- 默认值:4
- 这个变量用来设置
ANALYZE
语句执行时并发度。 - 当这个变量被设置得更大时,会对其它的查询语句执行性能产生一定影响。
tidb_hash_join_concurrency
- 作用域:SESSION | GLOBAL
- 默认值:5
- 这个变量用来设置 hash join 算法的并发度。
tidb_index_lookup_join_concurrency
- 作用域:SESSION | GLOBAL
- 默认值:4
- 这个变量用来设置 index lookup join 算法的并发度。
tidb_ddl_reorg_worker_cnt
- 作用域:GLOBAL
- 默认值:4
- 这个变量用来设置 DDL 操作
re-organize
阶段的并发度。
Batch Size 批量size
tidb_init_chunk_size
- 作用域:SESSION | GLOBAL
- 默认值:32
- 这个变量用来设置执行过程中初始 chunk 的行数。默认值是 32,可设置的范围是 1~32。
tidb_max_chunk_size
- 作用域:SESSION | GLOBAL
- 默认值:1024
- 最小值:32
- 这个变量用来设置执行过程中一个 chunk 最大的行数,设置过大可能引起缓存局部性的问题。
tidb_index_join_batch_size
- 作用域:SESSION | GLOBAL
- 默认值:25000
- 这个变量用来设置 index lookup join 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值。
Limit 限制
tidb_store_limit
从 v3.0.4 和 v4.0 版本开始引入
- 作用域:INSTANCE | GLOBAL
- 默认值:0
- 这个变量用于限制 TiDB 同时向 TiKV 发送的请求的最大数量,0 表示没有限制。
tidb_retry_limit
针对乐观事务,建议使用悲观事务
- 作用域:SESSION | GLOBAL
- 默认值:10
- 这个变量用来设置最大重试次数。一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,会根据该变量的设置进行重试。注意当
tidb_retry_limit = 0
时,也会禁用自动重试。
Backoff 遇到错误时重试的等待时间
tidb_backoff_lock_fast
- 作用域:SESSION | GLOBAL
- 默认值:100
- 这个变量用来设置读请求遇到锁的 backoff 时间。
tidb_backoff_weight
- 作用域:SESSION | GLOBAL
- 默认值:2
- 这个变量用来给 TiDB 的
backoff
最大时间增加权重,即内部遇到网络或其他组件(TiKV、PD)故障时,发送重试请求的最大重试时间。可以通过这个变量来调整最大重试时间,最小值为 1。例如,TiDB 向 PD 取 TSO 的基础超时时间是 15 秒,当tidb_backoff_weight = 2
时,取 TSO 的最大超时时间为:基础时间 * 2 等于 30 秒。在网络环境较差的情况下,适当增大该变量值可以有效缓解因为超时而向应用端报错的情况;而如果应用端希望更快地接到报错信息,则应该尽量减小该变量的值。
3. TiDB 配置
performance 性能相关配置。
max-procs
- TiDB 的 CPU 使用数量。
- 默认值:0
- 默认值为 0 表示使用机器上所有的 CPU;如果设置成 n,那么 TiDB 会使用 n 个 CPU 数量。
token-limit
- 可以同时执行请求的 session 个数
- 默认值:1000
force-priority
- 把所有的语句优先级设置为 force-priority 的值。
- 默认值:NO_PRIORITY
- 可选值:NO_PRIORITY, LOW_PRIORITY, HIGH_PRIORITY, DELAYED。
committer-concurrency
keep using origin goroutine when doing retry in commit phase
committer-concurrency
配置项,用于控制 retry commit 阶段的 goroutine 数量。
主要影响是大事务,TiKV节点。
grpc-connection-count
- 跟每个 TiKV 之间建立的最大连接数。
- 默认值:16
prepared-plan-cache
prepare 语句的 Plan cache 设置。
警告:
当前该功能为实验特性,不建议在生产环境中使用。
enabled
- 开启 prepare 语句的 plan cache。
- 默认值:false
capacity
- 缓存语句的数量。
- 默认值:100
- 类型为 uint,小于 0 的值会被转化为大整数。