【TiDB 4.0 PCTA 学习笔记】- tidb server优化&tikv server优化 @3班+高龙

Day17

Tidb Server 优化

操作系统参数

  1. CPU
    Frequency Scaling,避免动态调整,让CPU处在一个较高性能的环境,命令:cpupower frequency-set –governor performance
    Numa Banding,避免numa架构下出现跨numa节点访问内存,需要将进程和CPU进行绑定,用numactl进行绑定
  2. Memory
    Transparent Huge Page(THP),建议关闭此选择,避免出现内存访问延迟或者碎片规整带来的CPU占用率徒增的情况
    Virtual Memory Parameters
    dirty_ratio: 默认值是20%,在高性能SSD硬盘如NVMe设备,可以适当调低此值来改善内存回收的效率
    dirty_background_ratio: 默认值是10%,在高性能SSD硬盘如NVMe设备,可以适当调低此值来改善内存回收的效率
  3. Disk
    I/O Scheduler,对于SSD硬盘,建议设置为noop,操作命令echo noop > /sys/block/$SSD_DEV_NAME/queen/scheduler
    Mount parameter, noatime选项可以防止读取文件的时候更新元数据,nodirtime选项可以防止读取目录的时候更新元数据

Tidb系统变量

  1. Concurrency
    tidb_distsql_scan_concurrency: 影响很多SQL语句,在系统比较空闲时,调整此参数可以增加TiKV访问region的并发数,提升访问速度,默认值是15,如果是OLTP系统可以调小一些,如果是OLAP系统可以调大一些,也可以通过观察执行计划table scan/index scan耗时较高的时候进行调整
    tidb_index_lookup_concurrency:影响很多SQL语句,在系统比较空闲时,调整此参数可以增加TiKV访问region的并发数,提升访问速度,默认值是4,如果是OLTP系统可以调小一些,如果是OLAP系统可以调大一些,也可以通过观察执行计划indexLookUp耗时较高的时候进行调整
    tidb_build_stats_concurrency: 是用来控制Analyze语句的并发度的 tidb_hash_join_concurrency: 是用来控制hash join算子的并发度tidb_index_lookup_join_concurrency: 是用来控制index lookup join算子的并发度
    tidb_ddl_reorg_worker_cnt: 是用来控制在线添加index时worker的数量,来提升添加index的速度
  2. Batch Size
    tidb_init_chunk_size: 初始的chunk_size,默认值是32,就是一个批次查询最小单位返回32行,如果返回的行低于这个值,会浪费很多内存资源
    tidb_max_chunk_size: 最大的chunk_size,默认值是1024,如果第一次查询后发现后面还有数据行,则会通过此参数来返回剩下的行数
    tidb_index_join_batch_size: 控制index join的批次size,如果size大,消耗的资源也会多
  3. Limit
    tidb_store_limit: 控制发送给一个TiKV节点上请求的数量,该参数设置太小,可能资源浪费,设置过高,负载过高
    tidb_retry_limit: 乐观事务控制的最大重试数量,重试太多会导致性能下降,重试太少乐观事务成功率下降

目前事务模式默认为悲观。

  1. Backoff
    tidb_backoff_weight: 这个参数会影响不同类型的backoff
    tidb_backoff_lock_fast: 一次读请求等待锁的backoff时间,如果设置时间过长,会导致此次读请求耗时过高

Tidb配置文件参数

  1. Performance
    max-proc: TiDB可以使用的最大CPU核数
    token-limit: 控制同时可以执行请求的数量
    force-priority: 设置所有语句的优先级,针对特殊用途的tidb实例可以配置低优先级的语句执行
    commiter- concurrency: 控制一个事务二阶段提交的时候最大并发数量,主要是针对100MB以上的大事务
  2. TiKV Client
    grpc-connection-count: 控制每个TiKV和TiDB的最大连接数
  3. Prepared Plan Cache
    Enabled:启用的话,可以重复利用执行计划,避免每次生成执行计划增加开销,可以用prepare语句检查是否开启
    Capacity:缓存语句的数量

TiKV Server 优化

1TiKV的架构

2TiKV的请求流程

写请求流程

涉及的线程池参数配置

[storage]

Scheduler-worker-pool-size=4

[raftstore]

Store-pool-size=2

Apply-pool-size=2

分析写请求的瓶颈,通过以下指标
Scheduler worker CPU,如果持续使用超过80%的时候,建议扩容(4就是400)
如果上面指标没有问题,那就判断是否慢在了raftstore,可以查看写延迟指标Storage async write duration
如果上面指标依然没有问题,接下来分析瓶颈是否出现在consensus层,可以通过raft store cpu和async apply CPU两个指标来看,如果比较高,可以通过调整store-pool-size和apply-pool-size两个指标进行调整
如果上面指标也没有问题,那就查看储存层,看看IO是否达到瓶颈,可以通过Write duration和Write stall duration两个指标来看,以及查看Disk Load和Disk IO untilration两个指标
检查负载是否比较高,CPU Usage, Load Average
IO是瓶颈 cpu还有剩余,可以考虑cpu资源换取IO资源

主要方式为调整压缩级别,提高压缩级别可以减少IO的消耗 增加cpu小号

如果rocksdb出现了问题,并且IO和CPU都不是瓶颈

太多的level0文件—level0层文件不排序

太多的memtables—他会刷倒level0层 过多说明数据大多在内存

太多的等待字节

[rocksdb]

Max-background-jobs= 8 #How many threads for background jobs

Max-sub-compactions=3 #Threads for compaction of level0

[rocksdb.defaultcf]/[rocksdb.writecf]

Compression-per-level=[“no”,”no”,”lz4”,”lz4”,”lz4”,”zstd”,”zstd”]

Level0-file-num-compaction-trigger=4

Level0-shutdown-writes-trigger=20

Level0-stop-writes-trigger=36

如果上述都没有瓶颈,那就需要观察一下网络是否存在瓶颈,查看commit log duration和99% commit log duration per server,raftstore.raft-max-inflight-msgs和raftstore.raft-max-size-per-msg两个参数进行调节

读请求流程

分析读请求的瓶颈,Thread CPU的Unified read pool CPU,可以适当提高readpool.unified.max-thread-count参数值
等待时间很高造成瓶颈,可以看是否有大范围scan,负载是否均衡,线程池是否太小,错误的执行计划

看block cache hit,如果命中率太低,可以调大storage.block-cache.capacity的大小

1 个赞