Travamento do SQL Scheduler (Scheduler Hang)

Introdução: SQL Scheduler (Cooperative Mode)

SQL Thread Yield: SQL Scheduler Yield

Apesar do SQL Scheduler ser o componente responsável pelo gerenciamento de threads do SQL Server, as threads são as principais responsáveis pelo funcionamento balanceado no modo cooperativo. Cada thread determina o tempo necessário para rodar parte da sua tarefa e, em seguida, passa o controle para a próxima thread disponível.

image

Essa arquitetura interna do SQL Server garante desempenho e escalabilidade. Por outro lado, existem situações problemáticas nas quais uma thread não realiza a operação de YIELD corretamente. Nesse caso, cria-se a situação de monopólio do Scheduler e somente uma única thread fica rodando – as demais threads ficam esperando para executar.

 

image

Essa é a situação chamada de Travamento do Scheduler (em inglês, Scheduler Hang). Quando isso ocorre, mensagens de erro 17883 aparecem no ERRORLOG para notificar o DBA sobre o problema.

 

Como resolver esse tipo de problema?

Para determinar a causa do problema, é importante descobrir qual a thread que está monopolizando o Scheduler. O primeiro passo é abrir o arquivo do ERRORLOG para colher as informações iniciais. No exemplo a seguir, a sessão SPID=51 (Thread=0xdbc) monopolizou o Scheduler 1.

Process 51:0:0 (0xdbc) Worker 0x036BA0E8 appears to be non-yielding on Scheduler 1. Thread creation time: 12764721496978. Approx Thread CPU Used: kernel 15 ms, user 171 ms. Process Utilization 0%. System Idle 99%. Interval: 325602683 ms.

Para determinar a causa do problema, é imprescindível realizar a análise de memória através de Memory Dump. Um arquivo com extensão MDMP será gerado no diretório de Log e pode ser aberto com o auxílio da ferramenta WinDBG para analisar a CallStack do problema. Exemplos:

 

1) Bug no Stack de I/O (Windows): A causa mais provável é um driver de Disco/Storage

NTDLL!NtWriteFileGather
KERNEL32!WriteFileGather
ums!UmsScheduler::GatherWriteAsync
sqlservr!UmsGatherWriteAsync
sqlservr!FCB::GatherWrite

 

2) Antivirus interceptando chamadas do Windows: Interferência no SQL Scheduler

NTDLL!ZwQueryVirtualMemory+0xb
KERNEL32!VirtualQueryEx+0x1b
KERNEL32!VirtualQuery+0x13
MyVirusScanner+0x36c3
MyVirusScanner+0x34d0
MyVirusScanner+0x117e
ADVAPI32!CryptAcquireContextW+0xb8
sqlservr!SecureHash+0x117
sqlservr!FEvalPasswdW+0x35
sqlservr!FCheckPswd+0xe4
sqlservr!FindLogin+0x417
sqlservr!login+0x20f
sqlservr!process_login+0x7d
sqlservr!process_commands+0x201

 

3) Problemas no Buffer Pool (BPool), quando a memória está paginada (PageFile).

sqlservr!BPool::ReplenishFreeList+0x10d
sqlservr!BPool::Steal+0x3ec
sqlservr!SQLSinglePageAllocator::AllocatePages+0x25
sqlservr!MemoryNode::AllocatePagesInternal+0xce
sqlservr!MemoryClerkInternal::AllocatePages+0x6e
sqlservr!CVarPageMgr::PviNewVarPage+0x56
sqlservr!CVarPageMgr::PbAllocate+0x3ce
sqlservr!CMemObj::Alloc+0xcc
sqlservr!operator new+0x26
sqlservr!operator new[]+0x23
sqlservr!CErrorReportingManager::CwchFormatToBuffer+0x180
sqlservr!CErrorReportingManager::CwchCallFormatToBuffer+0x18
sqlservr!CLoginClientInfo::CLoginClientInfo+0x71
sqlservr!IssueLoginSuccessReport+0x67
sqlservr!login+0x584
sqlservr!process_login+0xee
sqlservr!process_commands+0x40d
sqlservr!SOS_Task::Param::Execute+0xee
sqlservr!SOS_Scheduler::RunTask+0xc9
sqlservr!SOS_Scheduler::ProcessTasks+0xb4

 

Causa do Problema

O desenvolvedor é incapaz de escrever uma query em T-SQL que causa problemas no gerenciamento de thread. Travamentos do Scheduler são problemas decorrentes de bug do SQL Server, Windows ou falhas de Hardware.

 

Referências

Leivio Fontenele - O que é SQLOS..???
https://dbaninja.com/?m=201002

New concurrency and scheduling diagnostics have been added to SQL Server
https://support.microsoft.com/kb/319892

How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888
https://technet.microsoft.com/en-us/library/cc917684.aspx