资源管理
MySQL 8 开始支持使用资源组控制系统CPU资源的分配,将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。组属性可以控制其资源,包括VCPU的个数和线程的优先级。DBA可以根据不同的工作负载修改这些属性。
默认情况下,有一个系统组和一个用户组,分别名为SYS_default和 USR_default。无法删除这些默认组,并且无法修改其属性。每个默认组都没有CPU关联,优先级为0。
资源组属性
每个组都有一个名字。资源组名称是表和列名称之类的标识符。组名称不区分大小写,最长可达64个字符。
每个组都有一个类型,或者是 SYSTEM或者USER。对于系统资源组,允许的优先级范围是-20到0,对于用户资源组,允许的优先级范围是0到19。系统组的优先级高于用户组,确保用户线程的优先级不会高于系统线程。
CPU亲缘关系是资源组可以使用的一组虚拟CPU。亲和关系可以是可用CPU的任何非空子集。如果组没有亲和力,则可以使用所有可用的CPU。
线程优先级是分配给资源组的线程的执行优先级。优先级值的范围从-20(最高优先级)到19(最低优先级)。系统组和用户组的默认优先级均为0。
可以启用或禁用每个组,从而使管理员可以控制线程分配。线程只能分配给已启用的组。
前面两个资源组属性创建时定义,其它属性在资源组创建时定义,并且可以在以后的任何时间进行修改。
默认资源组
默认资源组有两个:SYS_default和 USR_default组
mysql> 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-3 THREAD_PRIORITY: 0 *************************** 2. row *************************** RESOURCE_GROUP_NAME: SYS_default RESOURCE_GROUP_TYPE: SYSTEM RESOURCE_GROUP_ENABLED: 1 VCPU_IDS: 0-3 THREAD_PRIORITY: 0
新创建的系统和用户线程分别分配给 SYS_default和 USR_default组。
创建资源组
例子:创建一个用户资源组:
CREATE RESOURCE GROUP Batch TYPE = USER VCPU = 2-3 THREAD_PRIORITY = 10; mysql> SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS WHERE RESOURCE_GROUP_NAME = 'Batch'\G ---查看这个用户资源组 *************************** 1. row *************************** RESOURCE_GROUP_NAME: Batch RESOURCE_GROUP_TYPE: USER RESOURCE_GROUP_ENABLED: 1 VCPU_IDS: 2-3 THREAD_PRIORITY: 10
将线程分配给Batch组
要将线程分配给Batch组,请执行以下操作:
SET RESOURCE GROUP Batch FOR thread_id;
如果自己的当前线程应该在 Batch组中,请在会话中执行以下语句:
SET RESOURCE GROUP Batch;
此后,会话中的语句将使用Batch组资源执行 。
要使用Batch组执行单个语句 ,请使用 RESOURCE_GROUP优化程序提示:
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
修改资源组属性
对于系统高负载的时间,减少分配给组的CPU数量,降低其优先级:
ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = 19;
在系统负载较轻的情况下,增加分配给组的CPU数量,提高其优先级:
ALTER RESOURCE GROUP Batch VCPU = 0-3 THREAD_PRIORITY = 0;
注意:用户线程的优先级范围
mysql> ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = -9;
ERROR 3654 (HY000): Invalid thread priority value -9 for User resource group Batch. Allowed range is [0, 19].
激活资源组
ALTER RESOURCE GROUP Batch enable;
Linux上设置线程优先级
在Linux上,除非CAP_SYS_NICE设置了功能,否则将忽略资源组线程优先级,也就是THREAD_PRIORITY项将是0。
CAP_SYS_NICE可以使用setcap 命令手动设置该功能,可以使用getcap检查功能。例如:
root@scutech:~# setcap cap_sys_nice+ep /usr/sbin/mysqld root@scutech:~# getcap /usr/sbin/mysqld /usr/sbin/mysqld = cap_sys_nice+ep
或者使用sudo systemctl edit mysql增加下面的内容:
[Service] AmbientCapabilities=CAP_SYS_NICE
然后重新启动mysql服务
Windows上的优先级对应
在Windows上,线程以五个线程优先级之一运行。资源组线程优先级范围-20到19映射到这些级别
资源组的限制:
如果安装了线程池插件,则资源组不可用。
资源组在macOS上不可用,它不提供用于将CPU绑定到线程的API。
在FreeBSD和Solaris上,忽略资源组线程优先级。(实际上,所有线程都以优先级0运行。)尝试更改优先级会导致警告