Resource Governor 资源池

适用于:SQL ServerAzure SQL 托管实例

在资源调控器中,资源池表示数据库引擎实例的物理资源的子集。 通过资源调控器,可以指定应用程序请求可在资源池中使用的 CPU、物理 IO 和内存总量的限制。

每个资源池可以包含一个或多个 工作负荷组。 创建会话时,它将分类为特定的工作负荷组。 工作负载组策略治理在会话上执行的请求。 请求使用基础资源池中的资源。

资源池概念

资源池表示服务器的物理资源,例如 CPU、内存和 I/O。 根据配置,资源池中的资源可以保留或与其他池共享。 池配置是通过为每种资源类型(CPU、内存和物理 I/O)指定以下一个或多个设置来定义的:

MIN_CPU_PERCENT 和 MAX_CPU_PERCENT

当存在 CPU 争用时,这些设置定义资源池中所有请求的最小和最大保证的平均 CPU 带宽。 MIN_CPU_PERCENT 是资源池的 CPU 带宽预留,当存在争用时,其他池不能使用该带宽。 MAX_CPU_PERCENT 是池中 CPU 带宽的软限制。 仅当与其他池存在 CPU 争用时,才会强制实施此限制。

例如,假设公司中的销售和市场营销部门共享相同的 SQL Server 实例。 销售部门具有大量占用 CPU 的含高优先级查询的工作负荷。 市场营销部门也承担着 CPU 密集型的工作负荷,但查询的优先级较低。 通过为每个部门创建单独的资源池,可以为销售资源池分配 最低 CPU 百分比 40,营销资源池的最大 CPU 百分比为 30。 此配置可确保 Sales 工作负载接收所需的 CPU 资源,并且营销工作负荷不会影响销售工作负荷的 CPU 需求。

该最大 CPU 百分比是一种投机性质的最大值。 如果有可用的 CPU 容量,则请求会使用所有容量,最高为 100%。 仅当存在 CPU 资源的争用时,最大值才适用。 在上一个示例中,如果销售工作负荷未运行,则营销工作负荷可以根据需要使用 100% 的 CPU。

CAP_CPU_PERCENT

CAP_CPU_PERCENT 设置是一个将资源池中所有请求的 CPU 带宽设定为硬性限制的选项。 与池关联的工作负荷可以使用高于 MAX_CPU_PERCENT 值的 CPU 容量(如果可用),但不能超过 CAP_CPU_PERCENT的值。 根据上一部分的示例,假定正在针对营销部门的资源使用量对其收费。 营销部门希望可预测的计费并且不希望支付超过 30% 的 CPU。 可以通过将营销资源池的 CAP_CPU_PERCENT 设置为 30 来实现此目标。

MIN_MEMORY_PERCENT 和 MAX_MEMORY_PERCENT

这些设置是为此资源池保留的、不能与其他资源池共享的最小和最大内存量。

为池设置最小内存值将为在此资源池中执行的请求保留内存。 此设置不同于 MIN_CPU_PERCENT,因为即使在此池中的工作负荷组中没有请求,预留的内存也可能仍然保留在池中。 使用此设置时请小心,因为此内存无法由任何其他池使用,即使没有活动请求也是如此。 为某一资源池设置最大内存值意味着在该资源池中正在运行请求时,它们永远不会获得超过此总体内存百分比的内存。

对于没有 内存优化表的数据库,受 MIN_MEMORY_PERCENTMAX_MEMORY_PERCENT 控制的内存专门指的是查询工作区内存,即查询执行授予内存。 缓冲池内存(数据和索引页)始终在所有资源池之间共享,不受资源调控器保留或限制。 有关查询执行内存授予的详细信息,请参阅 内存授予注意事项。 有关将资源池与内存优化表配合使用的详细信息,请参阅 将具有 Memory-Optimized 表的数据库绑定到资源池

AFFINITY

通过此设置,您可以将某一资源池与一个或多个计划程序或 NUMA 节点相关联,以便实现更好的对 CPU 资源的隔离。 若要使用前面部分中的“销售和营销”方案,假设销售部门需要更隔离的环境,并且希望随时拥有 100% 的逻辑 CPU。 通过使用 AFFINITY 选项,可以在不同的逻辑 CPU 上计划销售和市场营销工作负荷。 假定指定了“营销”池上的 CAP_CPU_PERCENT,则营销工作负载将继续最多使用一个 CPU 的 30%,而销售工作负载将使用其他 CPU 的 100%。

MIN_IOPS_PER_VOLUME 和 MAX_IOPS_PER_VOLUME

这些设置是针对某一资源池的每个磁盘卷每秒的最小和最大物理 IO 操作数 (IOPS)。 可以使用这些设置控制由某一给定资源池中的用户请求发出的物理 IO 数。 例如,销售部门在较大批次中生成若干月末报表。 这些批中的查询可以生成 IO,这些 IO 可以饱和磁盘卷,并影响同一 SQL Server 实例上其他更高优先级工作负荷的性能。 若要隔离此工作负荷,将销售部门资源池的 MIN_IOPS_PER_VOLUME 设置为 500,MAX_IOPS_PER_VOLUME 设置为 2,000。

系统和用户定义的资源池

资源调控器有两个内置资源池:internal 池和 default 池。 可以创建额外的用户定义池。

内部池

internal 池控制数据库引擎本身使用的资源。 此池始终仅包含 internal 组,并且无法以任何形式修改该池。 internal 池的资源消耗不受限制。 数据库引擎的正常运行依赖于池中的所有工作负载,这些工作负载都被视为关键。 资源调控器允许 internal 池向其他池施加压力,即使这意味着违反为其他池设置的限制。

注意

不会从总体资源用量中减去 internal 池和 internal 组资源用量。 使用可用的总体资源计算百分比。

默认池

最初,default 池仅包含 default 工作负载组。 无法创建或删除 default 池,但可以对其进行修改。 除了 default 组之外,default 池还可以包含用户定义的工作负荷组。 从 SQL Server 2016(13.x)开始,除了数据库引擎操作的 default 资源池之外,还有一个专门用于外部进程(例如执行 R 脚本)的 default 外部资源池。

注意

可以修改 default 组,但不能将其移出 default 池。

外部池

用户可以创建用于定义外部进程资源的外部池。 对于 R 服务,此池专门管理由这些服务生成的 rterm.exeBxlServer.exepython.exe及其他进程。 有关详细信息,请参阅 CREATE EXTERNAL RESOURCE POOL

用户定义的资源池

可以为环境中的特定工作负荷创建用户定义的资源池。 资源调控器提供用于创建、修改和删除资源池的 DDL 语句。 有关详细信息,请参阅 创建资源池删除资源池更改资源池设置

资源池之间的资源分配

配置 CPU 和内存限制和预留时,所有池中 MIN 值的总和不能超过服务器资源的 100%。 MAXCAP 值可以设置为 MIN 值和 100%(含)之间的任意值。

如果一个池通过指定非零 MIN 值来预留资源,其他池的有效 MAX 值可能会被减少。 将从 100% 中减去为某个池配置的 MAX 值的最小值以及其他池的 MIN 值之和。

下表说明了此概念。 在这些表中,LEAST(X, Y) 表示 XY的较小值。 所有数值都是百分比。

第一个表显示 internal 池、default 池和两个用户定义的池的设置。

池名称 MIN MAX Effective MAX Shared % 注释
internal 0 100 100 0 Effective MAXShared % 不适用于 internal 池。
default 0 100 30 30 Effective MAX = LEAST(100, 100 - (20 + 50)) = 30
Shared % = Effective MAX - MIN = 30
Pool 1 20 100 50 30 Effective MAX = LEAST(100, 100 - 50) = 50
Shared % = Effective MAX - MIN = 30
Pool 2 50 70 70 20 Effective MAX = LEAST(70, 100 - 20) = 70
Shared % = Effective MAX - MIN = 20

以上表为例,我们可以进一步说明创建另一个资源池时发生的调整。 此池命名为 Pool 3MIN 设置为 5。

池名称 MIN MAX Effective MAX Shared % 注释
internal 0 100 100 0 Effective MAXShared % 不适用于 internal 池。
default 0 100 25 25 Effective MAX = LEAST(100, 100 - (20 + 50 + 5)) = 25
Shared % = Effective MAX - MIN = 25
Pool 1 20 100 45 25 Effective MAX = LEAST(100, 100 - (50 + 5))) = 45
Shared % = Effective MAX - MIN = 25
Pool 2 50 70 70 20 Effective MAX = LEAST(70, 100 - (20 + 5))) = 70
Shared % = Effective MAX - MIN = 20
Pool 3 5 100 30 25 Effective MAX = LEAST(100, 100 - (50 + 20))) = 30
Shared % = Effective MAX - MIN = 25

池的共享部分是可用资源存在时可以转到的位置。 但是,在消耗资源时,资源流向指定的池,不能共享。 在给定池中没有请求并且未对该池保留的资源可以释放到其他池时,此行为能够提高资源使用率。

池配置的一些边缘案例包括:

  • 所有池定义的最小值的总计表示 100% 的服务器资源。 在这种情况下,有效最大值等于最小值。 这相当于将服务器资源划分为非重叠部分,而不管资源是如何在任何给定池内消耗的。
  • 所有池的最小值为零。 所有池共享并争用可用资源,其运行时大小基于每个池中的资源消耗。 其他因素(如工作负荷组策略)在调整池大小方面起着重要作用。

资源池任务

资源池可以管理各种系统资源。 有关详细信息,请参阅 CREATE RESOURCE POOL

有关更多示例和完整演练,请参阅 教程:资源调控器配置示例和最佳做法

任务说明 文章
创建资源池 创建资源池
修改资源池设置 更改资源池设置
删除资源池 删除资源池

资源调控器提供用于创建、修改和删除资源池的 DDL 语句。

有关详细信息,包括有关资源池预留和限制的详细信息,请参阅: