Introdução: SQL Scheduler (Cooperative Mode) SQL Thread Yield: SQL Scheduler Yield
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.
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.
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..??? http://dbaninja.com/?m=201002
New concurrency and scheduling diagnostics have been added to SQL Server http://support.microsoft.com/kb/319892
How To Diagnose and Correct Errors 17883, 17884, 17887, and 17888 http://technet.microsoft.com/en-us/library/cc917684.aspx
Excelente Fabrício,
Artigo de alto nível meus parabéns.
Grande Abraço
Obrigado pelo comentário!