MySQL支持创建和管理资源组,并允许将服务器中运行的线程分配给特定的组,以便根据组中可用的资源执行线程。组属性允许对其资源进行控制,以启用或限制组中的线程使用资源。dba可以根据不同的工作负载适当地修改这些属性。
目前,CPU时间是一种可管理的资源,用的概念表示”虚拟CPU”作为一个术语,它包括CPU内核、超线程、硬件线程等等。服务器在启动时确定有多少虚拟cpu可用,具有适当权限的数据库管理员可以将这些cpu与资源组关联,并为组分配线程。
例如,要管理不需要以高优先级执行的批处理作业的执行,DBA可以创建一个批处理
资源组,并根据服务器的繁忙程度上下调整其优先级。(也许分配给组的批作业应该在白天以较低的优先级运行,在夜间以较高的优先级运行。)DBA还可以调整组可用的cpu集。可以启用或禁用组,以控制是否可将线程分配给组。
下面的章节描述了MySQL中使用资源组的各个方面:
在某些平台或MySQL服务器配置中,资源组不可用或有限制。特别是,Linux系统的某些安装方法可能需要手动步骤。有关详细信息,请参见资源组的限制.
这些功能为MySQL中的资源组管理提供了SQL接口:
SQL语句支持创建、修改和删除资源组,并支持为资源组分配线程。优化器提示允许将单个语句分配给资源组。
资源组特权提供了对哪些用户可以执行资源组操作的控制。
的
INFORMATION_SCHEMA。RESOURCE_GROUPS
表公开有关资源组定义和性能架构的信息线程
表显示了每个线程的资源组分配。状态变量为每个管理SQL语句提供执行计数。
资源组具有定义该组的属性。所有属性都可以在创建组时设置。有些属性在创建时是固定的;其他的可以在以后的任何时间进行修改。
这些属性在创建资源组时定义,不可修改:
每个组都有一个名字。资源组名是类似于表名和列名的标识符,在SQL语句中不需要引用,除非它们包含特殊字符或保留字。组名不区分大小写,最长可达64个字符。
每个组都有一个类型,是
系统
或用户
.资源组类型影响可分配给组的优先级值的范围,稍后将对此进行描述。这个属性加上允许的优先级的差异,可以标识系统线程,从而保护它们不与用户线程争夺CPU资源。系统线程和用户线程对应于性能模式中列出的后台线程和前台线程
线程
表格
这些属性在资源组创建时定义,之后可以随时修改:
CPU亲和性是资源组可以使用的虚拟CPU集。亲和性可以是可用cpu的任何非空子集。如果一个组没有亲和性,它可以使用所有可用的cpu。
线程优先级是分配给资源组的线程的执行优先级。优先级值的范围为-20(最高优先级)到19(最低优先级)。系统和用户组的默认优先级都是0。
允许系统组的优先级高于用户组,确保用户线程的优先级永远不会高于系统线程:
对于系统资源组,允许的优先级范围为-20 ~ 0。
对于用户资源组,允许的优先级范围为0 ~ 19。
每个组都可以启用或禁用,使管理员可以控制线程分配。线程只能分配给已启用的组。
缺省情况下,有一个系统组和一个用户组,组名为SYS_default
而且USR_default
,分别。不能删除这些默认组,也不能修改它们的属性。每个默认组没有CPU亲和力,优先级为0。
对象分配新创建的系统和用户线程SYS_default
而且USR_default
组,分别。
对于自定义资源组,所有属性在创建组时分配。创建组后,可以修改组的属性(名称和类型属性除外)。
要创建和管理用户定义的资源组,可以使用以下SQL语句:
创建资源组
创建一个新组。看到第13.7.2.2节“创建资源组语句”.降低资源组
删除一个现有的组。看到第13.7.2.3节“DROP RESOURCE GROUP Statement”.
这些声明要求RESOURCE_GROUP_ADMIN
特权。
要管理资源组分配,请使用以下功能:
的
RESOURCE_GROUP
优化器提示将单个语句分配给一个组。看到第8.9.3节,“优化器提示”.
这些操作需要RESOURCE_GROUP_ADMIN
或RESOURCE_GROUP_USER
特权。
资源组定义存储在resource_groups
数据字典表,使组在服务器重新启动时保持不变。因为resource_groups
是数据字典的一部分,它不能被用户直接访问。资源组信息可通过INFORMATION_SCHEMA。RESOURCE_GROUPS
表,它被实现为数据字典表上的一个视图。看到第26.3.26节“信息模式资源组表”.
最初,RESOURCE_GROUPS
表中有描述默认组的行:
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服务器运行的系统不同,显示的值也不同。
前面的讨论提到了一个涉及名为批处理
管理不需要以高优先级执行的批处理作业的执行。要创建这样一个组,使用类似这样的语句:
CREATE RESOURCE GROUP Batch TYPE = USER VCPU = 2-3——假设系统至少有4个cpu;
要验证资源组是否按预期创建,请检查RESOURCE_GROUPS
表:
SELECT * FROM INFORMATION_SCHEMA。RESOURCE_GROUPSWHERE 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,检查您的平台或系统配置是否限制了资源组的能力;看到资源组的限制.
对象分配一个线程批处理
这样做:
设置资源组批量用于thread_id;
然后,执行指定线程中的语句批处理
集团资源。
如果会话自己的当前线程应该在批处理
组,在会话中执行以下语句:
设置资源组批处理;
之后,会话中的语句用批处理
集团资源。
方法执行单个语句批处理
组,使用RESOURCE_GROUP
优化器提示:
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
分配给批处理
组执行和它的资源,可以根据需要修改:
对于系统负载高的时候,减少分配给组的cpu数量,降低其优先级,或者(如图所示)两者同时进行:
修改VCPU = 3 THREAD_PRIORITY = 19;
对于系统负载较轻的情况,增加分配给组的cpu数量,提高其优先级,或者(如图所示)两者都增加:
修改资源组VCPU = 0-3 THREAD_PRIORITY = 0;
在某些平台或MySQL服务器配置中,资源组不可用或有限制:
如果安装了线程池插件,则资源组不可用。
资源组在macOS上不可用,macOS没有提供将cpu绑定到线程的API。
在FreeBSD和Solaris上,资源组线程优先级被忽略。(实际上,所有线程都以0优先级运行。)尝试更改优先级会导致警告:
修改资源组的THREAD_PRIORITY = 10;查询OK, 0 rows affected, 1 warning (0.18 sec) mysql> SHOW WARNINGS;+---------+------+-------------------------------------------------------------+ | 水平| |消息代码 | +---------+------+-------------------------------------------------------------+ | 忽略警告| 4560 |属性thread_priority(使用默认值)。| +---------+------+-------------------------------------------------------------+
在Linux上,资源组线程优先级被忽略,除非
CAP_SYS_NICE
功能设置。授予CAP_SYS_NICE
流程的能力支持一系列特权;咨询http://man7.org/linux/man-pages/man7/capabilities.7.html查看完整列表。启用此功能时请谨慎。在使用systemd和内核支持Ambient capability (Linux 4.3或更新版本)的Linux平台上,推荐的启用方式
CAP_SYS_NICE
功能是修改MySQL服务文件并离开mysqld二进制文件修改的。调整MySQL服务文件的操作步骤如下:为您的平台运行适当的命令:
Oracle Linux、Red Hat和Fedora系统:
Shell > sudo systemctl edit mysqld
SUSE、Ubuntu和Debian系统:
Shell > sudo systemctl编辑mysql
使用编辑器,在服务文件中添加以下文本:
[服务]AmbientCapabilities = CAP_SYS_NICE
重新启动MySQL服务。
如果无法启用
CAP_SYS_NICE
方法可以手动设置它setcap命令,指定路径名mysqld可执行(这需要sudo访问)。您可以使用getcap.例如:Shell > sudo setcap cap_sys_nice+ep/ / mysqld /路径壳> getcap/ / mysqld /路径/ / mysqld /路径= cap_sys_nice + ep
作为一种安全措施,限制执行mysqld二进制的
根
用户和具有mysql
组成员:Shell > sudo chown root:mysql/ / mysqld /路径Shell > sudo chmod 0750/ / mysqld /路径
重要的如果手动使用setcap,它必须在每次重新安装后执行。
在Windows上,线程运行在五个线程优先级级别中的一个。资源组线程优先级范围-20到19映射到下表中所示的级别。
表5.5 Windows上的资源组线程优先级
优先考虑的范围 Windows优先级 -20年到-10年 THREAD_PRIORITY_HIGHEST
9比1 THREAD_PRIORITY_ABOVE_NORMAL
0 THREAD_PRIORITY_NORMAL
1到10 THREAD_PRIORITY_BELOW_NORMAL
11到19 THREAD_PRIORITY_LOWEST