Partilhar via


Configuração do servidor: máximo de threads de trabalho

Aplica-se a:SQL Server

Este artigo descreve como configurar a opção de configuração do servidor no SQL Server usando o max worker threads SQL Server Management Studio ou o Transact-SQL. A max worker threads opção configura o número de threads de trabalho disponíveis em todo o SQL Server para processar solicitações de consulta, logon, logout e solicitações de aplicativos semelhantes.

O SQL Server usa os serviços de thread nativos dos sistemas operacionais para garantir as seguintes condições:

  • Um ou mais threads oferecem suporte simultâneo a cada rede suportada pelo SQL Server.
  • Um thread lida com pontos de verificação de banco de dados.
  • Um conjunto de threads gere todos os utilizadores.

O valor padrão para max worker threads é 0. Isso permite que o SQL Server configure automaticamente o número de threads de trabalho na inicialização. A configuração padrão é melhor para a maioria dos sistemas. No entanto, dependendo da configuração do sistema, a definição max worker threads de um valor específico às vezes melhora o desempenho.

Limitações

O número real de solicitações de consulta pode exceder o valor definido em max worker threads, caso em que o SQL Server agrupa os threads de trabalho para que o próximo thread de trabalho disponível possa lidar com a solicitação. Um thread de trabalho é atribuído somente a solicitações ativas e é liberado assim que a solicitação é atendida. Isso acontece mesmo se a sessão/conexão do usuário na qual a solicitação foi feita permanecer aberta.

A max worker threads opção de configuração do servidor não limita todos os threads que podem ser gerados dentro do mecanismo. Os threads do sistema necessários para tarefas como LazyWriter, Checkpoint, Log Writer, Service Broker, Lock Manager ou outros são gerados fora desse limite. Os Grupos de Disponibilidade usam alguns dos threads de trabalho internos do max worker thread limit, mas também utilizam threads de sistema (consulte Uso de threads por grupos de disponibilidade). Se o número de threads configurados estiver sendo excedido, a consulta a seguir fornecerá informações sobre as tarefas do sistema que geraram os threads adicionais.

SELECT s.session_id,
    r.command,
    r.status,
    r.wait_type,
    r.scheduler_id,
    w.worker_address,
    w.is_preemptive,
    w.state,
    t.task_state,
    t.session_id,
    t.exec_context_id,
    t.request_id
FROM sys.dm_exec_sessions AS s
    INNER JOIN sys.dm_exec_requests AS r
        ON s.session_id = r.session_id
    INNER JOIN sys.dm_os_tasks AS t
        ON r.task_address = t.task_address
    INNER JOIN sys.dm_os_workers AS w
        ON t.worker_address = w.worker_address
WHERE s.is_user_process = 0;

Recomendações

Esta opção é uma opção avançada e deve ser alterada apenas por um profissional de banco de dados experiente.

Se você suspeitar que há um problema de desempenho, provavelmente não é a disponibilidade de threads de trabalho. A causa está mais provavelmente relacionada a atividades que ocupam os fios de trabalho e não os liberam. Os exemplos incluem consultas de longa duração ou gargalos no sistema (E/S, bloqueio, espera de trava, espera de rede) que causam consultas de longa espera. É melhor encontrar a causa raiz de um problema de desempenho antes de alterar a configuração max worker threads. Para obter mais informações sobre como avaliar o desempenho, consulte Monitorar e ajustar o desempenho.

O pool de threads ajuda a otimizar o desempenho quando um grande número de clientes se conecta ao servidor. Normalmente, um thread de sistema operacional separado é criado para cada solicitação de consulta. No entanto, com centenas de conexões com o servidor, o uso de um thread por solicitação de consulta pode consumir grandes quantidades de recursos do sistema. A max worker threads opção permite que o SQL Server crie um pool de threads de trabalho para atender a um número maior de solicitações de consulta, o que melhora o desempenho.

A tabela a seguir mostra o número configurado automaticamente de threads de trabalho máximo (quando o valor é definido como 0), com base em várias combinações de CPUs lógicas, arquitetura de computador e versões do SQL Server, usando a fórmula: Default Max Workers + ((CPUs lógicas - 4) * Workers per CPU).

Número de CPUs lógicas Computador de 32 bits (até SQL Server 2014 (12.x)) Computador de 64 bits (até SQL Server 2016 (13.x) SP1) Computador de 64 bits (a partir do SQL Server 2016 (13.x) SP2 e do SQL Server 2017 (14.x))
<= 4 256 512 512
8 288 576 576
16 352 704 704
32 480 960 960
64 736 1472 1472
128 1248 2496 4480
256 2272 4544 8576

Até o SQL Server 2016 (13.x) com Service Pack 1, os Trabalhadores por CPU dependem apenas da arquitetura (32 bits ou 64 bits):

Número de CPUs lógicas Computador de 32 bits † Computador de 64 bits
<= 4 256 512
> 4 256 + ((CPUs lógicas - 4) * 8) 512 †† + ((CPUs lógicas - 4) * 16)

A partir do SQL Server 2016 (13.x), o SQL Server não pode mais ser instalado em um sistema operacional de 32 bits. Os valores de computador de 32 bits são listados para a assistência de clientes que executam o SQL Server 2014 (12.x) e versões anteriores. Recomendamos 1.024 como o número máximo de threads de trabalho para uma instância do SQL Server em execução em um computador de 32 bits.

†† A partir do SQL Server 2017 (14.x), o valor Default Max Workers é dividido por 2 para máquinas com menos de 2 GB de memória.

A partir do SQL Server 2016 (13.x) SP2 e do SQL Server 2017 (14.x), os Trabalhadores por CPU dependem da arquitetura e do número de processadores (entre 4 e 64 ou maior que 64):

Número de CPUs lógicas Computador de 32 bits † Computador de 64 bits
<= 4 256 512
> 4 e <= 64 256 + ((CPUs lógicas - 4) * 8) 512 †† + ((CPUs lógicas - 4) * 16)
> 64 256 + ((CPUs lógicas - 4) * 32) 512 †† + ((CPUs lógicas - 4) * 32)

A partir do SQL Server 2016 (13.x), o SQL Server não pode mais ser instalado em um sistema operacional de 32 bits. Os valores de computador de 32 bits são listados para a assistência de clientes que executam o SQL Server 2014 (12.x) e versões anteriores. Recomendamos 1.024 como o número máximo de threads de trabalho para uma instância do SQL Server em execução em um computador de 32 bits.

†† A partir do SQL Server 2017 (14.x), o valor Default Max Workers é dividido por 2 para máquinas com menos de 2 GB de memória.

Sugestão

Para obter mais informações sobre como usar mais de 64 CPUs lógicas, consulte Práticas recomendadas para executar o SQL Server em computadores com mais de 64 CPUs.

Quando todos os threads de trabalho estão ativos com consultas de longa execução, o SQL Server pode parecer não responder até que um thread de trabalho seja concluído e fique disponível. Embora esse comportamento não seja um defeito, às vezes pode ser indesejável. Se um processo parecer não responder e nenhuma nova consulta puder ser processada, conecte-se ao SQL Server usando a conexão de administrador dedicado (DAC) e mate o processo. Para evitar isso, aumente o número máximo de threads de trabalho.

Permissões

As permissões de execução em sp_configure sem parâmetros ou apenas com o primeiro parâmetro são concedidas a todos os usuários por padrão. Para executar sp_configure com ambos os parâmetros para alterar uma opção de configuração ou executar a RECONFIGURE instrução, um usuário deve receber a permissão no nível do ALTER SETTINGS servidor. As funções fixas de servidor ALTER SETTINGS e serveradmin mantêm implicitamente a permissão.

Utilizar o SQL Server Management Studio (SSMS)

  1. No Pesquisador de Objetos, clique com o botão direito do mouse em um servidor e selecione Propriedades.

  2. Selecione o nodo Processadores.

  3. Na caixa Max worker threads , digite ou selecione um valor de 128 a 65.535.

Sugestão

Use a max worker threads opção para configurar o número de threads de trabalho disponíveis para processos do SQL Server. A configuração padrão para max worker threads é melhor para a maioria dos sistemas. No entanto, dependendo da configuração do sistema, a configuração max worker threads para um valor menor às vezes melhora o desempenho. Para obter mais informações, consulte a seção Recomendações neste artigo.

Utilize o Transact-SQL

  1. Conecte-se ao Mecanismo de Banco de Dados.

  2. Na barra Padrão, selecione Nova consulta.

  3. Copie e cole o exemplo a seguir na janela de consulta e selecione Executar. Este exemplo mostra como usar sp_configure para configurar a max worker threads opção para 900.

    USE master;
    GO
    
    EXECUTE sp_configure 'show advanced options', 1;
    GO
    
    RECONFIGURE;
    GO
    
    EXECUTE sp_configure 'max worker threads', 900;
    GO
    
    RECONFIGURE;
    GO
    
    EXECUTE sp_configure 'show advanced options', 0;
    GO
    
    RECONFIGURE;
    GO
    

A alteração entrará em vigor imediatamente após a execução de RECONFIGURE, sem exigir que o Mecanismo de Banco de Dados seja reiniciado.