资源管控问题

问题背景/描述:有一个分析类的 SQL 占用内存资源较多,所以我们想用资源管控的方式进行内存级别的限制(至少可以避免 oom),但是发现无法限制住,从监控上看 SQL 使用了 1w 个 RU,RU max (8w), explain analyze 上看使用了 50w 个 RU

操作步骤:

  1. explain analyze 看到执行计划的 RU 为 50w 左右
  2. 设置 ap_l 组 RU 25w,并绑定用户
  3. 重新登录用户执行,explain analyze 发现 RU 并没有下降至 25w
  4. 又调整了 ap_l 到 2w5,发现没有限制住,RU max 最好还是打到了 8w

补充信息:t1 表是个分区表
SQL如下:
SELECT
xxx,xxx
FROM
t1
WHERE
xx = 123
AND xx >= “2024-07-22”
AND xx <= “2024-09-22”
GROUP BY
id
ORDER BY
xxx DESC
LIMIT
20000

我比较疑惑的点:

  1. 如果我要对单条 SQL 进行评估,并且有干净的环境,那么我用哪个指标衡量 RU
  2. 为啥我更改了资源组的 RU 配合 RU max 并没有限制住呢?

SQL 第一次跑是无法限制的,因为需要跑完才知道预估 ru。
咱们怎么限制的?限制方法和 sql 发下看看呐。

CREATE RESOURCE GROUP IF NOT EXISTS ap_l RU_PER_SEC = 25000 PRIORITY = LOW;

create user u1@‘xxx.%’ identified by ‘xxxx’;

ALTER USER u1@‘xxx.%’ RESOURCE GROUP ap_l;

跑 SQL 是切换到 u1 用户下,SQL 如下:
SELECT
xxx,xxx
FROM
t1
WHERE
xx = 123
AND xx >= “2024-07-22”
AND xx <= “2024-09-22”
GROUP BY
id
ORDER BY
xxx DESC
LIMIT
20000

ru 类似于信用卡每秒有 2w5 的额度,如果第 1s 就用掉了 25w,接下去 9s 都处于欠费状态

上面已经有一些回答:

  • 建议你测试时开个脚本一值跑这个语句,然后看 RU 消耗的监控是否符合预期,是否控制在 RU_PER_SEC 以下。RU(max) 是一段时间(20s)内最高瞬间的消耗,只用来判断一些报错情况下做参考用,看 RU 得监控就行

另外你的 tidb 版本时多少?

1 个赞

他版本是 753
image