什么是Resource Groups
MySQL支持创建和管理资源组,并允许将服务器中运行的线程分配给特定的组,以便线程根据该组可用的资源执行。使用组属性可以控制其资源,以启用或限制组中线程的资源消耗。DBA可以根据不同的工作负载修改这些属性。在MySQL实例里包含很多后台线程,比如Master Thread、IO Thread, Purge Thread等,也有处理用户请求的前台线程,在MySQL 8.0之前,所有的线程都是同等优先级的,官方的版本是不可以修改线程的优先级的,也没法将线程绑定到特定的cpu核上。在某些业务场景下,希望可以来做干涉,例如,白天业务高峰的时候,让用户线程的优先级更高,而到晚上做批量处理的时候,让负责批量处理的线程优先级更高,等等,另外,也希望可以给特定的线程来绑定cpu核,来保证服务质量等。
使用MySQL 8.0资源组这个特性就可以很方便的满足这些需求,要做的就是通过CREATE RESORUCE GROUP命令创建一个资源组,在这个DDL语句里面指定这个的类型(USER 或者 SYSTEM类型),优先级 (-20..0 for SYSTEM 类型线程, 0..19 for USER类型线程,数字越小优先级越高),以及可以使用的VCPU(逻辑CPU)的编号。之后,再使用SET RESOURCE GROUP语句将thread指派到某个组里面即可。
注: 系统可用的VCPU编号可以通过cat cat proc/cpuinfo命令查看,processor字段就是对应的VCPU的编号;在没有开启超线程的情况下,逻辑CPU个数 = 物理CPU个数 * CPU内核数。
资源组信息查看
INFORMATION_SCHEMA.RESOURCE_GROUPS
INFORMATION_SCHEMA库下的RESOURCE_GROUPS表中记录了所有定义的资源组的情况:
MySQL8.0默认会创建两个资源组,一个是USR_default另一个是SYS_default。
PERFORMANCE_SCHEMA.THREADS
PERFORMANCE_SCHEMA库下的THREADS表中,可以查看当前线程使用资源组的情况:
其中RESOURCE_GROUP字段显示线程使用的是哪个资源组。
如何使用资源组
假设现在需要对跑批任务创建一个资源组。
创建一个资源组
指定使用资源组
将创建的Batch资源组绑定到执行的线程上,有两种方式:
· 方式一
从PERFORMANCE_SCHEMA.THREADS表中查找需要绑定执行的线程ID(注意:THREADS表中的THREAD_ID和SHOW PROCESSLIST的ID不等同)
查看需要绑定的线程的THREAD_ID:
将线程与Batch资源组绑定:
· 方式二
采用Optimizer Hints的方式指定SQL使用的资源组:
SELECT *+ RESOURCE_GROUP(Batch) */ * FROM t2 ;
修改资源组配置
可能跑批任务使用CPU资源不够,那就需要修改资源组的配置。
ALTER RESOURCE GROUP Batch VCPU = 10-20;
修改资源组优先级:
ALTER RESOURCE GROUP Batch THREAD_PRIORITY = 5;
禁止使用资源组:
ALTER RESOURCE GROUP Batch DISABLE FORCE;
删除资源组
对于不用的资源组可以删除
DROP RESOURCE GROUP Batch;
使用注意点
· CREATE RESOURCE GROUP、ALTER RESOURCE GROUP、DROP RESOURCE GROUP等SQL语句并不会被记录到binlog中,不会被复制到从库。
·如果MySQL安装了thread pool插件,无法使用RESOURCE GROUP特性
· macOS 平台上不支持RESOURCE GROUP特性
· FreeBSD 和 Solaris 平台上无法指定资源组优先级(priorities),所有线程运行在0状态。
· Linux 平台上需要开启 CAP_SYS_NICE 特性才能使用RESOURCE GROUP
检查mysqld进程是否开启CAP_SYS_NICE特性
[root@mgr1 ~]# getcap usr/local/mysql/bin/mysqld
给mysqld进程开启CAP_SYS_NICE特性
[root@mgr1 ~]# setcap cap_sys_nice+ep usr/local/mysql/bin/mysqld
检查是否开启成功
[root@mgr1 ~]# getcap usr/local/mysql/bin/mysqld
/usr/local/mysql/bin/mysqld = cap_sys_nice+ep
[root@mgr1 ~]#
使用资源组的限制
如果安装了线程池插件,则资源组不可用。
资源组在macOS上不可用,macOS不提供用于将CPU绑定到线程的API。
在FreeBSD和Solaris上,资源组线程优先级被忽略。
在Linux上,除非CAP_SYS_NICE设置了功能,否则将忽略资源组线程优先级。授予CAP_SYS_NICE流程能力可以实现一系列特权;
目前仅支持对CPU的设定,不包含IO,内存等。
资源组类型只支持USER和SYSTEM两种类型,而常见的线程类型是FOREGROUN和BACKGROUND,直接通过SET RESOURCE GROUP来指定线程的资源组往往会报3661错
对操作系统平台有强依赖
在Windows上,线程以五个线程优先级之一运行。下表列出了资源组线程优先级范围-20到19映射到那些级别。
优先范围 Windows优先级 -20至-10 THREAD_PRIORITY_HIGHEST -9至-1 THREAD_PRIORITY_ABOVE_NORMAL 0 THREAD_PRIORITY_NORMAL 1至10 THREAD_PRIORITY_BELOW_NORMAL 11至19 THREAD_PRIORITY_LOWEST
总结
资源组是MySQL 8.0调控线程优先级和绑定CPU核的特性。
特性依赖于底层操作系统的支持,在Linux环境下,mysqld可执行命令需要有CAP_SYS_NICE能力,可以选择的逻辑CPU的列表也是依赖于具体的Linux环境。
必须有RESOURCE_GROUP_ADMIN权限的用户才可以创建,修改和删除资源组。
支持的用户组类型目前只有USER和SYSTEM两种,在通过SET RESOURCE GROUP来修改线程的资源组的时候,线程的类型和资源池类型必须匹配。
支持session级别和语句级别指定资源组。
对资源组的操作会涉及到对backup锁,资源组DML锁的操作。
更多请参考:https://dev.mysql.com/doc/refman/8.0/en/resource-groups.html