Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

7.1.16 资源组

MySQL 支持创建和管理资源组,并允许将服务器中的线程分配到特定的组中,以便线程根据组的可用资源执行。组属性启用对资源的控制,以启用或限制组中的线程的资源消耗。DBA 可以根据不同的工作负载修改这些属性。

目前,CPU 时间是一个可管理的资源,以“虚拟 CPU”概念表示,包括 CPU 核、超线程、硬件线程等。服务器在启动时确定可用的虚拟 CPU 数量,然后数据库管理员可以将这些 CPU 与资源组关联,并将线程分配到组中。

例如,要管理不需要高优先级执行的批处理作业,DBA 可以创建一个 批处理 资源组,并根据服务器的忙碌程度调整其优先级。(也许批处理作业在白天应该以较低的优先级运行,而在夜间以较高的优先级运行。)DBA 还可以调整组可用的 CPU 集合。组可以启用或禁用以控制线程是否可以分配到组中。

以下部分描述了 MySQL 中资源组的使用方面:

Important

在某些平台或 MySQL 服务器配置中,资源组不可用或有限制。特别是,Linux 系统可能需要手动步骤来启用某些安装方法。详细信息,请参阅 资源组限制

资源组元素

这些功能提供了 MySQL 中资源组管理的 SQL 接口:

  • SQL 语句启用创建、修改和删除资源组,并启用将线程分配到资源组。优化器提示启用将单个语句分配到资源组。

  • 资源组权限提供了对资源组操作的控制,以便确定哪些用户可以执行资源组操作。

  • 信息模式 RESOURCE_GROUPS 表公开了资源组定义的信息,并且性能模式 threads 表显示了每个线程的资源组分配。

  • 状态变量提供了每个管理 SQL 语句的执行计数。

资源组属性

资源组具有定义组的属性。所有属性可以在组创建时设置。一些属性在创建时固定,其他属性可以随时修改。

这些属性在资源组创建时定义并且不能修改:

  • 每个组都有一个名称。资源组名称是标识符,如表名和列名,除非它们包含特殊字符或是保留字,否则不需要在 SQL 语句中引号。组名称不区分大小写,长度最多为 64 个字符。

  • 每个组都有一个类型,类型为 SYSTEMUSER。资源组类型影响了组可分配的优先级值范围,如后面所述。该属性与优先级值范围的差异使得系统线程可以被识别,以保护它们免受用户线程的 CPU 资源竞争。

    系统线程和用户线程对应于性能模式 threads 表中的背景线程和前台线程。

这些属性在资源组创建时定义并且可以随时修改:

  • CPU affinity virtual CPUs, CPUs. affinity CPUs.

  • thread priority threads -20 ( highest priority) 19 ( lowest priority). 0, system user groups.

    system groups user groups, system threads user threads:

    • system resource groups, -20 0.

    • user resource groups, 0 19.

  • group enabled disabled, threads enabled groups.

Resource

, system group user group, SYS_default USR_default. , .

system user , SYS_default USR_default.

, . , .

, :

, RESOURCE_GROUP_ADMIN privilege.

, :

, RESOURCE_GROUP_ADMIN RESOURCE_GROUP_USER privilege.

Resource group definitions are stored in the resource_groups data dictionary table so that groups persist across server restarts. Because resource_groups is part of the data dictionary, it is not directly accessible by users. Resource group information is available using the Information Schema RESOURCE_GROUPS table, which is implemented as a view on the data dictionary table. See Section 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

THREAD_PRIORITY 0, . VCPU_IDS , . , .

之前的讨论提到了一个场景,涉及到一个名为 Batch 的资源组,以管理不需要高优先级执行的批处理作业。要创建这样的组,使用类似于以下的语句:

CREATE RESOURCE GROUP Batch
  TYPE = USER
  VCPU = 2-3            -- assumes a system with at least 4 CPUs
  THREAD_PRIORITY = 10;

要验证资源组是否按预期创建,请检查 RESOURCE_GROUPS 表:

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;

资源组复制

资源组管理是本地的,发生在服务器上。资源组 SQL 语句和对 resource_groups 数据字典表的修改不会写入二进制日志,也不会被复制。

资源组限制

在某些平台或 MySQL 服务器配置中,资源组不可用或有限制:

  • 如果安装了线程池插件,资源组不可用。

  • 在 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 获取完整的列表。请在启用此功能时小心。

    在使用 systemd 和 Ambient Capabilities(Linux 4.3 或更高版本)的 Linux 平台上,启用 CAP_SYS_NICE 能力的推荐方法是修改 MySQL 服务文件,而不修改 mysqld 二进制文件。要调整 MySQL 服务文件,请按照以下步骤操作:

    1. 运行适合您平台的命令:

      • Oracle Linux、Red Hat 和 Fedora 系统:

        $> sudo systemctl edit mysqld
      • SUSE、Ubuntu 和 Debian 系统:

        $> sudo systemctl edit mysql
    2. 使用编辑器,添加以下文本到服务文件:

      [Service]
      AmbientCapabilities=CAP_SYS_NICE
    3. 重新启动 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 到 -10 最高线程优先级
    -9 到 -1 高于正常线程优先级
    0 正常线程优先级
    1 到 10 低于正常线程优先级
    11 到 19 最低线程优先级