# [FAQ] BR 参数 concurrency 和 num-threads 的区别是什么？

## Key Words

BR, concurrency, num-threads

## Description

在官方文档中出现 **“如果 TiKV 的资源使用没有出现明显的瓶颈，可以尝试调大 --concurrency（默认是 4）参数以进行性能调优”** 字样，但并未解释其内部原理及对应 num-threads 的区别。

## Content

1. 关于 BR 备份原理，可简单将 BR 看作由 `前端`, `后端` 两部分组成，前端是 BR Binary，后端封装在 TiKV 内部。
2. BR 前端负责发送表的 backupRange，BR-Rust 负责接收 Table BackupRange（表数据数据范围） 或 incomplete BackupRange （因错误导致的未完成的表数据范围）进行并发备份，BR 后端主要负责解析拿到的 BackupRange 去扫描表 Region 的 sst_files 并保存到外部存储(如本地、S3等)。
3. 在[代码](https://github.com/pingcap/tidb/blob/17fac8bc2883dd287481a60f019beae948191a47/br/pkg/backup/client.go#L583)中，可以看出 concurrency 是将 BackupRange 发送到 TiKV 的 goroutine 数量，即：发送并发度，1 个 BackupRange 在首次被发送到 TiKV 时是 1 个表的全部范围，占用 1 个 goroutine，被编码为 startKey=table_prefix_min(i64)，endKey=table_prefix_max(i64)，也是 1 个表的负无穷到正无穷范围。
4. concurrency 控制 **同时** 发送多少个 BackupRange Request 给 TiKV。
5. 在[代码](https://github.com/tikv/tikv/blob/d7dc4fff51ca71c76a928a0780a069efaaeaae70/components/backup/src/endpoint.rs#L757-L760)中，可以看出 num-threads 掉用于 spawn_backup_worker 函数中，表示的并发备份的并发数，所以这是TiKV端的并发性。

综上，concurrency 和 num-threads 分别为 BR 前端发送备份任务并发及 BR 后端在 TiKV 中实际备份任务被执行并发。

## Affected Versions

ALL