四、SQL Server资源调控器运用场景—IO
前面讲述关于CPU资源的控制更多的是为下面讲述SQL Server 2014在IO资源上的调控做铺垫,上面的例子是以数据库为单位规划各个库占用CPU的百分比,下面的例子我们就将以登陆用户来划分磁盘的IOPS;
假设generalUser用户占用的IOPS最大值为10,importantUser用户占用IOPS的最大值为20,实现这个需求的步骤如下:
1.首先,解除分类器函数与资源调控器注册关系;
USE [master] GO --解除分类器函数注册 ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL) GO
2.接着,修改rpImportantDB、rpGeneralDB资源池,添加MAX_IOPS_PER_VOLUME和MIN_IOPS_PER_VOLUME两个属性值;
--修改重要业务数据库的资源池 ALTER RESOURCE POOL rpImportantDB WITH ( MAX_CPU_PERCENT = 90, MIN_CPU_PERCENT = 10, MAX_IOPS_PER_VOLUME = 20, MIN_IOPS_PER_VOLUME = 0 ) --修改普通业务数据库的资源池 ALTER RESOURCE POOL rpGeneralDB WITH ( MAX_CPU_PERCENT = 10, MIN_CPU_PERCENT = 0, MAX_IOPS_PER_VOLUME = 10, MIN_IOPS_PER_VOLUME = 0 ) GO
3.接着修改分类器函数fn_Classifier(),把它修改成按照登陆用户:importantUser和generalUser(这两个登陆用户请自行创建,为了方便测试,这两个用户都是管理员身份)返回对应的工作负荷组名称;
--修改分类器函数 ALTER FUNCTION fn_Classifier() RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @strGroupName SYSNAME IF SUSER_SNAME()='importantUser' SET @strGroupName='wgImportantDB' ELSE IF SUSER_SNAME()='generalUser' SET @strGroupName='wgGeneralDB' ELSE SET @strGroupName='default' RETURN @strGroupName END GO
4.重新把分类器函数fn_Classifier()注册到资源调控器并更新内存中的配置;
--注册分类器函数到资源调控器并更新内存中的配置 ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.fnClassifier) ALTER RESOURCE GOVERNOR RECONFIGURE GO
5.在GeneralDB数据库中创建一个名为TestIOPS的表,并向表中插入10000行记录;
USE [GeneralDB] GO --创建表 CREATE TABLE [dbo].[TestIOPS]( [Id] [int] IDENTITY(1,1) NOT NULL, [MyStr] [nchar](450) NULL ) ON [PRIMARY] GO --插入测试数据 SET NOCOUNT ON; GO DECLARE @count INT = 0; WHILE (@count < 10000) BEGIN INSERT INTO [GeneralDB].[dbo].[TestIOPS](MyStr) VALUES(REPLICATE('a',450)); SET @count += 1; END GO
6.使用generalUser用户登陆SSMS,通过在TestIOPS表的MyStr字段创建一个非聚集索引来测试IOPS,在执行创建索引的脚本之前,打开性能计数器帮助监控创建索引时的IOPS,找到SQLServer:Resource Pool Stats对象下的Disk Write IO/sec计数器,计数器监控的结果如图9所示:
USE [GeneralDB] GO --创建索引 CREATE NONCLUSTERED INDEX idx_MyStr_1 ON [GeneralDB].[dbo].[TestIOPS] ([MyStr]); GO
从图9可以看出资源池rpGeneralDB 中Disk Write IO/sec计数器的最大值为10,发生Disk Write IO/sec的时间从22:54:52持续到22:55:02,持续时间大概为20秒;
7.接着,使用importantUser用户登陆SSMS,创建上一步骤中一样的索引结构,只需要修改索引名称即可,同样需要监控SQLServer:Resource Pool Stats对象下的Disk Write IO/sec计数器,计数器监控的结果如图10所示:
USE [GeneralDB] GO --创建索引 CREATE NONCLUSTERED INDEX idx_MyStr_2 ON [GeneralDB].[dbo].[TestIOPS] ([MyStr]); GO
从图10可以看出资源池rpImportantDB 中Disk Write IO/sec计数器的最大值为20,发生Disk Write IO/sec的时间从22:59:52持续到23:00:11,持续时间大概为9秒;
通过上面资源调控器的IOPS的测试,可以发现即使两个用户执行了相同操作,但IOPS却可以根据不同用户而有所区别,这完全归功于资源调控器对IO资源的控制,这将为数据库主机或者私有云上运行IO密集型工作负载提供解决方案。
五、总结
资源调控器(Resource Governor)在没有资源争夺的时候,那么运用可以分配到100%资源,如果达到了分类器函数的临界值,会按照预先分配的比例进行调配,从而保证重要业务在资源紧缺的情况下顺利进行,增强对数据库的管理性。SQL Server 2014的新功能中提供了一个非常重要的IO资源控制,这将为私有云用户提供更人性化的管理和服务。
作者简介
陈畅亮,微软SQL Server最有价值专家,目前就职于广州某互联网公司任数据库团队Leader,专注于数据库解决方案与性能调优。