• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 资源组

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

    当前,CPU时间是一种可管理的资源,以“虚拟CPU ”的概念表示,该术语包括CPU内核,超线程,硬件线程等。服务器在启动时确定有多少个虚拟CPU可用,具有适当特权的数据库管理员可以将这些CPU与资源组关联,并为组分配线程。

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

    以下各节描述了MySQL中资源组使用的各个方面:

    • 资源组组件
    • 资源组属性
    • 资源组管理
    • 资源组复制
    • 资源组限制
    重要

    在某些平台或MySQL服务器配置上,资源组不可用或有限制。特别是,对于某些安装方法,Linux系统可能需要手动操作。有关详细信息,请参见资源组限制。

    资源组组件

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

    • SQL语句允许创建,更改和删除资源组,并允许将线程分配给资源组。通过优化程序提示,可以将单个语句分配给资源组。
    • 资源组特权提供对哪些用户可以执行资源组操作的控制。
    • INFORMATION_SCHEMA.RESOURCE_GROUPS表提供了有关资源组定义的信息,而“性能模式”threads表则显示了每个线程的资源组分配。
    • 状态变量提供每个管理SQL语句的执行计数。

    资源组属性

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

    这些属性是在资源组创建时定义的,无法修改:

    • 每个组都有一个名称。资源组名称是表和列名称之类的标识符,除非包含特殊字符或保留字,否则不需要在SQL语句中用引号引起来。组名不区分大小写,最长为64个字符。
    • 每个组的类型均为SYSTEMUSER。资源组类型会影响可分配给该组的优先级值的范围,如下所述。此属性与允许的优先级中的差异一起使系统线程得以识别,从而保护它们免受用户线程争用CPU资源。

      系统线程和用户线程与“性能模式”threads表中列出的后台线程和前台线程相对应。

    这些属性是在资源组创建时定义的,此后可以随时修改:

    • CPU相似性是资源组可以使用的虚拟CPU的集合。关联可以是可用CPU的任何非空子集。如果组没有亲缘关系,则它可以使用所有可用的CPU。
    • 线程优先级是分配给资源组的线程的执行优先级。优先级值的范围从-20(最高优先级)到19(最低优先级)。对于系统组和用户组,默认优先级均为0。

      允许系统组具有比用户组更高的优先级,从而确保用户线程永远不会比系统线程具有更高的优先级:

      • 对于系统资源组,允许的优先级范围是-20到0。
      • 对于用户资源组,允许的优先级范围是0到19。
    • 可以启用或禁用每个组,从而使管理员可以控制线程分配。线程只能分配给已启用的组。

    资源组管理

    默认情况下,有一个系统组和一个用户组,分别名为SYS_defaultUSR_default。这些默认组不能删除,其属性也不能修改。每个默认组均不具有CPU关联且优先级为0。

    新创建的系统线程和用户线程分别分配给SYS_defaultUSR_default组。

    对于用户定义的资源组,所有属性均在组创建时分配。创建组后,可以修改其属性,但名称和类型属性除外。

    要创建和管理用户定义的资源组,请使用以下SQL语句:

    • CREATE RESOURCE GROUP创建一个新组。请参见“ CREATE RESOURCE GROUP语句”。
    • ALTER RESOURCE GROUP修改现有组。请参见“ ALTER RESOURCE GROUP语句”。
    • DROP RESOURCE GROUP删除现有组。请参见“ DROP RESOURCE GROUP语句”。

    这些语句需要RESOURCE_GROUP_ADMIN特权。

    要管理资源组分配,请使用以下功能:

    • SET RESOURCE GROUP将线程分配给一个组。请参见“ SET RESOURCE GROUP语句”。
    • RESOURCE_GROUP优化程序提示指定单个语句的一组。请参见“优化器提示”。

    这些操作需要RESOURCE_GROUP_ADMINRESOURCE_GROUP_USER特权。

    资源组定义存储在resource_groups数据字典表中,以便组在服务器重新启动后持久存在。由于resource_groups它是数据字典的一部分,因此用户无法直接访问它。使用INFORMATION_SCHEMA.RESOURCE_GROUPS表可获得资源组信息,该表实现为数据字典表上的视图。请参见“ INFORMATION_SCHEMA RESOURCE_GROUPS表”。

    最初,该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值显示了一个包含所有可用CPU的范围。对于默认组,显示的值根据运行MySQL服务器的系统而有所不同。

    前面的讨论提到了一个场景,该场景涉及一个名为资源组的资源,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上不可用,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平台(Linux 4.3或更高版本)上,建议的启用CAP_SYS_NICE能力的方法是修改MySQL服务文件,并保持mysqld二进制不变。要为MySQL调整服务文件,请使用以下过程:

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

        • Oracle Linux,Red Hat和Fedora系统:

          shell>sudo systemctl edit mysqld
          
        • SUSE,Ubuntu和Debian系统:

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

        [Service]
        AmbientCapabilities=CAP_SYS_NICE
        
      3. 重新启动MySQL服务。

      如果您不能如上所述启用该CAP_SYS_NICE功能,则可以使用setcap命令手动设置该功能,并指定mysqld可执行文件的路径名(这需要sudo访问)。您可以使用getcap检查功能。例如:

      shell>sudo setcap cap_sys_nice	+ep /path/to/mysqld
      shell>getcap /path/to/mysqld
      /path/to/mysqld = cap_sys_nice	+ep
      

      为了安全起见,请将mysqld二进制文件的执行限制为该root用户和具有mysql组成员身份的用户:

      shell>sudo chown root:mysql /path/to/mysqld
      shell>sudo chmod 0750 /path/to/mysqld
      
      重要

      如果需要手动使用setcap,则必须在每次重新安装后执行。

    • 在Windows上,线程以五个线程优先级之一运行。下表列出了资源组线程优先级范围-20到19映射到那些级别。

      表8.3 Windows上的资源组线程优先级

      优先范围Windows优先级
      -20至-10THREAD_PRIORITY_HIGHEST
      -9至-1THREAD_PRIORITY_ABOVE_NORMAL
      0THREAD_PRIORITY_NORMAL
      1至10THREAD_PRIORITY_BELOW_NORMAL
      11至19THREAD_PRIORITY_LOWEST