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。