外观
TiDB 参数调优
TiDB 参数调优是提高 TiDB 集群性能的重要手段。通过调整 TiDB、PD、TiKV 等组件的参数,可以优化集群的性能、稳定性和可靠性。参数调优需要根据集群的规模、业务需求和硬件资源进行调整,没有通用的最优配置。
TiDB 参数调优
1. 服务器配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
server.port | 4000 | 根据实际需求调整 | TiDB 服务器的 SQL 端口 |
server.max-connections | 1000 | 3000-5000 | TiDB 服务器允许的最大连接数 |
server.oom-action | "log" | "cancel" | OOM 时的动作,生产环境建议设置为 "cancel" |
server.tcp-keep-alive | true | true | 是否启用 TCP keep-alive |
2. 性能配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
performance.max-procs | 0 | 根据 CPU 核心数调整 | TiDB 服务器使用的最大 CPU 核心数 |
performance.mem-quota-query | 1073741824 | 4294967296-8589934592 | 单个查询允许使用的最大内存 |
performance.txn-total-size-limit | 104857600 | 1073741824-2147483648 | 单个事务允许使用的最大内存 |
performance.txn-entry-size-limit | 6291456 | 根据业务需求调整 | 单个事务条目的最大大小 |
3. 事务配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
txn.mode | "pessimistic" | 根据业务需求调整 | 事务模式,支持 "pessimistic" 和 "optimistic" |
txn.txn-local-latches | false | true | 是否启用本地锁 |
txn.enable-1pc | false | true | 是否启用 1PC 事务 |
txn.retry-limit | 10 | 5-20 | 事务重试次数 |
4. SQL 优化配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
tidb_enable_clustered_index | true | true | 是否启用聚簇索引 |
tidb_enable_table_partition | true | true | 是否启用表分区功能 |
tidb_opt_agg_push_down | true | true | 是否启用聚合下推 |
tidb_opt_distinct_agg_push_down | false | true | 是否启用去重聚合下推 |
PD 参数调优
1. 调度配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
schedule.max-snapshot-count | 3 | 6-12 | 单个 TiKV 节点允许的最大 snapshot 数量 |
schedule.max-pending-peer-count | 16 | 32-64 | 单个 TiKV 节点允许的最大 pending peer 数量 |
schedule.split-merge-interval | "1h" | "30m"-"2h" | 分裂和合并的最小间隔时间 |
schedule.max-merge-region-size | 20 | 16-32 | 允许合并的最大 Region 大小 |
schedule.max-merge-region-keys | 200000 | 160000-320000 | 允许合并的最大 Region 键数量 |
2. 副本配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
replication.max-replicas | 3 | 3-5 | Region 的最大副本数 |
replication.location-labels | [] | ["zone", "rack", "host"] | 用于 Region 副本放置的标签 |
replication.schedule-limit | 64 | 根据集群规模调整 | 副本调度的限制 |
3. 热点调度配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
schedule.hot-region-schedule-limit | 4 | 8-16 | 热点 Region 调度的限制 |
schedule.hot-region-cache-hits-threshold | 3 | 根据业务需求调整 | 热点 Region 缓存命中阈值 |
TiKV 参数调优
1. 存储配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
storage.block-cache.capacity | "1GB" | 总内存的 30%-40% | Block cache 容量 |
storage.write-buffer-size | "128MB" | 256MB-512MB | 写入缓冲区大小 |
storage.max-write-buffer-number | 5 | 3-8 | 最大写入缓冲区数量 |
storage.scheduler-worker-pool-size | 4 | CPU 核心数的 1/4 | 存储调度器工作线程池大小 |
2. Raft 配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
raftstore.raft-base-tick-interval | "1s" | "1s" | Raft base tick 间隔 |
raftstore.raft-election-timeout-ticks | 10 | 10-20 | Raft 选举超时时间 |
raftstore.raft-heartbeat-ticks | 2 | 2-5 | Raft 心跳间隔 |
raftstore.raftdb.max-background-jobs | 2 | 4-8 | RaftDB 最大后台作业数 |
3. Coprocessor 配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
coprocessor.end-point-concurrency | 8 | 根据 CPU 核心数调整 | Coprocessor 并发数 |
coprocessor.region-max-size | "96MB" | "64MB"-"128MB" | Region 最大大小 |
coprocessor.region-split-size | "64MB" | "48MB"-"96MB" | Region 分裂大小 |
4. RocksDB 配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
rocksdb.max-background-jobs | 4 | 4-8 | RocksDB 最大后台作业数 |
rocksdb.defaultcf.write-buffer-size | "128MB" | 256MB-512MB | Default CF 写入缓冲区大小 |
rocksdb.defaultcf.max-write-buffer-number | 5 | 3-8 | Default CF 最大写入缓冲区数量 |
rocksdb.defaultcf.level0-slowdown-writes-trigger | 12 | 8-16 | Default CF Level 0 慢写触发阈值 |
TiFlash 参数调优
1. 服务器配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
server.http_port | 8123 | 根据实际需求调整 | HTTP 服务端口 |
server.tcp_port | 9000 | 根据实际需求调整 | TCP 服务端口 |
server.flash_service_port | 3930 | 根据实际需求调整 | Flash 服务端口 |
2. 存储配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
storage.data_path | "./data" | 独立的 SSD 分区 | 数据存储目录 |
storage.min_bytes_for_wide_part | 0 | 1048576 | 宽分区的最小字节数 |
3. 查询配置
| 参数名 | 默认值 | 调优建议 | 说明 |
|---|---|---|---|
query.threads | 16 | CPU 核心数的 70%-80% | 查询执行线程数 |
query.max_streams | 128 | 256-512 | 最大流数量 |
query.max_bytes_before_external_group_by | "100Mi" | "200Mi"-"500Mi" | 外部分组前的最大字节数 |
参数调优步骤
1. 分析业务需求
- 了解业务的读写比例
- 分析查询类型和复杂度
- 了解数据量和数据增长趋势
- 确定性能目标
2. 监控当前性能
- 使用 Prometheus + Grafana 监控集群性能
- 关注关键指标,如 QPS、延迟、CPU 使用率、内存使用率等
- 识别性能瓶颈
3. 制定调优计划
- 根据监控数据确定需要调整的参数
- 制定详细的调优计划,包括调整的参数、目标值、调整顺序等
- 准备回滚计划
4. 逐步调整参数
- 逐个调整参数,避免同时调整多个参数
- 每次调整后观察一段时间,评估调优效果
- 根据调优效果决定是否继续调整或回滚
5. 验证调优效果
- 对比调优前后的性能指标
- 测试业务功能是否正常
- 验证性能目标是否达成
6. 记录调优结果
- 记录调整的参数、目标值、调整时间和调优效果
- 建立参数调优的知识库
- 定期审查和更新调优策略
参数调优最佳实践
1. 从保守到激进
- 初始调整时,参数值应接近默认值
- 根据调优效果逐步调整,逐渐接近最优值
- 避免一次性调整过大,导致集群不稳定
2. 关注整体性能
- 不要只关注单个指标的优化
- 要考虑对整体性能的影响
- 权衡不同参数之间的关系
3. 考虑硬件资源
- 参数调整应根据硬件资源进行调整
- 例如,内存较大的服务器可以分配更多的内存给缓存
- CPU 核心数较多的服务器可以增加线程数
4. 定期回顾和调整
- 定期回顾参数配置,根据业务变化和集群规模调整
- 随着数据量的增长,需要调整相关参数
- 升级 TiDB 版本后,需要重新评估参数配置
5. 结合查询优化
- 参数调优应与查询优化结合使用
- 优化查询语句,减少资源消耗
- 合理设计索引,提高查询性能
常见参数调优场景
场景1:写入密集型业务
调优建议:
- 增加 TiKV 的写入缓冲区大小
- 增加 TiKV 的最大写入缓冲区数量
- 调整 RocksDB 的写入参数
- 启用 TiDB 的 1PC 事务
场景2:查询密集型业务
调优建议:
- 增加 TiDB 的内存配额
- 增加 TiKV 的 Block cache 容量
- 优化查询语句,添加合适的索引
- 考虑使用 TiFlash 加速分析查询
场景3:大事务业务
调优建议:
- 增加 TiDB 的事务大小限制
- 调整 TiDB 的事务重试次数
- 考虑将大事务拆分为多个小事务
- 启用 TiDB 的本地锁
场景4:高并发业务
调优建议:
- 增加 TiDB 的最大连接数
- 调整 TiDB 的线程池大小
- 优化查询语句,减少锁竞争
- 考虑使用连接池
常见问题(FAQ)
Q1: 如何确定参数的最优值?
A1: 参数的最优值取决于集群的规模、业务需求和硬件资源等因素。可以通过以下方式确定:
- 参考官方文档的调优建议
- 在测试环境中进行性能测试,找到合适的参数值
- 逐步调整参数,观察性能变化
- 监控集群性能,根据实际情况调整
Q2: 参数调优会影响集群的稳定性吗?
A2: 不合理的参数调整可能会影响集群的稳定性。因此,参数调优应遵循以下原则:
- 从保守到激进,逐步调整
- 每次只调整少数参数
- 调整后观察一段时间,评估效果
- 准备回滚计划,出现问题时及时回滚
Q3: 升级 TiDB 版本后,需要重新调整参数吗?
A3: 升级 TiDB 版本后,建议重新评估参数配置。新版本可能会引入新的参数,或者对现有参数的默认值进行调整。因此,升级后需要根据新版本的特性和建议重新调整参数。
Q4: 如何监控参数调整的效果?
A4: 可以通过以下方式监控参数调整的效果:
- 使用 Prometheus + Grafana 监控集群性能指标
- 关注 QPS、延迟、CPU 使用率、内存使用率等关键指标
- 对比调整前后的性能数据
- 测试业务功能是否正常
Q5: 所有参数都需要调整吗?
A5: 不需要。大多数默认参数已经针对常见场景进行了优化,只有在特定场景下才需要调整。应根据实际需求和性能瓶颈,针对性地调整相关参数。
Q6: 参数调优的顺序是什么?
A6: 参数调优的顺序建议如下:
- 首先调整硬件资源相关的参数
- 然后调整核心功能参数
- 最后调整高级功能参数
- 从影响范围小的参数开始调整,逐步调整影响范围大的参数
