Controlar recursos do SQL Server
Enquanto alguns SQL Servers ou instâncias gerenciadas do SQL do Azure são dedicados aos bancos de dados de um único aplicativo, uma configuração frequentemente vista em aplicativos de missão crítica, muitos servidores oferecem suporte a bancos de dados para vários aplicativos com requisitos de desempenho variáveis e ciclos de carga de trabalho de pico. Equilibrar esses diferentes requisitos pode ser um desafio para os administradores. Uma maneira eficaz de gerenciar recursos do servidor é usando o Administrador de Recursos, introduzido no SQL Server 2008.
O Administrador de Recursos é um recurso nas instâncias gerenciadas SQL Server e Azure SQL que permite controle granular sobre CPU, E/S física e recursos de memória para solicitações de aplicativos 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 as 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.
Conjuntos 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 quaisquer pools de recursos definidos explicitamente, pode ser configurado com limites para os recursos que eles podem usar. Para cada pool não interno, você pode especificar os seguintes limites:
- Percentagem mínima / máxima de CPU
- Limite da percentagem de CPU
- Percentagem de memória mínima/máxima
- Afinidade do nó NUMA
- IOPs mínimas/máximas por volume
Nota
As alterações em um pool de recursos afetam apenas as novas sessões, não as já em andamento. Portanto, modificar um pool não restringirá os recursos de um processo de longa execução. A exceção a essa regra são os pools externos usados com os Serviços de Aprendizado de Máquina 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. A porcentagem de CPU min/max 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 classificador é executada no momento em que uma conexão é estabelecida com a instância do SQL Server e classifica cada conexão em um determinado grupo de carga 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 todas as conexões, ele deve ser testado quanto à eficiência. A imagem a seguir mostra uma função de classificador de exemplo que classifica os usuários com base em seu 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 Administrador de Recursos
O Administrador de Recursos é 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 Administrador de Recursos para limitar os recursos usados por operações de manutenção, como verificações de consistência e reconstruções de índice, para tentar garantir recursos suficientes para consultas do usuário durante as janelas de manutenção.