Controlar os recursos do SQL Server
Embora alguns SQL Servers ou instâncias gerenciadas de SQL do Azure sejam dedicados a bancos de dados de um único aplicativo, uma configuração frequentemente vista em aplicativos críticos, muitos servidores dão suporte a bancos de dados para vários aplicativos com requisitos de desempenho variados e ciclos de carga de trabalho de pico. Balancear esses requisitos diferentes pode ser um desafio para os administradores. Uma maneira eficaz de gerenciar recursos do servidor é usando o Resource Governor, introduzido no SQL Server 2008.
O Resource Governor é um recurso em instâncias gerenciadas de SQL Server e SQL do Azure que permitem controle granular sobre recursos de CPU, E/S física e memória para solicitações de aplicativo de entrada. Quando habilitado no nível da instância, o Administrador de Recursos usa uma função de classificador para definir como as conexões são tratadas, subdividindo sessões em grupos de carga de trabalho. Cada grupo de carga de trabalho é configurado para usar um pool específico de recursos do sistema.
Pools de recursos
Um pool de recursos representa os recursos físicos disponíveis no servidor. O SQL Server sempre tem dois pools: padrão e interno, mesmo quando o Administrador de Recursos não está habilitado. O pool interno é reservado para funções críticas do SQL Server e não pode ser restrito. O pool padrão, juntamente com todos os pools de recursos definidos explicitamente, pode ser configurado com limites nos recursos que eles podem usar. Para cada pool não interinternal, você pode especificar os seguintes limites:
- Percentual mínimo/máximo de CPU
- Limite de percentual de CPU
- Percentual mínimo/máximo de memória
- Afinidade do nó NUMA
- Mínimo/máximo de IOPS por volume
Observação
As alterações em um pool de recursos afetam apenas novas sessões, não aquelas que já estão em andamento. Portanto, modificar um pool não restringirá os recursos de um processo de execução prolongada. A exceção a essa regra são pools externos usados com os Serviços de Machine Learning do SQL Server, que podem ser limitados por uma alteração de pool mesmo para sessões em andamento.
Todas as configurações do pool de recursos, exceto a porcentagem mínima e máxima da CPU, representam limites rígidos que não podem ser excedidos. O percentual mínimo/máximo de CPU só se aplica quando há contenção de CPU. Por exemplo, se você definir um máximo de 70%, a carga de trabalho poderá usar até 100% de ciclos de CPU disponíveis quando não houver contenção. No entanto, se outras cargas de trabalho estiverem em execução, a carga de trabalho será restrita a 70%.
Grupo de carga de trabalho
Um grupo de carga de trabalho serve como um contêiner para solicitações de sessão, classificadas pela função de classificador. Semelhante aos pools de recursos, há dois grupos internos: padrão e interno. Cada grupo de carga de trabalho está associado a um único pool de recursos, mas um pool de recursos pode hospedar vários grupos de carga de trabalho. Por padrão, todas as conexões são direcionadas para o grupo de carga de trabalho padrão, a menos que a função de classificador as atribua a um grupo definido pelo usuário. O grupo de carga de trabalho padrão utiliza os recursos alocados para o pool de recursos padrão.
Função de Classificador
A função de classificação é executada no momento que uma conexão é estabelecida com a instância do SQL Server e classifica cada conexão em um determinado grupo de cargas de trabalho. Se a função retornar um NULL, padrão ou o nome do grupo de carga de trabalho inexistente, a sessão será transferida para o grupo de carga de trabalho padrão. Como o classificador é executado em cada conexão, sua eficiência deve ser testada. A imagem a seguir mostra uma função de classificador de exemplo que classifica os usuários com base no nome de usuário.
CREATE FUNCTION dbo.RGClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup AS SYSNAME
IF(SUSER_NAME() = 'ReportUser')
SET @WorkloadGroup = 'ReportServerGroup'
ELSE IF (SUSER_NAME() = 'PrimaryUser')
SET @WorkloadGroup = 'PrimaryServerGroup'
ELSE
SET @WorkloadGroup = 'default'
RETURN @WorkloadGroup
END
Você pode aumentar a complexidade da definição de função mostrada no exemplo, mas deve verificar se a função mais complexa não afeta o desempenho do usuário.
Casos de uso do Resource Governor
O Resource Governor é usado principalmente em cenários multilocatários em que um grupo de bancos de dados compartilha uma única instância do SQL Server e o desempenho precisa ser mantido consistente para todos os usuários do servidor. Você também pode usar o Resource Governor para limitar os recursos usados por operações de manutenção, como verificações de consistência e rebuilds de índice, para tentar garantir recursos suficientes para consultas de usuário durante as janelas de manutenção.