资源管控中ru(ru_per_sec)和token的问题

【 TiDB 版本】8.2.0
【测试过程】 先设置ru_per_sec为1000000 然后设置ru_per_sec=1000 ,2次分别128线程 oltp_read_only 测试。主要疑问是设置资源组时ru_per_sec选项所代表的意义似乎有点多没有统一的说明,另外就是token和ru_per_sec的关系。

 CREATE RESOURCE GROUP `rg1` RU_PER_SEC=1000, PRIORITY=MEDIUM, QUERY_LIMIT=(EXEC_ELAPSED="5s" ACTION=KILL WATCH=SIMILAR DURATION="10m0s")

1、 首先看resource control监控中availiable ru ,可以确定RU_PER_SEC 设置了资源最的可用RU数量。

2、再ru_per_sec=1000时,监控显示的每秒消耗RU 在1k,但RU(max) 监控达到了3.76K,资源组未设置burstable,资源组能使用的RU也能突破RU_PER_SEC 限制? 如果突破限制为什么没像限制100万那样达到6w以上的每秒RU? RU(max) 如果是偶尔达到很高应该是那种比较明显的尖刺图形吧

3、 在官方文档 resource control 监控指标中可用RU解释是 “ RU 令牌桶内可用的 token” 这里似乎RU等同token了,是描述有误还是token和ru有某种关系可以互换使用?

4、按照第3条如果 可用ru=token数量那在RU_PER_SEC=100W时,可用RU数量在896k左右为什么还要想GAC申请token?

image

5、继续第4条 在RU_PER_SEC=100W和1000时向GAC每秒申请的的token数量差不多,为什么相差数据量级很大RU回填数量并没有导致LAC申请token数量增加?

6、RU是资源单位的抽象,这里的回填指的是什么?是否是指的token refill? 在doc design文档中 似乎没有提到RU refill这个词?

7、继续第6个问题,这里的回填数量指的是GAC的回填吧, LAC没有了只是去向GAC申请? burstable 是增加了向GAC申请token的数量?

8、官方文档里和design文档描述似乎有些出入 ,这里的定期重新配置本地令牌时调整本地可用令牌数量吧,这个数量是依据什么而定的?

9、 这里的sql request的cpu使用是指什么? sql request最后不都是转换为Kv request吗,这里指的是转换的消耗?

感觉token相当于通证 可以过路 如果通证没了就被限流了 等资源丰富的时候或者按时间再发你一点积分 让你可以超额度使用

资源组里设置的RU,目前不区分select,insert,update,delete操作,要是来查询消耗的RU比较多,会影响insert,update,delete的操作。

design doc: tidb/docs/design/2022-11-25-global-resource-control.md at master · pingcap/tidb · GitHub

虽然不是很清楚具体实现细节,但有一点可能可以解释上面的一些问题比如尖刺:
TiDB / TiKV 是分布式架构,和 OB 的实现上不太一样,TiDB 使用一个统一的 RU 来定义资源使用上限,这样涉及到一个问题,假如集群有 2 个 TiDB 节点,RU 配置 1000,那分配到每个 TiDB 节点上的 RU 应该是多少才合适? 这里 design 文档中有具体的描述(虽然看不太懂),既有 global 的 resource control,同时每个 TiDB local 会去申请 token 令牌,有回填速率,整个状态都是动态变化的。

这个倒是实际验证过,TiDB 当前的做法是不区分到底在哪个 tidb-server 上执行,甚至不区分是哪个user、session、statement使用的 Quota,现在管理粒度只有资源组这一个维度,在同一个资源组的所有 statement 共用一个 Quota。也就是没有所谓的 local token,只有 global 级别的 token 回填