/*================================================================================== Curso: SQL SERVER 2019 https://www.udemy.com/course/draft/3957796/?referralCode=FB10D369E786D9FE8A48 Instrutor: Sandro Servino https://www.linkedin.com/in/sandroservino/?originalSubdomain=pt https://filiado.wixsite.com/sandroservino GESTÃO DE RECURSOS FÍSICOS: RESOURCE GOVERNOR ==================================================================================*/ -- RESOURCE GOVERNOR -- Lançado na versão SQL SERVER 2008 R1, ENTERPRISE EDITION, -- que possibilitou limitar recursos de CPU e Memória para determinadas -- usuários, bancos de dados e aplicação. Na versão SQL SERVER 2014 -- foi disponibilizado possibilidade de limitar IOPs (Input-Output per second - leitura e gravação disco) -- Utilizado por poucas empresas. -- Recurso interessante que substituiu o AFFINITY MASK, com mais poder, pois consegue -- limitar recursos em nivel de usuário, usuário de servico de uma aplicacao, banco de dados, ... -- em termos de CPU, memória e disco. -- Como DBA, voce poderá por exemplo limitar a pressão de relatórios pesados que concorrem com o sistema de pagamentos -- que são executados na mesma instancia ou testes em bancos de dev ou qa na mesma instancia da producao, -- ou selects pesados feitos por consultores externos na base de produção e afins, mas deve ser usado com controle e responsabilidade. -- Em muitos casos, devido custo de licenciamento, e aquisição de novos servidores, pode ser um recurso -- interessante. -- QUAIS OS PASSOS PARA CONFIGURAR? -- 1. CRIAR UM RESOURCE POOL (recurso fisico: cpu, disco e memória e alocações percentuais gerais). -- Por padrão, já vem instalado o internal e default mas terá que criar o seu para fazer a limitação de recursos para um user por exemplo. -- EXEMPLO, CPU DE 0 A 50% DA CPU, MEMÓRIA até 20% e até 100 IOPS para o disco, poderá ser usado nesta instancia se for vinculado a uma aplicação. -- 2. DEPOIS DEVE CRIAR UM WORKLOAD OU WORKLOADS VINCULADOS A UM RESORCE POLL -- Onde poderá criar grupos de workloads com percentuais dentro do percentual geral estabelecido no RESOURCE POOL -- 3. E FINALMENTE CRIAR UMA FUNCTION DE CLASSIFICAÇÃO VINCULADO A UM WORKLOAD -- Onde irá criar a regra através de uma Function, vinculando esta regra ao WORKLOAD. -- Esta regra poderá ser por exemplo, IF usuariox acessar a instancia SQL SERVER será limitado o acesso a recurso CPU por exemplo, -- através da vinculação ao WORKLOAD y, porque neste WORKLOAD y ja existirá uma limitação especifica, se -- existir mais de 1 WORKLOAD ou irá usar a regra geral do RESOURCE POOL. -- Acesse uma instancia SQL SERVER -- Vá a opção Management e veja Resource Governor desabilitado por padrão. -- Vamos ver os resource pool de sistema que vem instalado. Vamos clicar com botao direito sobre Default e escolher propriedade. -- Repare que da mesma forma que ocorre com Resource Pool, existem também dois Workloads de sistema que já configurado. -- E COMO O SQL SERVER SABE PARA QUAL WORKLOAD deve ser encaminhado um requisito de uma aplicação por exemplo? -- É AQUI QUE ENTRA O ULTIMO E UM PASSO FUNDAMENTAL, QUE É A CLASSIFICAÇÃO. É AQUI QUE ESTÁ A INTELIGENCIA DO PROCESSO DO -- ROSOURCE GOVERNOR PARA CHECAR POR EXEMPLO O USUÁRIO QUE ESTÁ ACESSANDO, UMA REQUISIÇÃO DE UMA APLICAÇÃO FEITA POR -- UM USUÁRIO DE SERVIÇO DA APLICAÇÃO QUE FICA NO SQL SERVER, ACESSO A UM BANCO DE DADOS DE FORMA GERAL, ACESSO DE UMA MÁQUINA CLENTE,... -- COM A UTILIZAÇAO DE UMA FUNCTION DE CLASSIFICAÇÃO E USO DE UM IF INTERNO É DIRECIONADO PARA UM WORKLOAD E DESTE PARA O RESOURCE POOL, -- LIMITANDO AI, A DISPONIBILIDADE PERCENTUAL DE UMA CPU, MEMÓRIA E DISCO. QUALQUER REQUISIÇÃO QUE NÃO ESTIVER NA REGRA, PARA SER DIRECIONADO -- PA AUM WORKLOAD ESPECIFICO CRIADO, IRÁ AUTOMATICAMENTE PARA O WORKLOAD DEFAULT. -- VER O GRAFICO - D:\VideosGravados\SQLSERVER_CURSO_UDEMY\Imagens -- Está função deverá ser criada dentro da Base de Dados MASTER. --------------------------------------------------------------------------------------------------------------------------- -- VAMOS AO LAB --1. Vamos criar dois logins que vai representar o acesso ao banco de dados AUDITORIADBA por uma aplicaçao OLTP e RELATÓRIO USE AuditoriaDBA GO DROP USER IF EXISTS APPOLTP GO USE MASTER GO IF EXISTS (SELECT name FROM master.sys.server_principals WHERE name = 'APPOLTP') BEGIN DROP LOGIN APPOLTP END GO CREATE LOGIN APPOLTP WITH PASSWORD = N'abc', DEFAULT_DATABASE=master, CHECK_EXPIRATION=OFF, CHECK_POLICY = OFF GO USE AUDITORIADBA GO CREATE USER APPOLTP FOR LOGIN APPOLTP GO USE AuditoriaDBA GO DROP USER IF EXISTS APPREPORT GO USE MASTER GO IF EXISTS (SELECT name FROM master.sys.server_principals WHERE name = 'APPREPORT') BEGIN DROP LOGIN APPREPORT END GO CREATE LOGIN APPREPORT WITH PASSWORD = N'abc', DEFAULT_DATABASE=master, CHECK_EXPIRATION=OFF, CHECK_POLICY = OFF GO USE AUDITORIADBA GO CREATE USER APPREPORT FOR LOGIN APPREPORT GO USE [AuditoriaDBA] -- Para faclitar nosso LAB, vamos incluir os dois users na role db_owner. GO ALTER ROLE [db_owner] ADD MEMBER [APPOLTP] ALTER ROLE [db_owner] ADD MEMBER [APPREPORT] GO --2. VAMOS MANUALMENTE ATIVAR O RESOURCE GOVERNOR. PODERÁ FAZER ISTO PELO SSMS GRAFICAMENTE. USE MASTER GO ALTER RESOURCE GOVERNOR RECONFIGURE GO --3. VAMOS AGORA CRIAR 2 RESOURCES POOLS QUE SERÁ USADO PARA LIMITAR O ACESSO DAS APLICACOES USE MASTER GO CREATE RESOURCE POOL RP_APPOLTP WITH (MIN_CPU_PERCENT=0, MAX_CPU_PERCENT=10, MIN_MEMORY_PERCENT=0, MAX_MEMORY_PERCENT=10 ) GO -- PODE CRIAR DE FORMA GRAFICA CREATE RESOURCE POOL RP_APPREPORT WITH (MIN_CPU_PERCENT=0, MAX_CPU_PERCENT=20, -- VAMOS LIMITAR EM 20% MIN_MEMORY_PERCENT=0, MAX_MEMORY_PERCENT=20 -- VAMOS LIMITAR EM 20% ) GO ALTER RESOURCE GOVERNOR RECONFIGURE GO --4. VAMOS AGORA CRIAR 2 WORKLOADS GROUPS VINCULADOS AOS RESOURCES POOLS CRIADOS -- VAMOS CRIAR ESTES WORKLOADS POR SCRIPT SQL, MAS PODERIA CRIAR POR MEIO DO SSMS (GUI) USE MASTER GO CREATE WORKLOAD GROUP WG_APPOLTP WITH (GROUP_MAX_REQUESTS=0, REQUEST_MAX_MEMORY_GRANT_PERCENT = 5, REQUEST_MAX_CPU_TIME_SEC = 0, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP = 0) USING [RP_APPOLTP] GO CREATE WORKLOAD GROUP WG_APPREPORT WITH (GROUP_MAX_REQUESTS=0, REQUEST_MAX_MEMORY_GRANT_PERCENT = 5, REQUEST_MAX_CPU_TIME_SEC = 0, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP = 0) USING [RP_APPREPORT] GO ALTER RESOURCE GOVERNOR RECONFIGURE GO -- REQUEST_MAX_MEMORY_GRANT_PERCENT = value -- Specifies the maximum amount of memory that a single request can take from the pool. -- value is a percentage relative to the resource pool size specified by MAX_MEMORY_PERCENT. -- REQUEST_MAX_CPU_TIME_SEC = value -- Specifies the maximum amount of CPU time, in seconds, that a request can use. value -- must be 0 or a positive integer. The default setting for value is 0, which means unlimited. -- MAX_DOP = value -- Specifies the maximum degree of parallelism (MAXDOP) for parallel query execution. -- Value must be 0 or a positive integer. The allowed range for value is from 0 through 64. The default setting for value, 0, -- GROUP_MAX_REQUESTS = value -- Specifies the maximum number of simultaneous requests that are allowed to execute in the workload group. -- value must be a 0 or a positive integer. The default setting for value is 0, and allows unlimited requests. W -- hen the maximum concurrent requests are reached, a user in that group can log in, but is placed -- in a wait state until concurrent requests are dropped below the value specified. -- https://docs.microsoft.com/en-us/sql/t-sql/statements/create-workload-group-transact-sql?view=sql-server-ver15 -- REQUEST_MEMORY_GRANT_TIMEOUT_SEC = value -- Specifies the maximum time, in seconds, that a query can wait for a memory grant (work buffer memory) to become available. -- Value must be 0 or a positive integer. The default setting for value, 0, uses an internal calculation based on query cost to determine the maximum time. -- IMPORTANCE = {LOW | MEDIUM (Standard) | HIGH}, you can define that requests from that workload group will have priority over connections -- from another workload group that are using the same resource pool (this parameter does not affect requests that are using another resource pool). --5. VAMOS AGORA CRIAR FINALMENTE A FUNCAO DE CLASSIFICACAO VINCULADA AO WORKLOAD GROUP CRIADO USE MASTER GO CREATE FUNCTION dbo.Fn_classificaACESSOAPP() RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @retorna sysname SET @retorna = 'default' -- Se nao for nenhum dos dois usuarios, o sql server irá usar o WorkLoad Default IF (SUSER_NAME() = 'APPOLTP') SET @retorna = 'WG_APPOLTP' -- case sensitive ELSE IF (SUSER_NAME() = 'APPREPORT') SET @retorna = 'WG_APPREPORT' -- case sensitive RETURN @retorna END GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.Fn_classificaACESSOAPP); GO -- Aqui será feito o bind entre a função de classificaçao dentro doResource Governor. -- Nesta hora voce estará mostrando para o Resource Governor -- qual será a funcão de classificacao utilizada para filtrar e direcionar para os limitadores de recursos (workoad e resource poll) GO ALTER RESOURCE GOVERNOR RECONFIGURE GO -- PRONTO !!!! -- Vamos abrir as propriedade do Resource Governor e vamos verificar a função vinculada. -- DICA> -- Se você precisar fazer uma alteração na função de classificador, é importante observar que a função não pode ser descartada ou -- alterada enquanto estiver marcada como a função do classificador para o Resource Governor. -- Antes de modificar ou eliminar a função de classificador, primeiro você precisa desabilitar -- o Resource Governor. Alternativamente, você pode substituir a função classificadora por outra executando o -- comando ALTER RESOURCE GOVERNOR e passando um nome CLASSIFIER_FUNCTION diferente. -- Você também pode simplesmente desativar a função classificadora atual executando o seguinte comando: -- ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);ALTER RESOURCE GOVERNOR RECONFIGURE; -- Altere a funcao, caso precise corrigi-la e com todo o bloco, compile a function novamente: ALTER FUNCTION Fn_classificaACESSOAPP() -- e novamente vincule a function ao Resource Pool: ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.Fn_classificaACESSOAPP) -- ALTER RESOURCE GOVERNOR RECONFIGURE; -- https://translate.google.com/translate?hl=pt-BR&sl=en&u=https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-resource-governor-transact-sql&prev=search&pto=aue -------------------------------------------------------------------------------------------------------------------- -- AGORA VAMOS TESTAR O USO DO RESOURCE GOVERNOR E VAMOS VERIFICAR SE REALMENTE SERA FEITO A LIMITACAO DOS RECURSOS -- A PARTIR DO ACESSO DOS USERS. -- VAMOS ABRIR UMA NOVA CONEXAO NO SSMS ACESSANDO COM O LOGIN APPOLTP WITH PASSWORD = N'abc' -- e LOGIN APPREPORT WITH PASSWORD = N'abc'. -- Nas duas sessoes, vamos colocar este codigo para rodar. USE AUDITORIADBA GO SET NOCOUNT ON DECLARE @j int DECLARE @p varchar(500) SET @j = 999999999 WHILE @j >0 BEGIN SELECT @p = @@VERSION; SET @j = @j -2 END -- E em uma outra sessao, vamos verificar o Resource Pool que está sendo usado. SELECT rpool.name as PoolName, COALESCE (SUM(rgroup.total_request_count),0) as TotalRequest, COALESCE (SUM(rgroup.total_cpu_usage_ms),0) as TotalCPUinMS, CASE WHEN SUM(rgroup.total_request_count) > 0 THEN SUM(rgroup.total_cpu_usage_ms) / SUM(rgroup.total_request_count) ELSE 0 END as AVGCPUinMS FROM sys.dm_resource_governor_resource_pools as rpool LEFT OUTER JOIN sys.dm_resource_governor_workload_groups as rgroup ON rpool.pool_id = rgroup.pool_id GROUP BY rpool.name -- Vamos abrir o PERFMON no servidor e selecionar o seguinte indicador -- SQLServer:SQL Server:Resource Pool Stats.CPU usages % -- ....Selecione os Workloads RP_APPREPORT e RP_APPOLTP configurados no Resource Governor que está limitado em 20% e 10% da cpu e veja o grafico -- Vamos rodar o codigo abaixo em novas sessões do user APPOLTP e APPREPORT. Está limitado em 10% e 20% da cpu. -- IMPORTANTE: Quando você configura, um recurso, por exemplo uso máximo da CPU em X%, ele está limitando a CPU para X% apenas quando há muita pressão na CPU para outros RP, por exemplo. -- Quando não há pressão da CPU, ela consumirá mais de X%, podendo consumir 100% da CPU mesmo que voce tenha definido um limite máximo em 10%. -- ABRA 3 SESSOES COM APPOLTP E RODE ESTES CODIGOS E VEJA PERFMON E VEJA CUSTO GERAL DA CPU -- LIMITADO EM 10% DA CPU, VEJA O QUE ACONTECE COM A CPU. USE AUDITORIADBA GO SET NOCOUNT ON DECLARE @j int DECLARE @p varchar(500) SET @j = 999999999 WHILE @j >0 BEGIN SELECT @p = @@VERSION; SET @j = @j -2 END -- ABRA 1 SESSÃO COM APPREPORT E RODE ESTES CODIGOS E VEJA PERFMON E VEJA CUSTO GERAL DA CPU -- LIMITADO EM 20% DA CPU. USE AUDITORIADBA GO SET NOCOUNT ON DECLARE @j int DECLARE @p varchar(500) SET @j = 999999999 WHILE @j >0 BEGIN SELECT @p = @@VERSION; SET @j = @j -2 END -- ABRA MAIS 1 SESSÃO COM APPREPORT E RODE ESTE CODIGO E VEJA PERFMON AS DUAS LINHAS. -- LIMITADO EM 20% DA CPU USE AUDITORIADBA GO SET NOCOUNT ON DECLARE @j int DECLARE @p varchar(500) SET @j = 999999999 WHILE @j >0 BEGIN SELECT @p = @@VERSION; SET @j = @j -2 END -- VEJA O CUSTO GERAL DA CPU. ----------------------------------------------------------------------------------------------------- -- Vamos parar todos os processos e agora vamos simular uso de IO e como limitar a pressão sobre o disco USE AUDITORIADBA GO -- Vamos criar uma tabela e carregar dados de forma ilimitada para esta tabela CREATE TABLE TABELAIO (ID int IDENTITY(1,1), carregadata datetime DEFAULT SYSDATETIME()) GO WHILE 5=5 BEGIN INSERT TABELAIO DEFAULT VALUES CHECKPOINT END GO -- Abra varias conexóes simultaneas para rodar o codigo para dar insert na tabela -- carregadata com o usuário APPREPORT. -- Vamos remover os contadores do Perfmon e vamos incluir contador novo. -- Indicador SQLServer:Resource Pool Stats.Disk Write IO/sec -- Vamos alterar o Resource Pool criado para Limitar IOPS -- Conecte como admin, abra uma nova sessao e rode o codigo abaixo para limitar o iops e veja perfmon ALTER RESOURCE POOL RP_APPREPORT WITH (MAX_IOPS_PER_VOLUME=50) ALTER RESOURCE GOVERNOR RECONFIGURE GO -- Altere novamente para aumentar iops -- Vamos alterar o Resource Pool criado para Limitar IOPS ALTER RESOURCE POOL RP_APPREPORT WITH (MAX_IOPS_PER_VOLUME=100) ALTER RESOURCE GOVERNOR RECONFIGURE GO -- FIM DEMONSTRACAO ------------------------------------------------------------------------------------------------ -- DICA -- SEGUE ABAIXO UM EXEMPLO PARA TESTAR DEPOIS, ONDE PODERIA TESTAR A CONEXAO -- VINDA DE UMA APLICACAO ESPECIFICA OU MESMO DE UM ACESSO DO SA. CREATE FUNCTION dbo.rgclassifier_v1() RETURNS sysname WITH SCHEMABINDING AS BEGIN -- Declare the variable to hold the value returned in sysname. DECLARE @grp_name AS sysname -- If the user login is 'sa', map the connection to the groupAdmin -- workload group. IF (SUSER_NAME() = 'sa') SET @grp_name = 'groupAdmin' -- Use application information to map the connection to the groupAdhoc -- workload group. ELSE IF (APP_NAME() LIKE '%MANAGEMENT STUDIO%') OR (APP_NAME() LIKE '%QUERY ANALYZER%') SET @grp_name = 'groupAdhoc' -- If the application is for reporting, map the connection to -- the groupReports workload group. ELSE IF (APP_NAME() LIKE '%REPORT SERVER%') SET @grp_name = 'groupReports' -- If the connection does not map to any of the previous groups, -- put the connection into the default workload group. ELSE SET @grp_name = 'default' RETURN @grp_name END; GO -- AINDA ---------------------------------------------------------------------------------------- -- É POSSIVEL CONFIGURAR UM external resource pool para por exemplo controlar a execução de comandos R, python, data analysis tools e outros -- recursos externos. Os comandos são os memos para configurar mas não iremos demonstrar neste curso. -- https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-resource-pool-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15# -- EXEMPLO USE master GO CREATE EXTERNAL RESOURCE POOL RService_Resource_Pool WITH ( MAX_CPU_PERCENT = 10 ,MAX_MEMORY_PERCENT = 5 ); ALTER RESOURCE GOVERNOR reconfigure; GO CREATE WORKLOAD GROUP R_workgroup WITH (importance = medium) USING "default", EXTERNAL "RService_Resource_Pool"; GO CREATE FUNCTION RG_Class_function() RETURNS sysname WITH schemabinding AS BEGIN IF program_name() in ('Microsoft R Host', 'RStudio') RETURN 'R_workgroup'; RETURN 'default' END; GO ALTER RESOURCE GOVERNOR WITH (classifier_function = dbo.RG_Class_function); ALTER RESOURCE GOVERNOR reconfigure; go -- SCRIPT COMPLETO -------------------------------------------------------------------------------------------------------------------------------------------------------------- -- SEGUE SCRIPT COMPLETO SE QUISER LIMPAR TODOS OS RECURSOS DO RESOURCE GOVERNOR E CRIAR DE UMA SÓ VEZ. USE [master] GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=NULL) GO ALTER RESOURCE GOVERNOR RECONFIGURE GO ALTER RESOURCE GOVERNOR DISABLE GO IF (EXISTS(SELECT NULL FROM sys.resource_governor_workload_groups WHERE [name] = 'WG_APPOLTP')) DROP WORKLOAD GROUP [WG_APPOLTP] GO IF (EXISTS(SELECT NULL FROM sys.resource_governor_resource_pools WHERE [name] = 'RP_APPOLTP')) DROP RESOURCE POOL [RP_APPOLTP] GO IF (EXISTS(SELECT NULL FROM sys.resource_governor_workload_groups WHERE [name] = 'WG_APPREPORT')) DROP WORKLOAD GROUP [WG_APPREPORT] GO IF (EXISTS(SELECT NULL FROM sys.resource_governor_resource_pools WHERE [name] = 'RP_APPREPORT')) DROP RESOURCE POOL [RP_APPREPORT] GO IF (OBJECT_ID('dbo.Fn_classificaACESSOAPP') IS NOT NULL) DROP FUNCTION dbo.Fn_classificaACESSOAPP GO CREATE RESOURCE POOL [RP_APPOLTP] WITH ( MIN_CPU_PERCENT=0, MAX_CPU_PERCENT=10, CAP_CPU_PERCENT=10, MIN_MEMORY_PERCENT=0, MAX_MEMORY_PERCENT=20, AFFINITY SCHEDULER = AUTO, MIN_IOPS_PER_VOLUME=0, MAX_IOPS_PER_VOLUME=200 ) GO CREATE RESOURCE POOL [RP_APPREPORT] WITH ( MIN_CPU_PERCENT=0, MAX_CPU_PERCENT=20, CAP_CPU_PERCENT=20, MIN_MEMORY_PERCENT=0, MAX_MEMORY_PERCENT=10, AFFINITY SCHEDULER = AUTO, MIN_IOPS_PER_VOLUME=0, MAX_IOPS_PER_VOLUME=200 ) GO CREATE WORKLOAD GROUP [WG_APPOLTP] WITH ( GROUP_MAX_REQUESTS=0, IMPORTANCE=LOW, REQUEST_MAX_CPU_TIME_SEC=2, REQUEST_MAX_MEMORY_GRANT_PERCENT=5, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0 ) USING [RP_APPOLTP] GO CREATE WORKLOAD GROUP [WG_APPREPORT] WITH ( GROUP_MAX_REQUESTS=0, IMPORTANCE=LOW, REQUEST_MAX_CPU_TIME_SEC=2, REQUEST_MAX_MEMORY_GRANT_PERCENT=5, REQUEST_MEMORY_GRANT_TIMEOUT_SEC=0, MAX_DOP=0 ) USING [RP_APPREPORT] GO USE MASTER GO CREATE FUNCTION dbo.Fn_classificaACESSOAPP() RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @retorna sysname SET @retorna = 'default' -- Se nao for nenhum dos dois usuarios, o sql server irá usar o WorkLoad Default IF (SUSER_NAME() = 'APPOLTP') SET @retorna = 'WG_APPOLTP' -- case sensitive ELSE IF (SUSER_NAME() = 'APPREPORT') SET @retorna = 'WG_APPREPORT' -- case sensitive RETURN @retorna END GO ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=dbo.Fn_classificaACESSOAPP) GO ALTER RESOURCE GOVERNOR RECONFIGURE GO