Alguns meses atrás, enfrentei uma situação semelhante em que a configuração MAXDOP era padrão e uma consulta de execução esgotava todos os threads de trabalho.
Como Remus apontou, isso é chamado de privação de threads de trabalho .
Haverá um despejo de memória criado no seu servidor quando essa condição ocorrer.
Se você estiver no 2008R2 + SP1 e superior, sys.dm_server_memory_dumps
também fornecerá o local do arquivo de despejo.
Agora, de volta ao problema:
Há um encadeamento de monitor do agendador por nó NUMA e, como você possui 2 nós NUMA, haverá 2 encadeamentos de monitor agendadores responsáveis pela verificação de integridade de todos os agendadores a cada 60 segundos para esse nó NUMA específico, assegurando que o agendador esteja travado ou não.
Cada vez que uma nova solicitação de trabalho é retirada da fila de trabalho dos agendadores, o contador de processos de trabalho é incrementado. Portanto, se o planejador tiver uma solicitação de trabalho na fila e não processar uma das solicitações de trabalho em 60 segundos, o planejador será considerado travado.
Devido a uma consulta de fuga ou paralelismo extensivo, surge uma condição de encadeamentos de trabalho esgotados, pois todos os encadeamentos são ocupados por essa consulta de fuga única ou bloqueio prolongado excessivo e nenhum trabalho pode ser feito a menos que o processo incorreto seja interrompido.
Sua melhor aposta é ajustar primeiro a configuração de Max Degree of Parallelism . Padrão de0
, o SQL Server pode usar todas as CPUs disponíveis para processamento paralelo e esgotar todos os threads de trabalho.
Há muitos motivos que podem levar à exaustão dos threads de trabalho:
- Cadeias de bloqueio longas e extensas, causando o SQL Server ficar sem threads de trabalho
- Paralelismo extenso também levando ao esgotamento dos threads de trabalho
- Espera extensa por qualquer tipo de "trava" - fechos, trincos. Um spinlock órfão é um exemplo.
Consulte a minha resposta aqui que mostrará como você pode calcular o valor MAXDOP para sua instância do servidor.
Além disso, é altamente recomendável que você comece a coletar informações de estatísticas de espera sobre a instância do servidor de banco de dados.
max degree of parallelism
configurado e quantos processadores você possui atualmente no servidor junto com a configuração do NUMA? Você pode usar acoreinfo.exe
partir de sysinternals para descobrir o número de processadores e a configuração NUMA.