当前位置: 首页 > news >正文

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布,相信很多同学都已经抢先使用了起来,甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性,新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线 DBA 岗位的我来说,学术方面的精进已经力不从心,大部分的时间都在强化“术”的方面,所以 TiDB 每更(新)必追,每个新 GA 的特性都要熟悉,这样当生产环境 TiDB 升级到目标版本后,才不至于手忙脚乱,新建 TiDB 集群后才能对新特性驾轻就熟。相信本文会给读者朋友们带来一些实质性的收获。言归正传,本文将围绕“资源管控”主题,详细说说关于 “资源管控” 您应该知道的 6 件事。

从用户场景出发,看特性如何使用

从 200+ 的国产数据库中脱颖而出,其有效、完备的文档当属“功不可没”。在 TiDB 7.1 的文档中是这样描述 使用场景 的:

资源管控特性的引入对 TiDB 具有里程碑的意义。它能够将一个分布式数据库集群划分成多个逻辑单元,即使个别单元对资源过度使用,也不会挤占其他单元所需的资源。利用该特性:

○ 你可以将多个来自不同系统的中小型应用合入一个 TiDB 集群中,个别应用的负载升高,不会影响其他业务的正常运行。而在系统负载较低的时候,繁忙的应用即使超过设定的读写配额,也仍然可以被分配到所需的系统资源,达到资源的最大化利用。

○ 你可以选择将所有测试环境合入一个集群,或者将消耗较大的批量任务编入一个单独的资源组,在保证重要应用获得必要资源的同时,提升硬件利用率,降低运行成本。

○ 当系统中存在多种业务负载时,可以将不同的负载分别放入各自的资源组。利用资源管控技术,确保交易类业务的响应时间不受数据分析或批量业务的影响。

○ 当集群遇到突发的 SQL 性能问题,可以结合 SQL Binding 和资源组,临时限制某个 SQL 的资源消耗。

那么,从务实的 DBA 角度来看这段话,可能会是下面这个样子:

资源管控,这一新特性,将数据库中的用户、会话、SQL 等日常行为的性能指标做了更加细致的量化处理。引入了 “Request Unit (RU)” 这一量化概念,目前包括了 CPU, IOPS, IO 带宽 三个重要指标,未来还会增加内存、网络等指标。

○ 可以将若干 MySQL 数据库合并进一个 TiDB 集群,比如读写峰值常出现于日间的 OA 系统,读写峰值常出现于夜间的 Batch 系统,以及 24 小时运行但负载持续稳定的数据采集系统,这种“三合一”的方式,使得各系统“错峰出行”,借助资源管控的能力“按需分配”,以此达到降低综合成本的目标。

○ 在一个 TiDB 集群,为不同测试环境 (Env) 创建不同测试用户 (User),然后依据测试所需资源规格创建不同资源组 (Resource Group),并将用户与对应的资源组做绑定。如此做到了不同用户的资源隔离,由于是测试环境,可将资源组设置为 超限 ( BURSTABLE ) ,或者理解为“超卖”,某个或某几个用户使用的资源超过了资源组规定的限制,依旧可以正常使用,而不影响测试,可以最大化利用硬件资源。不过,这里的测试应该理解为业务测试,而非标准的性能测试,不然需要更加严谨的考虑资源分配以及 超限 ( BURSTABLE ) 的使用。

○ 类似于第一节中的描述,三个系统分别对应三个资源组,且 BURSTABLE 的设定为 NO,那么三个系统使用的资源将是隔离的,不受彼此影响。也就是说,在当前 TiDB 集群中,即使 TP、AP 业务同时运行,由于使用了资源控制特性,此时 TP 业务并不会受到 AP 业务的干扰。

○ 业务是不断变化的,“Bad SQL” 问题随时可能发生,如果某条 SQL 占用资源 (RU) 过高,影响该用户的其他 SQL 性能。此时,可以新建一个资源组,并可以使用 执行计划绑定(SQL Binding)功能 ,将该 SQL 语句绑定到新建的资源组上,以起到限制 SQL 资源消耗,甚至拒绝 SQL 执行的目的。测试 SQL 如下:

CREATE RESOURCE GROUP rg1 RU_per_SEC=1;
​
CREATE GLOBAL BINDING FORSELECT COUNT(*) FROM t1 t JOIN t1 t2 USING (uid) 
USINGSELECT /*+ resource_group(rg1) */ COUNT(*) FROM t1 t JOIN t1 t2 USING (uid);
​
EXPLAIN ANALYZE FORMAT = 'verbose' SELECT COUNT(*) FROM t t1 JOIN t1 t2 USING (uid);

为了实现上述场景,TiDB 实现了若干 SQL 语法,接下来看看如何具体操作。

“资源控制”相关SQL,用这些就够了

研究 TiDB 的人还有不知道 AskTUG [1] 的么?半年前,@社区小助手 整理了一篇极具实用价值的帖子 -- 【社区智慧合集】TiDB 相关 SQL 脚本大全 [2] , 内含 38 条实用 SQL,是 TiDBer 们必收藏的帖子之一。

彼时“资源控制”功能尚未“问世”,所以帖子里并不包含该特性相关 SQL,下面我将“资源控制”相关的精华 SQL 贴出,以供参考。

1) 增删改查 -- 资源组 (Resource Group)

  • 增:
-- 创建 `rg1` 资源组,限额是每秒 `500 RU`,优先级为 `HIGH`,允许这个资源组的超额 (`BURSTABLE`) 占用资源。
CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 100PRIORITY = HIGHBURSTABLE;
​
-- 创建 `rg2` 资源组,限额是每秒 `500 RU`,其他选项为默认值。
CREATE RESOURCE GROUP rg2 RU_PER_SEC = 200;
  • 删:
-- 删除资源组
DROP RESOURCE GROUP rg2;
  • 改:
-- 修改资源组资源配置
ALTER RESOURCE GROUP rg2 ru_per_sec = 2000;
  • 查:
-- 通过 I_S 表查看
SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

需要注意的是,创建、修改、删除资源组,需要拥有 SUPER 或者 RESOURCE_GROUP_ADMIN 权限,否则会遇到报错:

ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or RESOURCE_GROUP_ADMIN privilege(s) for this operation

2) 绑定用户到 Resource Group

  • 将某个用户绑定到资源组

将用户和资源组绑定很简单,其实就是修改用户的属性。如果是已创建的用户,可以用 ALTER USER ,如果是新建用户,则可用 CREATE USER 。

-- CREATE
CREATE USER u3 RESOURCE GROUP rg3;
-- ALTER
ALTER USER u2 RESOURCE GROUP rg2;
  • 查看某个用户绑定到资源组

这里有两种方法和二个问题,两种方法是分别通过 mysql 库和 INFORMATION_SCHEMA 库进行查询。

mysql> SELECT User, JSON_EXTRACT(User_attributes, "$.resource_group") AS RG FROM mysql.user ;
+------+-----------+
| User | RG        |
+------+-----------+
| root | NULL      |
| u1   | "default" |
| u2   | "rg2"     |
| u3   | ""        |
+------+-----------+
4 rows in set (0.00 sec)

问题一:Resource Group 的 ** 和 default 等同**

从上面的查询结果来看,除了普通用户 u2 绑定的资源组 rg2 之外,其余三个用户其实都使用的是默认资源组,即 default 。只是这里出现了空 (``),可能会造成稍许疑虑,经与官方同学确认, “空和 default 在行为上面是一样的” 。交流帖子参见: resource control,default resource group 文档勘误 [3]

问题二:通过 INFORMATION_SCHEMA.USER_ATTRIBUTES 暂无法查询用户绑定的资源组

普通用户是无权通过 mysql 库查询哪些用户绑定了哪些资源组的,包括当前用户,但是每个用户都可以通过 I_S 库查询自己应该可以获取的信息。所以方法二,是指普通用户通过查询 I_S 库来获取相关信息,SQL 如下:

SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES;

只是目前效果不如意,期待下个版本会得到改进。相关帖子参见: resource control 相关,INFORMATION_SCHEMA.USER_ATTRIBUTES 表取值问题 [4]

3) 绑定会话到 Resource Group

前面提到了绑定用户到 RG,其实 TiDB 提供了更加灵活的方式,可以绑定会话 (Session) 到 RG,以及绑定 SQL 语句到 RG。

  • 将当前会话绑定到资源组
SET RESOURCE GROUP rg1;
  • 查看当前会话所使用的资源组
SELECT CURRENT_RESOURCE_GROUP();
  • 重置当前会话绑定资源组
SET RESOURCE GROUP `default`;
SET RESOURCE GROUP ``;

注:两条 SQL 的功能等价,但建议使用第一条,原因参见【问题一】。

4) 绑定语句到 Resource Group

可以使用 Hint 来控制具体某条 SQL 语句占用的 RU 资源,举例如下:

SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t1 limit 10;

如何查看某条语句消耗的 RU 呢?可以通过实际执行计划来获取,举例如下:

EXPLAIN ANALYZE SELECT /*+ RESOURCE_GROUP(rg1) */ * FROM t1 limit 10;

5) 不可或缺的 PROCESSLIST

INFORMATION_SCHEMA 是 ANSI 标准中定义的一组只读视图,提供数据库中所有表、视图、列和过程的信息。多个关系型数据库中都有各自的实现,在 TiDB 的 INFORMATION_SCHEMA.PROCESSLIST 表中,增加了字段 RESOURCE_GROUP varchar(32) ,以此来显示当前活跃会话使用的是哪个资源组。

案例如下,分别开三个窗口,启动三个会话,分别使用默认资源组,会话级资源组,和语句级资源组:

mysql -h 192.168.195.128 -P 4000 -c -u u1 -e 'select sleep(1000)'
mysql -h 192.168.195.128 -P 4000 -c -u u2 -e 'SET RESOURCE GROUP `rg1`; select sleep(1000)'
mysql -h 192.168.195.128 -P 4000 -c -u u3 -e 'SELECT /*+ RESOURCE_GROUP(rg1) */ * sleep(1000)'

此时用 root 用户查看 INFORMATION_SCHEMA.PROCESSLIST 表:

mysql> SELECT USER, RESOURCE_GROUP, INFO from INFORMATION_SCHEMA.PROCESSLIST ORDER BY USER;
+------+----------------+-------------------------------------------------------------------------------------+
| USER | RESOURCE_GROUP | INFO                                                                                |
+------+----------------+-------------------------------------------------------------------------------------+
| root | default        | SELECT USER, RESOURCE_GROUP, INFO from INFORMATION_SCHEMA.PROCESSLIST ORDER BY USER |
| u1   | default        | select sleep(1000)                                                                  |
| u2   | rg1            | select sleep(1000)                                                                  |
| u3   | rg1            | SELECT /*+ RESOURCE_GROUP(rg1) */ sleep(1000)                                       |
+------+----------------+-------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

相关讨论见此(感谢 @db_user 的提示): resource control, 如何查看 session 级别变量 [5]

问题三:I_S.USER_ATTRIBUTES / I_S.RESOURCE_GROUPS 权限控制

接上例,如果使用普通用户,如 u2 用户查看 INFORMATION_SCHEMA.PROCESSLIST 表,则只会显示当前用户,或者说是权限范围内能看到的信息:

mysql> SELECT USER, RESOURCE_GROUP, INFO from INFORMATION_SCHEMA.PROCESSLIST ORDER BY USER;
+------+----------------+-------------------------------------------------------------------------------------+
| USER | RESOURCE_GROUP | INFO                                                                                |
+------+----------------+-------------------------------------------------------------------------------------+
| u2   | rg2            | SELECT USER, RESOURCE_GROUP, INFO from INFORMATION_SCHEMA.PROCESSLIST ORDER BY USER |
| u2   | rg1            | select sleep(1000)                                                                  |
+------+----------------+-------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

这里的推断是, PROCESSLIST 作为既存表,权限设定都是延用之前的逻辑,这里只是增加了字段,所以很好的继承了权限隔离,即普通用户无权、无法看到其他用户,如用户 u1 正在使用的资源组。

但是,对于新增的表 INFORMATION_SCHEMA.USER_ATTRIBUTES 和 INFORMATION_SCHEMA.RESOURCE_GROUPS 并没有做到如此细粒度的权限控制。

○ 对于表 USER_ATTRIBUTES ,普通用户可以查看所有用户的属性,如果【问题二】的功能实现,那么普通用户就可以查看到所有用户绑定的资源组。

○ 对于表 RESOURCE_GROUPS ,普通用户可以查看所有资源组。那么,关于 Bad SQL 问题,其实就有另外一种处理方式,开发者可以在 SQL 里写入 Hint,使得 Bad SQL 可以“越权”调用 default 资源组,轻则打破平衡,影响其他业务性能,重则打穿资源规划,再现 “一条 SQL 炮轰整个 TiDB 集群” 的威力。

从权限角度来看,资源管控所控制的不同资源组虽然做到了资源隔离,但是普通用户可以在 Session 级别随意切换资源组,比如说管理员将普通用户 u2 绑定资源组 rg1,但是 u2 登陆 TiDB 后,可以再切换到 rg2,以获取被分配更多资源的资源组的使用权。

相关交流贴链接: resource control, I_S 权限控制问题 [6]

正如我在帖子里提到的,对于 TiDB,高效、保质地实现功能是第一位的,权限 (Privileges) 实现次之,这是可以接受、理解的。毕竟,在如此内卷,国产数据库竞争如此激烈的市场环境下,“活下去”才是第一要务。但 Rule is Rule,权限(可以引申为“安全”)也是一个很重要、且绕不开的课题。

6) Resource Control 相关配置项

参见 官方文档 [7] ,资源管控引入的两个新变量,

TiDB:通过配置全局变量 tidb_enable_resource_control 控制是否打开资源组流控。

TiKV:通过配置参数 resource-control.enabled 控制是否使用基于资源组配额的请求调度。

查看方法如下:

-- tidb
SHOW VARIABLES LIKE "tidb_enable_resource_control";
-- tikv
SHOW CONFIG WHERE NAME LIKE "resource-control.enabled";

7) Calibrate 资源估算

据文档 预估集群容量 [8] 介绍,目前有根据实际负载估算容量,基于硬件部署估算容量,两种估算方式,而比较直观的方法是基于硬件部署估算容量方式,具体命名如下:

-- 默认 TPC-C 模型预测,等同于下一条命令
CALIBRATE RESOURCE;
-- 根据类似 TPC-C 的负载模型预测
CALIBRATE RESOURCE WORKLOAD TPCC;
-- 根据类似 sysbench oltp_write_only 的负载模型预测
CALIBRATE RESOURCE WORKLOAD OLTP_WRITE_ONLY;
-- 根据类似 sysbench oltp_read_write 的负载模型预测
CALIBRATE RESOURCE WORKLOAD OLTP_READ_WRITE;
-- 根据类似 sysbench oltp_read_only 的负载模型预测
CALIBRATE RESOURCE WORKLOAD OLTP_READ_ONLY;

在 TiDB Dashboard v7.1.0 面板上,我们可以看到新增了【资源管控】菜单,如图,

这里也可以查看资源预估情况,但实际上,Dashboard 也是调用上面的 SQL 进行预测,可以从 TiDB-Server 的日志中进行确认。

...[INFO] [session.go:3878] ... [sql="calibrate resource workload tpcc"]
...[INFO] [session.go:3878] ... [sql="calibrate resource workload oltp_read_write"]
...[INFO] [session.go:3878] ... [sql="calibrate resource workload oltp_read_write"]
...[INFO] [session.go:3878] ... [sql="calibrate resource workload oltp_read_only"]
...[INFO] [session.go:3878] ... [sql="calibrate resource workload oltp_write_only"]

此外,这款估算模型是基于 TiDB 的多年经验积累,在基准测试的基础上实现的算法,适用于多种环境。引申一步,对于目前没有升级到 TiDB v7.1.0 版本的集群,或者需要对将要同步到 TiDB 集群的数据库进行容量估算,如何来处理呢?计算过程略微复杂,如果有兴趣可以参考相关源码 calibrate_resource [9] 。

“资源管控”也需要监控

1) TiDB Dashboard

上文提到,TiDB Dashboard 增加了 【资源管控】 [10] 菜单,在页面下半部分,展示了 RU 相关图表,可以一目了解查看 TiDB 集群的 RU 负载情况,也可以选中图表的某个时间段,来使用 “根据实际负载估算容量” [11] 功能。

2) Grafana

相对于 TiDB Dashboad,Grafana 提供了更全面的监控数据,甚至在面板上分别展示了 读 RU (RRU) 和 写 RU (WRU)。关于 RRU/WRU 的概念性描述较少,只是在 设计文档 [12] 的令牌桶 (Token Buckets) 章节 和 Grafana 的参数介绍页面有所体现。

问题四:RRU/WRU 的表述问题

关于 RRU/WRU 的表述问题,其实只要关注 RU 就好,这是经过基准测试后的预测值,具有统一的观测价值,只是在监控面板上加以区分,以观测 TiDB 集群的读写情况,在代码提交的记录里,也有研发同学的批注,“面向用户是 RU,监控项里面区分是有更多细节”。相关交流贴参见:

  • resource control, Grafana 面板默认配置 [13]
  • resource control, Grafana 文档内容不完整 [14]

3) RU 余量问题

对于日常运维,至少有两个监控指标需要考虑:

○ 日常 RU 余量监控

○ 异常 RU 突增监控

其中,对于 RU 余量监控,TiDB 7.1 只能从 Grafana 面板上看到 RU 使用量,没有直观展示 RU 余量情况,所以在 TiDB 7.2 中得到了增强,具体实现可参考PR: resource_manager: add metrics for avaiable RU #6523 [15] 。

图 -- TiDB 7.1 的 Grafana 面板

图 -- TiDB 7.2 的 Grafana 面板

4) Log

从日志中可以看出什么时候真的开始调用了资源管控,但是无法通过日志或者面板看出有哪些用户使用过资源组。

[2023/06/29 11:27:50.069 +09:00] [INFO] [session.go:3878] [GENERAL_LOG] [conn=7398943596793037429] [user=u2@192.168.195.128] [schemaVersion=53] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="select @@version_comment limit 1"]
[2023/06/29 11:27:58.973 +09:00] [INFO] [session.go:3878] [GENERAL_LOG] [conn=7398943596793037429] [user=u2@192.168.195.128] [schemaVersion=53] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="select current_resource_group()"]
[2023/06/29 11:28:09.557 +09:00] [INFO] [session.go:3878] [GENERAL_LOG] [conn=7398943596793037429] [user=u2@192.168.195.128] [schemaVersion=53] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="set resource group rg1"]
[2023/06/29 11:28:19.532 +09:00] [INFO] [session.go:3878] [GENERAL_LOG] [conn=7398943596793037429] [user=u2@192.168.195.128] [schemaVersion=53] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [currentDB=] [isPessimistic=false] [sessionTxnMode=PESSIMISTIC] [sql="select * from test.t1 limit 1"]
[2023/06/29 11:28:19.534 +09:00] [INFO] [controller.go:287] ["[resource group controller] create resource group cost controller"] [name=rg1]

如果真的出现【问题三】中描述的,存在 Bad SQL “越权” 运行的情况,可以从日志中查找线索。

TiFlash 或将在未来版本中支持 Resource Control

在当前版本 (TiDB 7.1.0 LTS) 中,TiFlash 暂不支持资源管控功能,预计将在未来版本中得到支持。下面从两个实验来观察 TiFlash 组件对资源管控的调度情况,结果肯定是未使用的,不过这个实验可以等未来版本发布之后再做一次,相信会得到不同的结果。

实验一:指定 SQL  TiFlash 读取数据,观察执行计划中的 RU 值

对实验表 t 创建 TiFlash 副本,分别从 TiKV / TiFlash 读取数据,并查看实际执行计划中的 RU 值。

-- tiflash replica
ALTER TABLE t SET TIFLASH REPLICA 1;-- read from tiflash
EXPLAIN ANALYZE FORMAT = 'verbose'
SELECT /*+ read_from_storage(tiflash[t]) */ COUNT(*)
FROM t;-- read from tikv
EXPLAIN ANALYZE FORMAT = 'verbose'
SELECT /*+ read_from_storage(tikv[t]) */ COUNT(*)
FROM t;

SQL 执行结果如图所示,从 TiKV 读取数据的 SQL, RU 值约 40, 而 TiFlash 的 RU 值则为 0,说明当前版本的 TiFlash 并不支持 RU 的计算。

实验二:从日志中观测是否调用资源组控制器

当某个用户连接到 TiDB 后,并向 TiDB 发出 SQL 语句,TiDB Server 向 PD 发起请求,PD 会创建(分配)一个资源组控制器 (resource group controller),TiDB Server 会将相关信息打印到日志中,如:

... [INFO] [controller.go:287] ["[resource group controller] create resource group cost controller"] [name=rg1]

我们可以通过分析 TiDB Server 的日志,来观测发送到 TiFlash 的查询是否调用资源组控制器,并以此来判断 TiFlash 是否实现 RU 计算。对照试验如下:

EXPLAIN ANALYZE FORMAT = 'verbose' SELECT /*+ RESOURCE_GROUP(rg2), read_from_storage(tikv[t]) */ COUNT(*) FROM t;
EXPLAIN ANALYZE FORMAT = 'verbose' SELECT /*+ RESOURCE_GROUP(rg3), read_from_storage(tiflash[t]) */ COUNT(*) FROM t;

从截图中可以直观的看到,资源控制器为上面的 SQL 创建了一个资源组消费控制器 (resource group cost controller),资源组名称为 rg2 。而下面的 SQL 由于从 TiFlash 读取数据,所以并不会调用资源控制器创建新的资源组消费控制器。

需要注意的是,这个实验连续触发可能并不会得到想要的结果,因为源码里实现了资源组控制器实例化判重逻辑,即在本实验中,如果资源控制器已经为用户 u2 创建了 rg2 资源组,那么连续的会话将持续延用已经创建好的控制器,只有当超过 GC 时间 (默认 10 分钟),再次发起新会话,才会再次创建新的资源组消费控制器。

与 MySQL 的兼容性

文已经详细列举了 TiDB 中资源控制的语法,在 MySQL 8.0 中也有 资源组 (Resource Groups) [16] 特性,具体可参考 WL#9467: Resource Groups [17] ,但 TiDB 与之的实现不同,两者并不兼容。

如果同时管理 TiDB 和 MySQL,具体使用时,需要多加区分以免混淆。

相似之处

○ TiDB, MySQL 中的资源组相关命令,“增 ( CREATE RESOURCE GROUP ) 删 ( DROP RESOURCE GROUP ) 改 ( ALTER RESOURCE GROUP ) 查 ( SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS )” 语法相近,但命令后跟接参数不同, I_S.RESOURCE_GROUPS 表结构亦不同。

○ TiDB, MySQL 均支持 Hint,可以实现语句级资源组调用。

INSERT /*+ RESOURCE_GROUP(rg1) */ into t1 values (1);

不同之处

  1. MySQL 中资源组的线程优先级 ( THREAD_PRIORITY ) 设定,需要开启 Linux 中的 CAP_SYS_NICE 。而 TiDB 不需要。
[Service]
AmbientCapabilities=CAP_SYS_NICE
  1. TiDB 中资源组设定的 RU 是定值,而在 MySQL 中可以指定 vCPU 为范围值,这个范围值对应所有可用的 CPU。
mysql> select version()\G
*************************** 1. row ***************************
version(): 8.0.28
1 row in set (0.00 sec)
​
mysql> ALTER RESOURCE GROUP rg1 VCPU = 0-1;
Query OK, 0 rows affected (0.01 sec)
  1. TiDB 中的一些 SQL 语法或函数 (Functions) 是特有的,与 MySQL 不兼容,如 CURRENT_RESOURCE_GROUP() 。

回归本源,再看 cgroup

前文提到了 MySQL 需要借助 Nice 来控制线程优先级,其实熟悉 Linux 系统的朋友都知道 Nice 成名已久,而 cgroup 这位后来者近年逐渐走入人们的视野,尤其是虚拟化、云化技术(如 Docker, Kubernetes)成熟后,cgroup 技术更是不可或缺。比如,从 RHEL 7 之后,可以直接为某个服务在 systemd 文件中设置 CPUAccounting 和 CPUShares 来控制进程对 CPU 的占用率。从 RHEL 8 开始引入了 cgroup v2,以完善功能,简化配置,CPU 控制参数也做了调整,变为 cpu.weight 。

于 TiDB 而言,cgroup 也早有 使用案例 [18] ,比如在 TiDB Server 的 systemd 文件中管控服务的内存配额,来控制 OOM 触发条件。另外,在 TiDB v5.0 版本,对 TiDB Server 的参数 performance.max-procs 实现逻辑做了修改,变更为“默认情况下为当前机器或者 cgroups 的 CPU 数量”,相关内容可参考 PR #17706 [19] 。

总结

由于时间关系,关于 “资源控制 (Resource Control)” 的内容暂且就分享到这里,内容颇多,相信能读到这里的 “Ti 友” 都是真正喜爱 TiDB 的。文本分享了若干具体的使用方式,也提出了若干问题,力争做到求真务实,相信对 TiDBer 有所提示和帮助。最后,关于 Resource Control 的探索才刚刚开始,期待后续版本中的功能增强(比如,对超时 SQL 进行降级或中止(TiDB 7.2 中已实现),将内存等更多资源纳入 RU,用户支持绑定多资源组等),也期待更多关于此特性的生产案例分享。

参考资料

  1. AskTUG: https://asktug.com/
  2. 【社区智慧合集】TiDB 相关 SQL 脚本大全: https://asktug.com/t/topic/999618
  3. resource control,default resource group 文档勘误: https://asktug.com/t/topic/1008372/6?u=shawnyan
  4. resource control 相关,INFORMATION_SCHEMA.USER_ATTRIBUTES 表取值问题: https://asktug.com/t/topic/1008437
  5. resource control, 如何查看session级别变量: https://asktug.com/t/topic/1008357
  6. resource control, I_S 权限控制问题: https://asktug.com/t/topic/1008596
  7. 官方文档: https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control#%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0
  8. 预估集群容量: https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control#%E9%A2%84%E4%BC%B0%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%87%8F
  9. calibrate_resource: https://github.com/pingcap/tidb/blob/v7.1.0/executor/calibrate_resource.go#L295
  10. 【资源管控】: https://docs.pingcap.com/zh/tidb/stable/dashboard-resource-manager
  11. “根据实际负载估算容量”: https://docs.pingcap.com/zh/tidb/stable/sql-statement-calibrate-resource#%E6%A0%B9%E6%8D%AE%E5%AE%9E%E9%99%85%E8%B4%9F%E8%BD%BD%E4%BC%B0%E7%AE%97%E5%AE%B9%E9%87%8F
  12. 设计文档: https://github.com/pingcap/tidb/blob/master/docs/design/2022-11-25-global-resource-control.md#distributed-token-buckets
  13. resource control, Grafana 面板默认配置: https://asktug.com/t/topic/1008464
  14. resource control, Grafana 文档内容不完整: https://asktug.com/t/topic/1008693
  15. resource_manager: add metrics for avaiable RU #6523: https://github.com/tikv/pd/pull/6523
  16. 资源组 (Resource Groups): https://dev.mysql.com/doc/refman/8.0/en/resource-groups.html
  17. WL#9467: Resource Groups: https://dev.mysql.com/worklog/task/?id=9467
  18. 使用案例: https://asktug.com/t/topic/37127/2?u=shawnyan
  19. #17706: https://github.com/pingcap/tidb

相关文章:

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布,相信很多同学都已经抢先使用了起来,甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性,新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线…...

Django Web开发入门基础

官方有很详细的文档,但是看过几遍之后如果要翻找还是有点麻烦,本文算作是学习笔记,提取一些关键点记录下来,另附上官方教程 编写你的第一个 Django 应用 注: 文中的指令使用py,是在Windows上,ma…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C#) Baumer工业相机Baumer工业相机的图像剪切(ROI)功能的技术背景CameraExplorer如何使用图像剪切(ROI)功…...

LetCode算法题---第2天

注:大佬解答来自LetCode官方题解 80.删除有序数组的重复项Ⅱ 1.题目 2.个人解答 var removeDuplicates function (nums) {let res [];for (let index 0; index < nums.length; index) {let num 0;if (res.includes(nums[index])) {for (let i 0; i < res.length; …...

Leetcode.2571 将整数减少到零需要的最少操作数

题目链接 Leetcode.2571 将整数减少到零需要的最少操作数 rating : 1649 题目描述 给你一个正整数 n n n &#xff0c;你可以执行下述操作 任意 次&#xff1a; n n n 加上或减去 2 2 2 的某个 幂 返回使 n n n 等于 0 0 0 需要执行的 最少 操作数。 如果 x 2 i x 2^…...

微前端无界 项目使用记录

1预期目标和场景 一个vue框架开发的应用&#xff0c;需要使用另一个系统的页面。 通俗来说&#xff0c;就是在一个web应用中独立的运行另一个web应用 2 技术支持 微前端处理方案&#xff1a;无界 无界官网&#xff1a; https://wujie-micro.github.io/doc/guide/ CSDN 参考…...

CDH 6.3.2升级Flink到1.17.1版本

CDH&#xff1a;6.3.2 原来的Flink&#xff1a;1.12 要升级的Flink&#xff1a;1.17.1 操作系统&#xff1a;CentOS Linux 7 一、Flink1.17编译 build.sh文件&#xff1a; #!/bin/bash set -x set -e set -vFLINK_URLsed /^FLINK_URL/!d;s/.*// flink-parcel.properties FLI…...

基于谷歌Transeformer构建人工智能问答系统

目录 1 项目背景 2 关键技术 2.1 Transeformer模型 2.2 Milvus向量数据库 3 系统代码实现 3.1 运行环境构建 3.2 数据集介绍 3.3 预训练模型下载 3.4 代码实现 3.4.1 创建向量表和索引 3.4.2 构建向量编码模型 3.4.3 数据向量化与加载 3.4.4 构建检索web 3.5 运行结…...

【2023年11月第四版教材】第15章《风险管理》(合集篇)

第15章《风险管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础2.1 风险的属性2.2 风险的分类★★★2.3 风险成本★★★2.4 管理新实践 3 管理过程4 管理ITTO汇总★★★5 过程1-规划风险管理6 过程2-识别风险6.1 识别风险★★★6.2 数据收集★★★6.3 数据分析★★★…...

python常见面试题四

解释 Python 中的魔术方法 (magic methods)。 答&#xff1a;魔术方法是以双下划线 __ 开头和结尾的方法&#xff0c;用于在特定条件下自动调用。例如&#xff0c;__init__ 是用于初始化对象的魔术方法。 解释 Python 中的装饰器 (decorator)。 答&#xff1a;装饰器是一种特殊…...

stm32无人机-飞行力学原理

惯性导航&#xff0c;是一种无源导航&#xff0c;不需要向外部辐射或接收信号源&#xff0c;就能自主进行确定自己在什么地方的一种导航方法。 惯性导航主要由惯性器件计算实现&#xff0c;惯性器件包括陀螺仪和加速度计。一般来说&#xff0c;惯性器件与导航物体固连&#xf…...

Java括号匹配

目录 一、题目描述 二、题解 一、题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭…...

自动化测试-友好的第三方库

目录 mock furl coverage deepdiff pandas jsonpath 自动化测试脚本开发中&#xff0c;总是会遇到各种数据处理&#xff0c;例如MOCK、URL处理、JSON数据处理、结果断言等&#xff0c;也会遇到所采用的测试框架不能满足当前需求&#xff0c;这些问题都需要我们自己动手解…...

基于微信小程序的火锅店点餐订餐系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

亿图脑图新版本支持思维导图一键生成PPT、音视频等格式,办公提效再升级

近日&#xff0c;国产思维导图软件——亿图脑图MindMaster发布了全新版本V10.9.0&#xff0c;本次亿图脑图的升级给用户带来了极大的惊喜。全新升级的亿图脑图MindMaster不仅支持20格式的文件智能解析成思维导图&#xff0c;还支持思维导图一键生成PPT、音频、视频等内容形式&a…...

Arthas:Java调试利器使用

Arthas:Java调试利器使用 1. Arthas是什么2. Arthas可以解决什么问题Arthas启动方式1. jar启动2. 在线安装 远程连接命令使用- 退出threadclassloaderscsm watchtrace修改日志级别 1. Arthas是什么 Arthas(阿尔萨斯)是阿里开源的一个Java在线分析诊断工具. 2. Arthas可以解决…...

Nuxt 菜鸟入门学习笔记七:SEO 和 Meta 设置

文章目录 SEO 和 Meta默认值useHeaduseSeoMeta 和 useServerSeoMetaComponentsMeta 对象数据类型格式特性响应式 Reactivity标题模板 Title TemplateBody Tags 示例 ExamplesdefinePageMeta动态设置标题动态添加外部 CSS Nuxt 官网地址&#xff1a; https://nuxt.com/ SEO 和 …...

栈(Stack)和队列(Queue)

栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;都是常见的数据结构&#xff0c;用于存储和操作一组元素。 栈是一种后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的数据结构&#xff0c;类似于把元素堆在一起形成的一堆物体&…...

LeetCode 75 part 06 栈

2390.从字符串中移除星号 思路&#xff1a;把元素加入栈中&#xff0c;遇到 * 号直接弹出栈顶元素 class Solution { public:string removeStars(string s) {stack<char>st;for(int i0;i<s.size();i){//字符加入栈&#xff0c;遇到星号弹出栈if(s[i]!*) st.push(s[i…...

19.组合模式(Composite)

意图&#xff1a;将对象组成树状结构以表示“部分&#xff0d;整体”的层次结构&#xff0c;使得Client对单个对象和组合对象的使用具有一致性。 上下文&#xff1a;在树型结构的问题中&#xff0c;Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…...

应用在IPM接口隔离领域中的光电耦合器

IPM即Intelligent Power Module(智能功率模块)的缩写&#xff0c;它是通过优化设计将IGBT连同其驱动电路和多种保护电路封装在同一模块内&#xff0c;使电力变换装置的设计者从繁琐的IGBT驱动和保护电路设计中解脱出来&#xff0c;大大降低了功率半导体器件的应用难度&#xff…...

rust引用

一、引用是什么 引用&#xff0c;又叫做借用。是一个指针类型。 引用是指向数据的指针&#xff0c;它允许我们以只读或可变的方式访问数据&#xff0c;而不获取数据的所有权。 编译器静态地保证了引用总是指向有效的对象。也就是说&#xff0c;当存在引用指向一个对象时&#…...

Android AMS——Activity Pause(八)

在前面的文章《Android AMS——ATMS解析(四)》中,介绍了 Activity 的启动流程,其中调用到 Task.resumeTopActivityInnerLocked() 时,会先调用 startPausingLocked 暂停前一个 Activity,在启动新的 Activity。 这里我们就看以下 Activity 的暂停流程。 一、Activity暂停流…...

【数据结构】冒泡排序,快速排序的学习知识总结

目录 1、冒泡排序 1.1 算法思想 1.2 代码实现 方式一&#xff1a;顺序表 方式二&#xff1a;链表 2、快速排序 2.1 算法思想 2.2 代码实现 2.3 例题分析 1、冒泡排序 1.1 算法思想 冒泡排序是一种简单的排序算法&#xff0c;它的基本思想是从数组的第一个元素开始…...

ubuntu终端 中文显示 改为 英文显示

临时有效 如果希望终端显示英文&#xff0c;可以在终端设置环境变量 export LC_ALLC 若希望取消环境变量 unset LC_ALL 实际是改变系统两个环境变量 $LANGUAGE 和 $LANG的值&#xff08;可以用echo $LANG 来查看值&#xff09; 永久有效&#xff1b; 1.打开终端&#xf…...

ChatGPT Prompting开发实战(十二)

一、如何开发prompts实现个性化的对话方式 通过设置“system”和“user”等roles&#xff0c;可以实现个性化的对话方式&#xff0c;并且可以结合参数“temperature”的设定来差异化LLM的输出内容。在此基础上&#xff0c;通过构建一个餐馆订餐对话机器人来具体演示对话过程。…...

springboot整合eureka

1、直入主题&#xff0c;导入pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…...

记录一个 GUI 库的对比测试结果

1&#xff0c;Java 的 JavaFX 2&#xff0c;golang 的 Fyne 1, Java 测试的是一个俄罗斯方块的 GUI 程序。一切正常。 2&#xff0c;Golang github 的原仓库网络问题&#xff0c;没能测试上&#xff0c;使用以下库 https://gitee.com/mirrors/Fyne 下载代码后提示“编译失…...

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题&#xff1a;在添加修改时&#xff0c;对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步&#xff1a;首先在对应的属性上&#xff0c;加上以下注解 如果只添加以下注解&#xff0c;在增加或者修改时&#xff0c;可能对应的 LocalDateTime 会出…...

【力扣2057】值相等的最小索引

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;值相等的最小索引 给你一个下标从 0 开始的整数数组 nums …...

建立门派/抖音seo什么意思

Android右滑返回上一个界面的实现方法public class BaseActivity extends Activity implements OnTouchListener {public ProgressDialog progressDialog;public String states;public RequestQueue mQueue;/** 触摸时按下的点 **/PointF downP new PointF();/** 触摸时当前的…...

广州站是不是广州火车站/系统推广公司

根据云安全联盟的年度调查显示,虽然企业及其员工正在越来越多的使用云计算服务,但企业高管仍然担心业务数据存储在云计算中所涉及的安全隐患。 这个“云部署做法和重点调查报告”发现,74%的企业计划在今年部署云计算服务,但只有8%的企业认为他们知道其员工正在使用什么应用程序…...

如何做盗版小说网站/希爱力5mg效果真实经历

项目设计背景&#xff1a; 在我们以往的考试经历中&#xff0c;我们可以看到&#xff0c;每次考试都需要经过出试卷、印试卷、发卷、做卷、收卷、阅卷、统计等过程&#xff0c;这几个过程有着很强的先后次序&#xff0c;不能顺序颠倒。这些过程中&#xff0c;又以出卷、阅卷和…...

电子商务知名网站/网站优化推广方案

可能大家在使用DataGrid编辑数据的时候会觉得要点击最后的编辑列的按钮来修改数据不是很方便&#xff0c;在今天的例子中给出一种比较方便的操作方法&#xff1a;要修改数据点击这一行&#xff0d;》鼠标放在哪个文本框就会选中哪个文本框的内容&#xff0c;直接可以进行修改&a…...

怎样开通app软件/上海seo公司哪个靠谱

本文是转载文章:原文网址http://blog.163.com/guaiguai_family/blog/static/20078414520141023103953705/ 这两天了解了一些 parallel file system 比如 PVFS2/OrangeFS, Lustre&#xff0c;它们都声称支持 InfiniBand 网络连接技术&#xff0c;好奇之下查了下&#xff0c;发…...

华为网站建设方案模板/宁德seo公司

将正则表达式直接写在mock里 Mock拦截Ajax的函数如下&#xff1a; Mock.mock(rurl, method, function) 已知 rurl 可以直接使用正则表达式&#xff0c;那么不妨碍直接把正则表达式写在 rurl 里&#xff0c;即如下&#xff1a; Mock.mock(/http:\/\/localhost:3000\/ywcklb\/g…...