原文:配置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任不失为一个实现资源的负载均衡的利器。

配置SQL Server 2008的资源调控器实现负载均衡的更多相关文章

  1. 配置SQL Server 2008服务器

    怎么配置SQL Server 2008服务器_百度经验 http://jingyan.baidu.com/article/9faa7231a922c1473c28cb23.html 1.验证安装是否成 ...

  2. 配置SQL Server 2008 R2 Reporting Services

    记录如何在本地配置SQL Server 2008 R2 Reporting Services,笔者环境为Windows 7 64位 + SQL Server 2008 R2 一.准备工作 其实准备工作 ...

  3. 配置SQL Server 2008管理器

    SQl Server 配置管理器(简称为配置管理器)包含了SQL Server 2008服务.SQL Server 2008网络配置和SQL Native Client配置3个工具,供数据库管理人员做 ...

  4. 配置 SQL Server 2008 Email 发送以及 Job 的 Notification通知功能

    SQL Server 2008配置邮件的过程就不写了,网上的案例太多了. http://www.cnblogs.com/woodytu/p/5154526.html 这个案例就不错. 主要写下配置完后 ...

  5. SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

    之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了.windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向 ...

  6. SQL Server 2014里的IO资源调控器

    在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...

  7. 配置MyEclipse+Hibernate连接Sql Server 2008出错

    下文主要是讲述最近配置MyEclipse连接Sql Server 2008时遇到的一个问题,而不关注如何配置Sql Server 2008支持TCP/IP连接.Hibernate如何操作Sql Ser ...

  8. SQL Server 2008 事件探查器(SQL SERVER Profiler)

    要想很好地优化ERP系统,可以从客户端.服务器.网络等入手,对于我们M1系统的优化来说,SQL 语句的优化就起到很重要的作用了.为此,我们展开,学习了SQL SERVER 2008的事件探查器(SQL ...

  9. Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be

    Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be   今天在其他电脑配置 SQl server 2008 R2,安装完成后,发现打开配置管理工具服务 : ...

随机推荐

  1. java 通过sftp服务器上传下载删除文件

    最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; imp ...

  2. python关于for循环的几个函数

    1.enumerate:返回2个值,1是当前的for循环的第几轮,2是循环得到的数值 enumerate works by supplying a corresponding index to eac ...

  3. STL源代码分析——STL算法remove删除算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...

  4. 判断DAG图

    拓扑排序O(E), bellman O(VE)   , 使用邻接表的dfs O(V+E) ,floyd O(N*N*N) bellman算法只能判断是否存在负环. 所以可以先把权值全部设为-1 #in ...

  5. Android asynctask使用

    继承asynctask,有三个參数 三个參数的含义是第一个表示输入參数.第二个为progress,表示当前的进度,第三个为doInbackground    返回值 须要一个參数传入url,返回一个r ...

  6. 数据验证validator 与 DWZ

    在进行系统经常使用的数据验证.数据验证可以编写自己的,它也可以用来作为现在.现在,记录这两个库的使用, validator <!DOCTYPE HTML PUBLIC "-//W3C/ ...

  7. svn 使用(一个)

    一个. 安装svn  server(操作系统centos) yum install subversion 通过 subversion -v 如果成功安装命令来查看 温馨提示不承担任何subversio ...

  8. simpleDateFormat日期格式转换

    1------------------------------------------------------------------------------------- package com.n ...

  9. Autofac 入门

    Autofac 入门文档 原文链接:http://docs.autofac.org/en/latest/getting-started/index.html 在程序中使用Autofac的基本模式是: ...

  10. swing中几种layout示例(转)

    import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.e ...