7.1.16 资源组
MySQL 支持创建和管理资源组,并允许将服务器中的线程分配到特定的组,以便线程根据组中的资源执行。组属性使得对资源的控制,可以启用或限制组中的线程对资源的消耗。DBA 可以根据不同的工作负载来修改这些属性。
当前,CPU 时间是一个可管理的资源,表示为“虚拟 CPU”的概念,这个概念包括 CPU 核心、超线程、硬件线程等。服务器在启动时确定可用的虚拟 CPU 数量,具有适当权限的数据库管理员可以将这些 CPU 分配到资源组中,并将线程分配到组中。
例如,DBA 可以创建一个Batch
资源组,并根据服务器的繁忙程度调整优先级。 (可能在白天,批处理作业分配到组中,运行在较低优先级;在夜晚,运行在较高优先级。) DBA 还可以调整组中的可用 CPU 数量。组可以启用或禁用,以控制线程是否可以分配到组中。
以下部分描述了 MySQL 中资源组的使用:
在某些平台或 MySQL 服务器配置中,资源组可能不可用或有限制。特别是 Linux 系统可能需要手动步骤来安装某些方法。详细信息,请见资源组限制。
这些功能提供了 MySQL 中资源组管理的 SQL 接口:
-
SQL 语句使得可以创建、修改和删除资源组,并将线程分配到资源组中。optimizer 提示使得可以将单个语句分配到资源组中。
-
资源组权限提供了对用户可以执行资源组操作的控制。
-
信息_schema
RESOURCE_GROUPS
表公开了资源组定义的信息,而性能_schemathreads
表显示了每个线程的资源组分配。 -
状态变量提供了每个管理 SQL 语句的执行次数。
资源组具有定义组的属性。所有属性都可以在组创建时设置。一些属性在创建时是固定的,其他的可以在任何时候修改。
这些属性是在资源组创建时定义的且不能被修改:
-
每个组都有一个名称。资源组名称是标识符,如表和列名称,不需要在SQL语句中加引号,除非名称包含特殊字符或是保留字。组名称不区分大小写且最长64个字符。
-
每个组都有一个类型,类型是
SYSTEM
或USER
。资源组类型影响了组的优先级范围,因为后者将影响系统线程和用户线程的优先级。系统线程和用户线程对应于背景线程和前台线程,如性能_schema
threads
表中所列。
这些属性是在资源组创建时定义的且可以在任何时候修改:
-
CPU亲和力是资源组可以使用的虚拟CPU集。亲和力可以是可用的CPU的非空子集。如果组没有亲和力,它可以使用所有可用的CPU。
-
线程优先级是分配给资源组的线程的执行优先级。优先级范围从-20(最高优先级)到19(最低优先级)。默认优先级是0,系统和用户组都相同。
系统组允许的优先级范围是-20到0,而用户组的优先级范围是0到19。
-
每个组都可以启用或禁用,管理员可以控制线程分配。线程只能分配给启用的组。
-
默认情况下,有一个系统组和一个用户组,名为
SYS_default
和USR_default
,它们不能被删除且不能修改。每个默认组都没有CPU亲和力和优先级0。
-
-
新创建的系统和用户线程将被分配到
SYS_default
和USR_default
组中。
要创建和管理自定义资源组,使用以下SQL语句:
CREATE RESOURCE GROUP
创建一个新的组。见Section 15.7.2.2, “CREATE RESOURCE GROUP Statement”。
For user-defined resource groups, all attributes are assigned at group creation time. After a group has been created, its attributes can be modified, with the exception of the name and type attributes.
To create and manage user-defined resource groups, use these SQL statements:
-
CREATE RESOURCE GROUP
creates a new group. See Section 15.7.2.2, “CREATE RESOURCE GROUP Statement”. -
ALTER RESOURCE GROUP
修改现有组。见第15.7.2.1节,“ALTER RESOURCE GROUP 语句”。 -
DROP RESOURCE GROUP
删除现有组。见第15.7.2.3节,“DROP RESOURCE GROUP 语句”。
这些语句需要RESOURCE_GROUP_ADMIN
特权。
为了管理资源组分配,使用这些能力:
-
SET RESOURCE GROUP
将线程分配给组。见第15.7.2.4节,“SET RESOURCE GROUP 语句”。 -
The
RESOURCE_GROUP
优化器提示将单个语句分配给组。见第10.9.3节,“Optimizer Hints”。
这些操作需要RESOURCE_GROUP_ADMIN
或RESOURCE_GROUP_USER
特权。
资源组定义存储在resource_groups
数据字典表中,以便组在服务器重启后仍然存在。因为resource_groups
是数据字典的一部分,因此用户不能直接访问。资源组信息可以使用信息SchemaRESOURCE_GROUPS
表获取,该表实现为数据字典表的视图。见第28.3.26节,“The INFORMATION_SCHEMA RESOURCE_GROUPS Table”。
初始,RESOURCE_GROUPS
表中有这些行,描述了默认组:
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
The THREAD_PRIORITY
values are 0, indicating the default priority. The VCPU_IDS
values show a range comprising all available CPUs. For the default groups, the displayed value varies depending on the system on which the MySQL server runs.
Earlier discussion mentioned a scenario involving a resource group named Batch
to manage execution of batch jobs that need not execute with high priority. To create such a group, use a statement similar to this:
CREATE RESOURCE GROUP Batch
TYPE = USER
VCPU = 2-3 -- assumes a system with at least 4 CPUs
THREAD_PRIORITY = 10;
To verify that the resource group was created as expected, check the RESOURCE_GROUPS
table:
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
如果THREAD_PRIORITY
值为0,而不是10,请检查您的平台或系统配置是否限制了资源组的能力;见资源组限制。
要将线程分配到Batch
组中,请执行以下操作:
SET RESOURCE GROUP Batch FOR thread_id;
然后,在命名线程中执行的语句将使用Batch
组资源。
如果一个会话的当前线程应该在Batch
组中,请在会话中执行以下语句:
SET RESOURCE GROUP Batch;
然后,在会话中执行的语句将使用Batch
组资源。
要使用Batch
组执行单个语句,请使用RESOURCE_GROUP
优化器提示:
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
分配到Batch
组的线程将使用其资源,可以根据需要进行修改:
-
在系统高度负载时,减少分配给组的CPU数量,降低优先级或(如图所示)同时执行:
ALTER RESOURCE GROUP Batch VCPU = 3 THREAD_PRIORITY = 19;
-
在系统轻负载时,增加分配给组的CPU数量,提高优先级或(如图所示)同时执行:
ALTER RESOURCE GROUP Batch VCPU = 0-3 THREAD_PRIORITY = 0;
在某些平台或MySQL服务器配置中,资源组不可用或有限制:
-
资源组不可用,如果安装了线程池插件。
-
资源组不可用在macOS上,因为macOS没有为绑定CPU到线程提供API。
-
在FreeBSD和Solaris上,资源组线程优先级被忽略。 (实际上,所有线程都运行在优先级0上。) 尝试更改优先级将导致警告:
mysql> ALTER RESOURCE GROUP abc THREAD_PRIORITY = 10; Query OK, 0 rows affected, 1 warning (0.18 sec) mysql> SHOW WARNINGS; +---------+------+-------------------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------------------+ | Warning | 4560 | Attribute thread_priority is ignored (using default value). | +---------+------+-------------------------------------------------------------+
-
在Linux上,资源组线程优先级被忽略,除非设置了
CAP_SYS_NICE
能力。授予CAP_SYS_NICE
能力可以启用一系列权限;请参阅http://man7.org/linux/man-pages/man7/capabilities.7.html以获取完整列表。请小心启用此能力。在Linux平台上使用systemd和kernel支持 Ambient Capabilities(Linux 4.3或更高版本),启用
CAP_SYS_NICE
能力的推荐方法是修改MySQL服务文件,并保持mysqld二进制文件不变。要调整MySQL服务文件,请执行以下步骤:
-
运行适用于您的平台的命令:
-
Oracle Linux、Red Hat和Fedora系统:
$> sudo systemctl edit mysqld
-
SUSE、Ubuntu和Debian系统:
$> sudo systemctl edit mysql
-
-
使用编辑器,在服务文件中添加以下文本:
[Service] AmbientCapabilities=CAP_SYS_NICE
-
重新启动MySQL服务。
如果无法像前面所述启用
CAP_SYS_NICE
能力,可以使用setcap命令,指定mysqld可执行文件的路径名(需要sudo访问权限)。可以使用getcap检查能力。例如:$> sudo setcap cap_sys_nice+ep /path/to/mysqld $> getcap /path/to/mysqld /path/to/mysqld = cap_sys_nice+ep
出于安全考虑,限制mysqld可执行文件的执行权限,仅授予
root
用户和mysql
组成员:$> sudo chown root:mysql /path/to/mysqld $> sudo chmod 0750 /path/to/mysqld
Important如果需要手动使用setcap,则必须在每次重新安装后执行。
-
-
在 Windows 上,线程运行在五个线程优先级水平之一。资源组线程优先级范围从-20到19,映射到以下表中所示的级别。
表7.6 Windows 资源组线程优先级
Priority Range Windows Priority Level -20 to -10 THREAD_PRIORITY_HIGHEST
-9 to -1 THREAD_PRIORITY_ABOVE_NORMAL
0 THREAD_PRIORITY_NORMAL
1 to 10 THREAD_PRIORITY_BELOW_NORMAL
11 to 19 THREAD_PRIORITY_LOWEST