控制 SQL Server 资源
虽然某些 SQL Server 或 Azure SQL 托管实例专用于单个应用程序的数据库,但任务关键型应用程序中经常会出现的配置,但许多服务器支持具有不同性能要求和峰值工作负荷周期的多个应用程序的数据库。 平衡这些不同要求对于管理员来说可能很困难。 管理服务器资源的一种有效方法是使用 SQL Server 2008 中引入的资源调控器。
#B0 资源调控器 #C1 是 SQL Server 和 Azure SQL 托管实例中的一项功能,允许对传入应用程序请求的 CPU、物理 I/O 和内存资源进行精细控制。 在实例级别启用时,Resource Governor 使用分类器函数定义连接处理方式,将会话细分为工作负荷组。 每个工作负载组都配置为使用特定的系统资源池。
资源池
资源池表示服务器上可用的物理资源。 SQL Server 始终有两个池:默认池和内部池,即使资源调控器未启用也是如此。 内部池是为关键 SQL Server 函数保留的,不能限制。 可以配置默认池以及显式定义的任何资源池,并限制他们可以使用的资源。 对于每个非内部池,可以指定以下限制:
- 最小/最大 CPU 百分比
- CPU 百分比上限
- 最小/最大内存百分比
- Numa 节点相关性
- 每卷最小/最大 IOP
注意
对资源池的更改只会影响新会话,而不会影响正在进行的会话。 因此,修改池不会限制长时间运行的进程的资源。 此规则的例外是与 SQL Server 机器学习服务一起使用的外部池,即使持续会话也会受到池更改的限制。
除最小和最大 CPU 百分比之外的所有资源池设置都表示不能超过的硬限制。 最小/最大 CPU 百分比仅在存在 CPU 争用时适用。 例如,如果最多设置 70 个%,则当不存在争用时,工作负荷最多可以使用 100% 个可用 CPU 周期。 但是,如果其他工作负荷正在运行,则工作负荷将限制为 70%。
工作负荷组
工作负荷组充当会话请求的容器,由分类器函数分类。 与资源池类似,有两个内置组:默认组和内部组。 每个工作负荷组都与单个资源池相关联,但资源池可以托管多个工作负荷组。 默认情况下,所有连接都定向到默认工作负荷组,除非分类器函数将它们分配给用户定义的组。 默认工作负荷组利用分配给默认资源池的资源。
分类器函数
分类器函数在与 SQL Server 实例建立连接时运行,并将每个连接归入给定的工作负载组。 如果函数返回 NULL、默认值或不存在的工作负荷组的名称,会话将传输到默认工作负荷组。 因为分类器在每个连接上都运行,所以应该对其进行测试以提高效率。 下图显示了一个示例分类器函数,该函数根据用户的用户名对用户进行分类。
CREATE FUNCTION dbo.RGClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup AS SYSNAME
IF(SUSER_NAME() = 'ReportUser')
SET @WorkloadGroup = 'ReportServerGroup'
ELSE IF (SUSER_NAME() = 'PrimaryUser')
SET @WorkloadGroup = 'PrimaryServerGroup'
ELSE
SET @WorkloadGroup = 'default'
RETURN @WorkloadGroup
END
可以增加示例中显示的函数定义的复杂性,但应验证更复杂的函数是否不会影响用户性能。
Resource Governor 用例
资源调控器主要用于多租户方案中,其中一组数据库共享单个 SQL Server 实例,并且需要为服务器的所有用户保持一致性能。 还可以使用 Resource Governor 来限制维护操作(如一致性检查和索引重新生成)使用的资源,以确保在维护时段有足够的资源可供用户用于查询。