暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL 8.0 |资源组 (Resource Groups)

数据库实用技能 2021-04-19
1138





什么是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至-10THREAD_PRIORITY_HIGHEST
    -9至-1THREAD_PRIORITY_ABOVE_NORMAL
    0THREAD_PRIORITY_NORMAL
    1至10THREAD_PRIORITY_BELOW_NORMAL
    11至19THREAD_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



文章转载自数据库实用技能,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论