Estou tentando configurar o Resource Governor para limitar IOPS para processos em execução usando trabalhos de agente SQL. A função do classificador é definida para identificar um login específico (qualquer spid que esteja sendo executado usando esse login deve usar o grupo de recursos ao qual está atribuído). Em seguida, adicionei EXECUTE AS LOGIN = 'ResourceGovernerUser'
no trabalho, mas não consigo fazê-lo funcionar e ele volta para o pool padrão porque os trabalhos são 'EXECUTED AS 'ServiceAccount''
. Embora se eu olhar para os processos ativos usando sp_WhoisActive
, o nome de login é exibido como 'ResourceGovernerUser'
em vez da conta de serviço. Então modifiquei a função do classificador para usar a conta de serviço e funcionou. Eu verifiquei isso usando os contadores perfmon 'Disk Read IO/Sec'
e 'Disk Write IO/Sec'
sob 'Resource Pool Stats'
object.
A questão é - como faço para que o Administrador de Recursos use um login diferente da Conta de Serviço (quando usado com trabalhos de agente)? Eu tenho algumas ideias feias não testadas, como - executar os trabalhos usando um proxy CmdExec ou PowerShell. Se alguém se deparou com uma situação semelhante ou tiver alguma idéia melhor, eu realmente aprecio isso. Obrigada.
--Example Setup:
USE [master]
GO
CREATE RESOURCE POOL [SqlJobPool] WITH(
min_iops_per_volume=1,
max_iops_per_volume=5000);
GO
CREATE WORKLOAD GROUP [IOGroup]
USING [SqlJobPool];
GO
CREATE FUNCTION [dbo].[fn_LimitedIO]()
RETURNS SYSNAME WITH SCHEMABINDING
AS
BEGIN
DECLARE @grp SYSNAME;
IF SUSER_NAME() = N'ResourceGovernerUser' -- When this is set to the Service Account, it works
BEGIN
SET @grp = N'IOGroup';
END
ELSE
BEGIN
SET @grp = N'default';
END
RETURN @grp;
END
GO
ALTER RESOURCE GOVERNOR with (CLASSIFIER_FUNCTION = dbo.fn_LimitedIO);
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO
--Within the Agent job
EXECUTE AS Login = 'ResourceGovernerUser'
EXECUTE SomeSQLStuff
As funções do classificador do administrador de recursos são executadas apenas durante o processo de Login. A representação via
EXECUTE AS
não aciona a função de classificador.EXECUTE AS
é como o SQL Server Agent executa trabalhos no contexto de outro logon ou usuário.Especificar o
Run As ...
usuário ou modificar oJob Owner
não altera como o SQL Server Agent efetua login no SQL Server. A única maneira de fazer com que os trabalhos do agente do SQL Server sejam executados em um grupo de recursos específico com uma função de classificador que analisa apenas o nome do usuário é colocar a conta de serviço do SQL Server Agent em seu próprio grupo de recursos.Como os testes são uma ótima maneira de entender o que realmente está acontecendo, criei um pequeno banco de testes. Não execute isso em um sistema de produção, pois isso modificará a configuração do grupo de recursos.
Isso cria a função de classificador e vários grupos de recursos anexados a um pool de recursos de teste:
Aqui, criaremos um login e permitiremos que
VIEW SERVER STATE
possamos dizer a qual grupo de recursos a sessão foi atribuída.Isso cria um trabalho do SQL Server Agent em que o "proprietário" é definido para o logon que acabamos de criar. Como o logon não é membro do sysadmin, o agente do SQL Server executará esse trabalho no contexto desse logon.
Os resultados da tabela de histórico do msdb para o trabalho acima:
Em seguida, criaremos um usuário para o logon e executaremos uma nova versão do trabalho usando a
Run As
opção nas propriedades avançadas da Etapa de Trabalho do SQL Server.A saída dessa execução do trabalho:
Isso limpa a configuração do administrador de recursos e elimina a função de classificador e o login.
Em ambos os conjuntos de resultados acima, você pode ver a função classificadora do Resource Governor colocar cada trabalho no
AgentServiceAccountGroup
grupo; isso ocorre porque o SQL Server Agent inicialmente faz logon no SQL Server usando a conta de serviço usada quando o SQL Server Agent é inicializado.