zoukankan      html  css  js  c++  java
  • 使用资源调控器管理资源

    1、使用SQLServer Management Studio 配置资源调控器

    2、使用T-SQL配置资源调控器

    3、监控资源调控器

    前言: 在前面的章节,提到过可以通过多种配置数据库服务器的方式来提高性能。如索引、统计信息、hints、物理设计和服务器配置等。当你完成

    本系列包含:

    1、 使用SQLServer Management Studio 配置资源调控器

    2、 使用T-SQL配置资源调控器

    3、 监控资源调控器

    前言:
    在前面的章节,提到过可以通过多种配置数据库服务器的方式来提高性能。如索引、统计信息、hints、物理设计和服务器配置等。

    当你完成上面那些配置后,还依旧有少量存储过程、查询运行得很慢时,由于硬件资源限制,可能已经没什么好调整。如一个数据库服务器支撑着多个应用系统,其中一个是报表系统,而报表系统往往都是非常耗资源的。

    在2008之前,对于这种问题,很难作出有效的解决方法。从2008开始,引入了一个资源调控器(ResourceGovernor)来协助解决这类问题。资源调控器(下面简称RG),可以管理服务器上CPU和内存资源。不同类型的请求可以被分配到不同的资源。

    RG的功能可以分为3个组件:

    1、 分类(Classification)

    2、 资源池(Resource pool)

    3、 工作负荷组(Workload group)

    RG的基本功能/体系

    分类(Classification):定义一个用户自定义标量函数作为RG的分类函数,每当请求到达时,分类函数就会执行,区分请求的类型,然后放到特定的工作负荷组(Workload Group)中。

    工作负载组(WorkloadGroup):一个逻辑单元,包含了一组资源。属于特定的资源池(Resource Pool)SQLServer创建了两个默认的工作负载组,internal和default。

    资源池(ResourcePool):包含对请求分配特定工作负载组的资源规则定义,SQLServer同样创建了两个资源池internal和default。

    通过SQLServerManagement Studio 配置资源调控器:
    在开始之前,先来创建一个现实环境,假设AdventureWorks数据库是生产数据库,且有数十亿的数据。这个库提供多个应用程序使用。一个应用程序是用于web程序,一个是OLTP。另外一个应用程序是报表系统。当查询报表的时候,会影响到web程序,为了解决这个问题,可以借助RG来保存web程序的CPU和内存资源。这里保留web程序获得最少50%的CPU和内存,报表使用25%。

    本文将演示使用SQLServer Management Studio(下称SSMS)来实现。

    准备工作:
    本文将创建两个资源池和工作负载组。用于给web和报表程序之用。独立的用户名分类函数区分请求很有帮助,基于用户名,分类函数将发送请求到特定的工作负载组。

    步骤:
    1、 打开ssms,确保这个登录有管理员权限,如果不能,那需要有ALTER LOGIN和CONTROL SERVER的权限。

    2、 在新建窗口输入,注意本文使用AdventureWorks2012数据库:


    USE master
    GO

    CREATE LOGIN [AW_WebAppUser] WITH PASSWORD=N'AW_WebAppUser123' ,DEFAULT_DATABASE=AdventureWorks2012
    GO

    USE AdventureWorks2012
    GO

    CREATE USER [AW_WebAppUser] FOR LOGIN [AW_WebAppUser]
    GO
    ALTER ROLE [db_owner] ADD MEMBER [AW_WebAppUser]
    GO

    CREATE LOGIN [AW_ReportAppUser] WITH PASSWORD=N'AW_ReportAppUser123',DEFAULT_DATABASE=AdventureWorks2012
    GO

    USE AdventureWorks2012
    GO
    CREATE USER [AW_ReportAppUser] FOR LOGIN [AW_ReportAppUser]
    GO
    ALTER ROLE [db_owner] ADD MEMBER [AW_ReportAppUser]
    GO

    3、 创建分类函数:

    USE MASTER
    GO

    CREATE FUNCTION dbo.RGClassifier( )
    RETURNS SYSNAME
    WITH SCHEMABINDING
    AS
    BEGIN
    DECLARE @Workload_GroupName SYSNAME

    IF SUSER_NAME() = 'AW_WebAppUser'
    SET @Workload_GroupName = 'rg_WebApp'

    ELSE
    IF SUSER_NAME() = 'AW_ReportAppUser'
    SET @Workload_GroupName = 'rg_ReportApp'

    ELSE
    SET @Workload_GroupName = 'default'
    RETURN @Workload_GroupName
    END


    4、 打开ssms,右键资源调控器节点,选择【属性】,就见到如下:


    5、 点击启用【启用资源调控器】:


    6、 在分类函数名下拉框中,选择dbo.RGClassifier():


    7、 在资源池网格中,可以找到两个默认资源池defalut和internal,现在添加一个新的资源池叫做rp_WebApp,并配置为如图,记住总和不能超过100:


    8、 在资源池的工作负荷组:rp_WebApp中,创建一个新的工作负荷组rg_WebApp,并配置CPU时间为300:


    9、 在资源池网格中,按上述步骤添加rp_ReportApp,并把最小CPU和内存设为25,CPU时间为300:


    10、点击确定后,打开资源调控器节点:

    分析:
    在连接了SQLServer之后,先执行脚本创建用户,用于标识不同应用程序访问数据库。通过账号,分类函数会把登录名的请求发送到对应的资源池和工作负荷组。

    在创建类分区函数dbo.RGClassifier(),并在图形界面中调用这个函数。默认情况下资源调控器是禁用的,为了使其工作,需要手动启用。除了图形界面,也可以使用T-SQL语句:ALTER RESOURCEGOVERNOR RECONFIGURE命令来启动。

    如果请求不属于新建的两个资源池,会分配到default工作负荷组和default资源池。Internal工作负荷组是SQLServer内部使用的,并且DAC(专用管理员连接)是不受RG分类影响。

    最后通过图形界面查看是否建立成功。

    扩充信息:
    在现实世界中,在实施资源调控器之前,需要对各个应用程序的资源请求做一个趋势分析,可以帮助你更好地分配资源。

    在资源池中定义的MIN参数是不共享的,也就是别的请求不能占用这部分,是专用的资源。资源调控器可以有多个资源池。这就是为什么MIN中的百分比总和不能超过100.

    另一方面,MAX参数的值是共享的,实际的MAX值会根据MIN的值来调整。

    前言:
    在前一章已经演示了如何使用SSMS来配置资源调控器。但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展。并且可以在不同服务器快速部署。

    下面来演示如何实现:

    步骤:
    1、 打开ssms,连到SQLServer。确保登录账号有CONTROLSERVER的权限。

    2、 运行下面脚本,删除前面创建过的资源调控器对象:

    USE master
    GO
    DROP WORKLOAD GROUP rg_WebApp
    DROP RESOURCE POOL rp_WebApp
    DROP WORKLOAD GROUP rg_ReportApp
    DROP RESOURCE POOL rp_ReportApp
    GO


    3、 现在执行语句来创建下面对象,此处的分类函数参考上一章:

    USE master
    GO

    CREATE RESOURCE POOL [rp_WebApp]
    WITH
    (
    MIN_CPU_PERCENT=50,
    MAX_CPU_PERCENT =100,
    MIN_MEMORY_PERCENT =50,
    MAX_MEMORY_PERCENT =100
    )
    GO

    CREATE WORKLOAD GROUP [rg_WebApp]
    WITH
    (
    GROUP_MAX_REQUESTS=0,
    IMPORTANCE=MEDIUM,
    REQUEST_MAX_CPU_TIME_SEC=300,
    REQUEST_MAX_MEMORY_GRANT_PERCENT=25,
    REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0,
    MAX_DOP=0
    )USING [rp_WebApp]
    GO

    CREATE RESOURCE POOL [rp_ReportApp]
    WITH
    (
    MIN_CPU_PERCENT=25,
    MAX_CPU_PERCENT =100,
    MIN_MEMORY_PERCENT =25,
    MAX_MEMORY_PERCENT =100
    )
    GO


    CREATE WORKLOAD GROUP [rg_ReportApp]
    WITH
    (
    GROUP_MAX_REQUESTS=0,
    IMPORTANCE=MEDIUM,
    REQUEST_MAX_CPU_TIME_SEC=300,
    REQUEST_MAX_MEMORY_GRANT_PERCENT=25,
    REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0,
    MAX_DOP=0
    )USING [rp_ReportApp]
    GO


    ALTER RESOURCE GOVERNOR
    WITH (CLASSIFIER_FUNCTION=[dbo].[RGClassifier]
    );
    GO

    ALTER RESOURCE GOVERNOR RECONFIGURE
    GO


    4、 为了检查是否创建成功,可以通过DMV查询,这里用到下面两个DMV来查询:sys.dm_resource_governor_resource_pools 、sys.dm_resource_governor_workload_groups


    SELECT pool_id ,
    name
    FROM sys.dm_resource_governor_resource_pools

    SELECT group_id ,
    name ,
    pool_id
    FROM sys.dm_resource_governor_workload_groups

    5、 从截图上可以看出已经创建成功:

    上面的步骤可以通过ssms操作时,界面中上部的【脚本】按钮生成,但是由于ssms生成的T-SQL有些不是最优化的,所以如果你不是不懂,那就自己写吧。

    扩充知识:
    下面几个配置选项在本文中用到,简要说明一下:

    1、 IMPORTANCE:定义工作负荷组中对请求处理的重要性,其值为LOW/MEDIUM/HIGH。

    2、 GROUP_MAX_REQUESTS:定义在一个工作负荷组中最大并行执行的请求数量。

    3、 MAX_DOP:在一个工作负荷组中并行请求的最大并行度。

    4、 REQUEST_MAX_MEMORY_GRANT_PERCENT:对于一个工作负荷组中,一个单独的请求能用的最大内存数。

    5、 REQUEST_MAX_CPU_TIME_SEC: 对于一个工作负荷组中,一个单独的请求可以使用的最大秒数。

    6、 REQUEST_MEMORY_GRANT_TIMEOUT_SEC: 指定查询等待内存授予(工作缓冲区内存)变为可用的最长时间(以秒为单位)。

    [置顶] 第十九章——使用资源调控器管理资源(3)——监控资源调控器 2013-04-12 11:50 2242人阅读 评论(0) 收藏 举报 本文章已收录于:
    分类: 配置(6)
    作者同类文章X资源调控器(2)
    作者同类文章X数据库管理(192)
    作者同类文章XDBA(105)
    作者同类文章X前言:
    在对每个应用程序配置了资源调控器之后,需要监控资源调控器。可能需要监控资源池的使用和多少个请求被分配到特定的资源池。也可能希望监控internal和default池的活动情况。

    本文中,演示使用不同登录账号(AW_WebAppUser和AW_ReportAppUser),并监控CPU和内存资源的使用情况。

    准备工作:
    本文使用的部分脚本在本系列的第一篇中已经写出。这里不累赘。文中将通过不同账号执行相同的语句,模拟不同的请求。

    步骤:
    1、 打开【可靠性和性能监视器】→perfmon.exe

    2、 打开【性能监视器】视图

    3、 添加计数器

    4、 在添加选项中选择SQLServer:ResourcePoolStats 的CPU usage target%。

    5、 由于本机装了一个SQLServer2008和一个SQLServer2012,所以需要找到命名实例也就是2012的计数器:

    6、 现在打开SSMS,使用AW_WebAppUser登录,这个为窗体1

    7、 打开新窗体2,使用AW_ReportAppUser登录。

    8、 在窗体1,也就是使用AW_WebAppUser登录的窗体中输入一下代码,并执行:

    USE AdventureWorks2012
    GO

    SELECT SalesOrderID ,
    SalesOrderDetailID ,
    CarrierTrackingNumber ,
    OrderQty ,
    ProductID ,
    SpecialOfferID ,
    UnitPrice ,
    UnitPriceDiscount ,
    LineTotal ,
    rowguid ,
    ModifiedDate
    FROM sales.salesOrderdetail
    ORDER BY SalesOrderID
    GO
    SELECT SalesOrderID ,
    SUM(LineTotal) ,
    ROW_NUMBER() OVER ( ORDER BY SUM(LineTotal) DESC , SalesOrderID )
    FROM sales.salesOrderdetail
    GROUP BY SalesOrderID


    9、 在窗体2中执行以下代码:

    USE AdventureWorks2012
    GO

    SELECT SalesOrderID ,
    SalesOrderDetailID ,
    CarrierTrackingNumber ,
    OrderQty ,
    ProductID ,
    SpecialOfferID ,
    UnitPrice ,
    UnitPriceDiscount ,
    LineTotal ,
    rowguid ,
    ModifiedDate
    FROM sales.salesOrderdetail
    ORDER BY SalesOrderID
    GO
    SELECT SalesOrderID ,
    SUM(LineTotal) ,
    ROW_NUMBER() OVER ( ORDER BY SUM(LineTotal) DESC , SalesOrderID )
    FROM sales.salesOrderdetail
    GROUP BY SalesOrderID


    10、 查看计数器图标:


    扩充信息:
    如果你想映射特定会话的工作负荷组,可以把sys.dm_exec_sessions和sys.dm_resource_governor_workload_groups关联,关联列为group_id,还能进一步关联sys.dm_resource_governor_workload_groups与sys.dm_resource_governor_resource_pools,关联列为pool_id。

  • 相关阅读:
    多语言资源文件制作工具
    window service 插件服务插件开发
    .net 中读取自定义Config文件
    Asp.net 主题中CSS文件的缓存问题
    Asp .net 4.0 中ViewStatus 使用
    Linq通用分页数据查询方法
    EF中查询出现死锁的处理
    Windows Live Writer 分享到插件
    Windows Resx资源文件编辑工具
    插件式服务架构
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5540568.html
Copyright © 2011-2022 走看看