原文:配置SQL Server 2008的资源调控器实现负载均衡
转自:http://www.ithov.com/server/93267.shtml
1、为什么引入“资源调控器”?
在SQL Server 2008之前,数据库引擎曾尝试为所有并发用户提供均衡的性能,这使我们几乎无法控制分配给用户或工作负载的优先级,而且随着并发登录的增加会雪上加霜。“资源调控器”有助于防止性能问题,并识别正在使用的应用程序。“资源调控器”可以控制分配给会话的CPU和内存,并进一步设置应用程序能够使用的最大和最小的CPU百分比和内存,以及允许的最大并行度。尽管资源调控器目前还有一些不足之处,但它对于处理许多常见的资源问题已经足够了。
2、创建“资源池”
配置“资源调控器”是从创建“资源池”开始的。在SQL Server 2008中使用CREATE RESOURCE pool命令来创建资源池,从而通过它来分配会话,并设置其占用系统资源的最大和最小百分比。
比如使用下面命令以根据CPU百分比限制来创建3个资源池:
CREATE RESOURCE pool LowPriorityAppspool WITH (MAX_CPU_PERCENT = 20); CREATE RESOURCE pool MediumPriorityAppspool WITH (MAX_CPU_PERCENT = 60); CREATE RESOURCE pool HighPriorityAppspool WITH (MAX_CPU_PERCENT = 100);
这些命令中使用的CPU百分比不是硬性限制。例如,如果操作系统上只有一个低优先级应用程序在运行,那么它将能够使用整个CPU。基于CPU百分比的资源调控只有在并行需求重叠时才会发挥作用。
另外,在“资源调控器”中,最多可以建立2O个资源池,其中18个可以进行配置。在另外两个资源池中,一个分配给内部进程,如清理类操作;另一个供没有分配给其它池的会话使用的默认池。因此,不应过早创建太多资源池,应该谨慎考虑哪些池是必要的。
3、创建工作负载组
对现有资源进行分组以后,我们需要创建创建工作负载组以实现对分配给这些资源池的应用程序分组。在SQL Server 2008中使用CREATE WORKLOAD GROUP命令创建工作负载组。
下面列举几个CREATE WORKLOAD GROUP命令应用实例:
CREATE WORKLOAD GROUP UnidentnifiedApplications USING LowPriorityAppspool; CREATE WORKLOAD GROUP WellBehavedAccessApplications USING MediumPriorityAppspool; CREATE WORKLOAD GROUP PoorlyBehavedAccessApplications USING LowPriorityAppspool; CREATE WORKLOAD GROUP WellBehavedExcelApplications USING MediumPriorityAppspool; CREATE WORKLOAD GROUP CriticalCorporateApplications USING HighPriorityAppspool;
上面实例我们创建了5个工作负载组,它们被分配给3个资源池。Access和Excel应用程序被分配给不同的资源池,这样,我们可以在未来根据一个资源池对分配给另一个资源池的资源进行更改。为性能较差的Access应用程序和无法识别的其它应用程序分配较少的资源。我们为已经识别的对工作至关重要的应用程分配具有最高的资源分配的优先级。
4、查看“资源调控器”配置
创建了工作负载组并将其分配给资源池以后,它们不会立即开始工作。要确定还需要进行什么配置才能使“资源调控器”正常运行,可以查看当前的“资源调控器”配置,这些信息在一个新的动态管理视图中显示。
(1).查看“资源调控器”配置信息
执行命令:
SELECT * FROM sys.dm_resource_governor_configuration;
命令执行完毕就会输出“资源调控器”的配置信息。需要注意的是:此输出信息是在SQL Server Management Studio(SSMS)的Results选项卡中显示的。最左边一列显示的值1是输出的行号。
此输出信息告诉我们两个信息:
第一、is_reconfiguration_pending标记表示在你所做的更改生效之前,需要执行命令:ALTER RESOURCE GOVERNOR RECONFIGURE。运行这条命令之后,is_reconfiguration_pending的值就变成0。
第二、classifier_function_id的值为0,表示没有分配分类器函数。分类器函数用于决定一个会话应该放在哪个工作负载组中。
(2).查看资源池配置信息
执行下面的命令来查看资源池配置:
SELECT * FROM sys.dm_resource_governor_resource_pools;
命令执行完毕后会看到资源池的相关信息。需要注意的是:,在执行重新配置命令之前,这个输出信息中只显示内部资源池和默认资源池。
可以使用下面这个命令查看工作负载池配置:
SELECT * FROM sys.dm_resource_governor_workload_groups;
5、应用程序实现分类
配置“资源调控器”的最后一步是确定想要控制的会话。这可以利用分类器函数来实现,分类器将会话分配给特定的工作负载组。
(1).应用APP_NAME()函数分类
分类器函数必须返回一个SYSNAME类型的值,这个值当前是NVARCHAR(128)的别称。对于本文来说,我们根据应用程序名称函数(APP_NAME())来决定会话应该归入哪一个工作负载组,这个函数返回应用程序的连接字符串中指定的值。笔者特别喜欢选择这个选项,因为它支持对正在运行的应用程序进行分类,在对会话进行分类时还有其它几个选项可供选择我们后面再说。
构建应用程序时通常不会在连接字符串中指定应用程序名称,但把应用程序名称添加到连接字符串或在应用程序配置文件中指定该值是很重要的。这种方法在“资源调控器”之外也很有用,因为应用程序名称会出现在SQL Server Profiler创建的跟踪记录中,能够用来筛选跟踪记录中的事件。通过连接字符串访问应用程序名称也有助于在隔离与应用程序相关的问题时跟踪对SQL Server的访问。不过,有些设计不太好的应用程序具有硬编码的连接字符串,这时它们不适合使用这种方法。硬编码连接字符串是一种应该避免的做法。
在使用中笔者还发现,按名称对应用程序进行分类是识别连接服务器的未知应用程序的一个好的起点。在这种情况下,“资源调控器”的好处在于,未知应用程序将被放在低优先级的资源池里,随后我们能够快速识别正在使用的应用程序。这项功能可帮助你确定谁正在使用你的系统。
(2).其他分类函数和属性
除了使用APP_NAME()函数可进行会话分类外,也可以使用许多其它函数来实现,比如HOST_NAME()、SUSER_NAME()、SUSER_SNAME()、IS_SRVROLEMEMBER()和IS_MEMBER()。
如果决定使用HOST_NAME()或APP_NAME()作为分级器函数,一定要注意用户可能更改这些函数。不过在实际中,笔者发现APP_NAME()很好用。
此外,在决定如何分类时,还可以使用一些属性。L0GINPROPERTY()函数现在包含两个可在分类函数中使用的属性(DefaultDatabase和DefauItLanguage)。而且L0GINPROPERTY()函数提供了对连接所用网络协议的访问,还支持访问验证方案、本地IP地址、TCP端口和客户端IP地址。ORIGINAL_DB_NAME()函数也很有用,因为它可以返回会话在首次连接时提供的数据库名称,而不是默认数据库。这些属性支持基于任何这类值进行分类。例如,可以基于用户通常使用的数据库把连接分配给工作负载组。
(3).分类前必要的测试
在使用分类器函数之前对其进行测试是很重要的,否则系统可能无响应。例如,可以在SSMS中执行以下命令来测试APP_NAME()分类器函数:
SELECT APP_NAME();
因为分类器函数无法识别SSMS,因此执行命令:
SELECT dbo.UserClassifier();
如果不修改分类器函数而直接启用它,SSMS将在低优先级应用程序资源池中运行。也可以使用分类器函数在数据库表中查找工作负载组名称,而不是将所有应用程序名称硬编码到该函数中。通常,在访问数据库表来查找工作负载组时,性能不会受到太大影响,因为数据库表不会很大,能够被快速缓存,并且只有在建立连接之后才能使用该函数制定分类决策。
现在可以使用以下命令实现分类器函数:
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.UserCIassifier);
然后必须重新配置“资源调控器”,使挂起的配置生效。这可以使用以下命令来完成:
ALTER RESOURCE GOVERNOR RECONFIGURE;
至此,“资源调控器”配置就完成了。然后需要确保“资源调控器”能够按预期工作。如果未对分类器函数进行良好的测试,系统可能不会响应新的登录操作,可能需要使用专用管理员连接(DAC)来获取对SQL Server的访问。如果还没有配置DAC,可以以单用户模式重启服务器。在以单用户模式运行时,连接不会受到“资源调控器”约束,因此可以禁用资源调控器,直到问题修复。
(4).改变分类器函数的注意事项
如果需要改变分类器函数,必须首先禁用“资源调控器”,因为无法在“资源调控器”正在运行时对其进行更改。可以运行以下命令来禁用当前的分类器函数:
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
需要注意的是:“资源调控器”更改应该由组织中最资深的DBA(数据库管理员)来执行,以免由于错误配置“资源调控器”而引起问题。
6、监控和配置资源的其它技术
除了“资源调控器”,我们也可以通过系统监控(perfmon exe)工具来监控SQL Server分配的CPU资源。当添加想要监控的计数器时,SQL Server:Resource pool Stats对象会显示已配置的每个资源池的实例。
一些类似的与实例相关的选择已被添加到SQL Server:Workload Group Stats计数器,相关的值也可通过查询sys.dm_os_performance_counters视图获得。
为了进行更仔细的监控,SQL Server中还添加了其它一些事件,包括CPU Threshold Exceeded、PreConnectStarting和PreConnect:Completed事件。如果想要使用.NET代码以编程方式控制“资源调控器”,可以使用已经添加到SQL Server Management Objects(SMO)中的ResourceGovernor类。
通常情况下,我们比较关注配置资源池时最大的CPU百分比,因为必须非常谨慎地配置最小百分比。如果将最小值配置得太高,很容易过度限制系统的资源利用率,尤其是内存的最小百分比不宜过高。
总结:
需要说明的是,我们并不能利用“资源调控器”及时降低刚发现的严重影响系统性能的查询的优先级,因为在连接会话时,工作负载组和资源池就已经分配完成。所以,在配置“资源调控器”前做好统筹安排是非常必要的。虽然“资源调控器”并不是尽善尽美,但对于DBA任不失为一个实现资源的负载均衡的利器。