文章目录
- 前言
- 1. 应用场景
- 2. 资源组介绍
- 3. 资源组维护
- 4. 资源组的限制
前言
MySQL 是单进程多线程的程序,在 8.0 之前所有的线程优先级都是相同的,并且所有的线程资源都是共享的。8.0 之后推出 RESOURCE GROUP 特性 DBA 可以通过资源组的方式修改线程优先级以及所使用的资源,目前仅支持 CPU 资源。
1. 应用场景
业务上经常会有一些跑批操作,这些跑批 SQL 往往较复杂且涉及数据量大,执行起来非常消耗资源,往往是业务低峰夜间执行,避免影响其它线程运行避免 CPU 跑满,堵塞其它线程,导致请求进不去。有了 RESOURCE GROUP 特性,我们可以创建一个资源组,让跑批任务限制在固定的一个或多个 CPU 核上,避免影响其它线程。
2. 资源组介绍
查询现有的资源组,系统默认的资源组,无法进行修改或者删除。
select * from information_schema.resource_groups;
可以通过下方 SQL 查询资源组的使用情况,被哪些线程使用。
select * from performance_schema.threads\G
我们模拟要跑一个 UPDATE 批次任务,现在创建一个资源组。
CREATE RESOURCE GROUP Batch
TYPE = USER
VCPU = 0
THREAD_PRIORITY = 10;
将线程与资源组绑定,设置的权重为 10
root@mysql 13:43: [sbtest]>show processlist;
+----+-----------------+-----------+--------+---------+--------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+--------+---------+--------+------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 169216 | Waiting on empty queue | NULL |
| 61 | root | localhost | sbtest | Query | 0 | init | show processlist |
| 62 | root | localhost | NULL | Sleep | 13 | | NULL |
+----+-----------------+-----------+--------+---------+--------+------------------------+------------------
会话 ID 等于 61 我们通过会话 ID 定位到线程 ID
select * from performance_schema.threads where processlist_id = 61;
将线程与资源组进行绑定:
SET RESOURCE GROUP Batch FOR 115;
执行跑批任务,修改全表值。
root@mysql 13:49: [sbtest]>update new set new_seenum = 17;
Query OK, 2000000 rows affected (1 min 16.57 sec)
Rows matched: 2000000 Changed: 2000000 Warnings: 0
下图为期间 CPU 使用率指标对比,使用资源组我们可以看到 CPU0 使用率为 100%,而未使用资源组时,CPU 负载还是比较均衡。
3. 资源组维护
创建资源组:
CREATE RESOURCE GROUP Batch
TYPE = USER
VCPU = 2-3 -- assumes a system with at least 4 CPUs
THREAD_PRIORITY = 10;
将线程与资源组绑定:
SET RESOURCE GROUP Batch FOR 线程ID;
修改采用 Optimizer Hints 的方式指定 SQL 使用的资源组:
SELECT /*+ RESOURCE_GROUP(Batch) */ * FROM sbtest1;
修改资源组的配置:
ALTER RESOURCE GROUP Batch VCPU = 10-20;
修改资源组的优先级:
ALTER RESOURCE GROUP Batch THREAD_PRIORITY = 5;
禁用资源组:
ALTER RESOURCE GROUP Batch DISABLE FORCE;
删除资源组:
DROP RESOURCE GROUP Batch;
4. 资源组的限制
- 如果安装了线程池插件,则资源组不可用。
- 资源组在 macOS 上不可用,它没有提供用于将 CPU 绑定到线程的 API。
- 目前只能绑定 CPU 资源,不能绑定其他资源。
参考:MySQL Resource Groups