技术开发 频道

SQL Server 2014新特性:IO资源调控

  四、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

SQL Server资源调控器运用场景—IO
▲图9:计数器监控结果

  从图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

SQL Server资源调控器运用场景—IO
▲图10:Write IO/sec计数器监视结果

  从图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,专注于数据库解决方案与性能调优。

31
相关文章