MySQL8.0: 通过Resource Group来控制线程计算资源

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

MySQL8.0增加了一个新功能resource group, 可以对不同的用户进行资源控制,例如对用户线程和后台系统线程给予不同的CPU优先级。

用户可以通过SQL接口创建不同的分组,这些分组可以作为sql的hit,也可以动态的绑定过去。本文主要简单介绍下用法,至于底层如何实现的,其实比较简单:创建的分组被存储到系统表中;在linux系统底层通过CPU_SET来绑定CPU,通过setpriority来设置线程的nice值

相关worklog:
[WL#9467: Resource Groups(https://dev.mysql.com/worklog/task/?id=9467)

创建resource group

首先系统自带两个resource group并且不可被修改

root@(none) 05:54:22>SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS\G
*************************** 1. row ***************************
RESOURCE_GROUP_NAME: USR_default
RESOURCE_GROUP_TYPE: USER
RESOURCE_GROUP_ENABLED: 1
VCPU_IDS: 0-63
THREAD_PRIORITY: 0
*************************** 2. row ***************************
RESOURCE_GROUP_NAME: SYS_default
RESOURCE_GROUP_TYPE: SYSTEM
RESOURCE_GROUP_ENABLED: 1
VCPU_IDS: 0-63
THREAD_PRIORITY: 0
2 rows in set (0.00 sec)

如果你想设置thread priority,可能需要使用超级账户来启动Mysqld,这是系统限制,如果以非super账户启动,只能降低而不能提升优先级。在非super启动时,thread_priority会被忽略掉并报一个warning出来。

对于类型为system的系统后台线程,cpu priority只能从-20 ~0,而普通user线程,则在0~19之间,这样就保证了系统线程的优先级肯定比用户线程高。

如果设置不在范围内,就会报错

root@(none) 10:27:09>CREATE RESOURCE GROUP test_user_rg   TYPE = USER   VCPU = 0-32,48-63   THREAD_PRIORITY = -10;
ERROR 3654 (HY000): Invalid thread priority value -10 for User resource group test_user_rg. Allowed range is [0, 19].

我们尝试为user类线程创建一个resource group,使用0-32, 48-63号cpu, 线程优先级为10

root@(none) 10:27:14>CREATE RESOURCE GROUP test_user_rg   TYPE = USER   VCPU = 0-32,48-63   THREAD_PRIORITY = 10;
Query OK, 0 rows affected (0.01 sec)

root@(none) 10:55:19>SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS WHERE RESOURCE_GROUP_NAME = 'test_user_rg'\G
*************************** 1. row ***************************
   RESOURCE_GROUP_NAME: test_user_rg
   RESOURCE_GROUP_TYPE: USER
RESOURCE_GROUP_ENABLED: 1
              VCPU_IDS: 0-32,48-63
       THREAD_PRIORITY: 10
1 row in set (0.00 sec)

CREATE/DELETE/ALTER RESOURCE GROUP都需要RESOURCE_GROUP_ADMIN权限,具体的语法见官方文档

使用resource group

创建好后,我们该如何使用resource group呢,主要有两种方式,一种是SET RESOURCE GROUP, 一种是通过SQL HINT的方式,以下是简单的测试:

设置当前session:

root@(none) 11:01:08>SET RESOURCE GROUP test_user_rg;
Query OK, 0 rows affected (0.00 sec)

也可以指定hint的方式来设置:

root@sb1 11:07:53>select /* + RESOURCE_GROUP(test_user_rg) */ * from sbtest1 where id <10;

还可以通过thread id来设置其他运行中的session,注意这里的thread id不是show processlist看到的id,而是通过performance_schema.threads表看到的id

xx@performance_schema 11:30:21>SELECT THREAD_ID, TYPE FROM performance_schema.threads WHERE PROCESSLIST_ID = 26\G
*************************** 1. row ***************************
THREAD_ID: 71
     TYPE: FOREGROUND
1 row in set (0.00 sec)
xx@performance_schema 11:30:43>SET RESOURCE GROUP test_user_rg for 71;
Query OK, 0 rows affected (0.00 sec)
​

如果你想对InnoDB的后台线程来进行设置呢 ? 可以去查看performance_schema.threads表,例如我们对page cleaner进行优先级设置:

xx@performance_schema 11:19:43>CREATE RESOURCE GROUP test_system_rg   TYPE = SYSTEM   VCPU = 49   THREAD_PRIORITY = -10;
Query OK, 0 rows affected (0.00 sec)

xx@performance_schema 11:24:11>SELECT THREAD_ID, TYPE FROM performance_schema.threads WHERE NAME LIKE '%page_flush_coor%'\G
*************************** 1. row ***************************
THREAD_ID: 13
     TYPE: BACKGROUND
1 row in set (0.00 sec)
xx@performance_schema 11:24:07>SET RESOURCE GROUP test_system_rg for 13;
Query OK, 0 rows affected (0.00 sec)

可以看到,通过resource group,我们可以为任意的线程指定不同的计算资源。在未来我们甚至可以对这一功能进行扩展,例如某个线程的最大iops,读入数据占用buffer pool的百分比,或者对运维程序指定独立的cpu,避免干扰到正常的业务负载等等,还是有不少的想象空间的。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
50 3
|
1月前
|
存储 监控 关系型数据库
MySQL计算某条数据与上一条数据的生成时间差
MySQL计算某条数据与上一条数据的生成时间差
42 2
|
3月前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
75 1
|
4月前
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(八):创建计算字段
MySQL 保姆级教程(八):创建计算字段
|
4月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
5月前
|
JSON 关系型数据库 MySQL
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
160 1
|
5月前
|
Java
在Java中,死锁是指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。
【6月更文挑战第24天】在Java并发中,死锁是多线程互相等待资源导致的僵局。避免死锁的关键策略包括:防止锁嵌套,设定固定的加锁顺序,使用`tryLock`带超时,避免无限等待,减少锁的持有时间,利用高级同步工具如`java.util.concurrent`,以及实施死锁检测和恢复机制。通过这些方法,可以提升程序的并发安全性。
43 1
|
4月前
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
|
5月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
42 3
|
5月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之整库从mysql同步到StarRocks里面,首次全量是否会对mysql造成大量资源消耗,导致影响业务服务
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

相关产品

  • 云数据库 RDS MySQL 版