在 SQL Server 资源调控器中,资源池表示数据库引擎实例的物理资源的子集。 利用资源调控器,可以指定传入应用程序请求可在资源池中使用的 CPU、物理 IO 和内存量限制。 每个资源池可以包含一个或多个工作负荷组。 启动会话时,Resource Governor 分类器会将会话分配给特定的工作负荷组,并且会话必须使用分配给工作负荷组的资源运行。
资源池概念
资源池,或简称池,表示服务器的物理资源。 可以将池视为 SQL Server 实例内的虚拟 SQL Server 实例。 池有两个部分。 一个部分不与其他池重叠,这可实现最低资源预留。 另一部分与其他池共享,该池支持尽可能多的资源消耗。 池资源通过为每个资源指定以下一个或多个设置来定义(CPU、内存和物理 IO):
MIN_CPU_PERCENT和MAX_CPU_PERCENT
当存在 CPU 争用时,这些设置是资源池中所有请求的最小和最大保证的平均 CPU 带宽。 可以使用这些设置为基于每个工作负荷需求的多个工作负荷建立可预测的 CPU 资源使用情况。 例如,假设公司中的销售和营销部门共享同一数据库。 销售部门具有具有高优先级查询的 CPU 密集型工作负荷。 营销部门也有 CPU 密集型工作负荷,但查询优先级较低。 通过为每个部门创建单独的资源池,可以为销售资源池分配 最低 CPU 百分比 70,营销资源池 的最大 CPU 百分比为 30。 这可确保销售工作负荷接收所需的 CPU 资源,并且营销工作负荷与销售工作负荷的 CPU 需求隔离。 请注意,最大 CPU 百分比是根据情况而定的最大值。 如果有可用的 CPU 容量,则工作负荷将使用它高达 100%。 仅当存在 CPU 资源的争用时,最大值才适用。 在此示例中,如果“销售”工作负荷已关闭,则营销工作负荷可以根据需要使用 100% 的 CPU。
CAP_CPU_PERCENT
对于资源池中的所有请求,此设置是 CPU 带宽的硬上限限制。 如果 CPU 容量可用,与池关联的工作负荷可以使用高于 MAX_CPU_PERCENT 的 CPU 容量,但不能超过 CAP_CPU_PERCENT 的值。 使用上面的示例,假设营销部门正在为其资源使用情况付费。 他们希望可预测的计费,并且不想支付超过 30% 的 CPU 费用。 这可以通过将营销资源池的CAP_CPU_PERCENT设置为 30 来实现。
MIN_MEMORY_PERCENT和MAX_MEMORY_PERCENT
这些设置是无法与其他资源池共享的资源池保留的最小和最大内存量。 此处引用的内存是查询执行授予内存,而不是缓冲池内存(例如,数据和索引页)。 为池设置最小内存值意味着确保指定的内存百分比可用于可能在此资源池中运行的任何请求。 与MIN_CPU_PERCENT相比,这是一个重要的区别,因为在这种情况下,即使池中没有属于此池的工作负荷组中的任何请求,内存也可能保留在给定的资源池中。 因此,使用此设置时要非常小心,因为即使没有活动请求,此内存也不会可供任何其他池使用。 为池设置最大内存值意味着当请求在此池中运行时,它们永远不会获得超过此总内存百分比。
亲和力
通过此设置,可将资源池关联到一个或多个计划程序或 NUMA 节点,以更好地隔离 CPU 资源。 使用上述销售和营销方案,假设销售部门需要更隔离的环境,并且希望随时拥有 100% 的 CPU 核心。 通过使用 AFFINITY 选项,可以在不同的 CPU 上计划销售和市场营销工作负荷。 假设"营销"池上的CAP_CPU_PERCENT仍然存在,则"营销"工作负载将继续使用最多30%的一个核心,而"销售"工作负载使用100%的另一个核心。 就销售和营销工作负荷而言,它们正在两台独立计算机上运行。
MIN_IOPS_PER_VOLUME和MAX_IOPS_PER_VOLUME
这些设置是资源池的每个磁盘卷每秒最小和最大物理 IO操作次数(IOPS)。 可以使用这些设置来控制为给定资源池的用户线程颁发的物理 IO。 例如,销售部门以大型批次生成多个月末报表。 这些批处理中的查询可以生成 IO,这些 IO 可以饱和磁盘卷,并影响数据库中其他更高优先级工作负荷的性能。 为了隔离这一工作负荷,将 MIN_IOPS_PER_VOLUME 设置为 20,并将销售部门资源池的 MAX_IOPS_PER_VOLUME 设置为 100,以控制工作负荷可发出的 IO 级别。
配置 CPU 或内存时,所有池中的 MIN 值总和不能超过服务器资源的 100%。 此外,配置 CPU 或内存时,可以在 MIN 到 100%(含 100%)范围内的任何位置设置 MAX 和 CAP 值。
如果池定义了非零 MIN,则会重新调整其他池的有效 MAX 值。 池配置的 MAX 值和其他池的 MIN 值之和从 100% 中减去。
下表说明了前面的一些概念。 该表显示内部池、默认池和两个用户定义的池的设置。 以下公式用于计算有效的 MAX% 和共享 %。
Min(X,Y)表示 X 和 Y 的较小值。
Sum(X) 表示所有池中的值 X 的总和。
共享总 % = 100 - sum(MIN %)。
有效 MAX % = min(X,Y)。
共享 % = 有效 MAX % - MIN %。
| 池名称 | MIN % 设置 | MAX % 的设置 | 算出的有效 MAX % | 计算共享 % | 注释 |
|---|---|---|---|---|---|
| 内部 | 0 | 100 | 100 | 0 | 有效的 MAX% 和共享% 不适用于内部资源池。 |
| 默认 | 0 | 100 | 30 | 30 | 有效 MAX 值计算为:min(100,100-(20+50)) = 30。 计算的共享 % 的有效值是 MAX - MIN = 30。 |
| 池 1 | 20 | 100 | 50 | 30 | 有效 MAX 值计算为:min(100,100-50) = 50。 共享计算结果 % 是有效的最大值 - 最小值 = 30。 |
| 池 2 | 50 | 70 | 70 | 20 | 有效 MAX 值计算为:min(70,100-20) = 70。 计算出的共享%是有效的最大值减去最小值,结果为20。 |
以上表为例,我们可以进一步说明创建另一个池时发生的调整。 此池为池 3,最小 % 设置为 5。
| 池名称 | MIN % 设定值 | MAX % 设置 | 计算的有效最大 % | 计算共享 % | 注释 |
|---|---|---|---|---|---|
| 内部 | 0 | 100 | 100 | 0 | 有效的 MAX % 和共享 % 不适用于内部池。 |
| 默认 | 0 | 100 | 二十五 | 二十五 | 有效 MAX 值计算为:min(100,100-(20+50+5)) = 25。 计算得出的共享值 % 的有效最大值 - 最小值为 25。 |
| 池 1 | 20 | 100 | 45 | 二十五 | 有效 MAX 值计算为:min(100,100-55) = 45。 计算的共享 % 为有效值,公式为 MAX - MIN = 25。 |
| 池 2 | 50 | 70 | 70 | 20 | 有效 MAX 值计算为:min(70,100-25) = 70。 经过计算,共享 % 的有效值为 MAX - MIN = 20。 |
| 池 3 | 5 | 100 | 30 | 二十五 | 有效 MAX 值计算为:min(100,100-70) = 30。 计算所得的共享 % 的有效性是 MAX - MIN = 25。 |
池的共享部分用于指示当资源可用时,资源可以去的地方。 但是,当资源被使用时,它们会转到指定的池,并且不会共享。 如果在某个池中没有请求,而且配置给该池的资源可以被释放给其他池,那么这可能会提高资源利用率。
池配置的一些极端情况包括:
各个池都指定最小值,总和表示服务器资源的 100%。 在这种情况下,有效最大值等于最小值。 这相当于将服务器资源划分为彼此不重叠的部分,且不论资源在任何给定池中如何被使用。
所有池的最小值都为零。 所有池都争用可用资源,其最终大小基于每个池中的资源消耗。 其他因素(如策略)在调整最终池大小方面发挥了作用。
资源调控器预定义两个资源池,即内部池和默认池。
内部池
内部池表示 SQL Server 本身使用的资源。 此池始终仅包含内部组;这个池无法以任何方式修改。 内部池的资源消耗不受限制。 池中的任何工作负荷都被视为对服务器功能至关重要,资源调控器允许内部池对其他池施加压力,即使这意味着违反为其他池设置的限制。
注释
内部池和内部组资源使用情况不会从总体资源使用情况中减去。 百分比根据可用的总资源计算。
默认池
默认池是第一个预定义的用户池。 在任何配置之前,默认池仅包含默认组。 无法创建或删除默认池,但可以对其进行更改。 默认池除了包含默认组外,还可以包含用户定义的组。
注释
默认组是可更改的,但不能将其移出默认池。
User-Defined 资源池
用户定义的资源池是为环境中的特定工作负荷创建的。 资源调控器提供用于创建、更改和删除资源池的 DDL 语句。
资源池任务
| 任务说明 | 主题 |
|---|---|
| 介绍如何创建资源池。 | 创建资源池 |
| 介绍如何更改资源池设置。 | 更改资源池设置 |
| 介绍如何删除资源池。 | 删除资源池 |