Quando estou rastreando esperas com sp_BlitzFirst, recebo este detalhe:
<?ClickToSeeDetails --
For 20 seconds over the last 5 seconds, SQL Server was waiting on this
particular bottleneck.
-- ?>
Deveria ler "por 20 vezes nos últimos 5 segundos?" A descoberta foi CLR_SEMAPHORE.
Não - as estatísticas de espera podem (e na maioria das vezes, irão) totalizar mais do que o tempo físico gasto para o próprio servidor.
Imagine uma situação em que 2 threads separados gastam o mesmo segundo esperando por algum recurso - você teria 2 segundos de tempo de espera para 1 segundo de tempo do relógio.
Cada thread tem suas próprias esperas - a mensagem está informando que 20 segundos de tempo de espera para esse recurso específico ocorreram nos últimos 5 segundos do relógio.
Ou, em outras palavras, cada núcleo pode executar várias consultas ao mesmo tempo, e vários núcleos podem gerar ainda mais esperas. Ou seja, a unidade é realmente thread·segundos, não segundos.
Também pode ser útil trabalhar com um exemplo. Considere os três estados mais comuns para um trabalhador :
Trabalhadores com estado de
RUNNING
podem gerar tempo de espera. Por exemplo, se o trabalhador precisar executar código no sistema operacional em vez de no SQLOS, ele poderá entrar em uma espera preventiva ou externa. Durante esse tempo, ele estará executando o código em sua CPU associada, mas ainda estará gerando tempo de espera.Trabalhadores com um estado de
RUNNABLE
podem gerar tempo de espera (até onde eu sei, eles sempre fazem). Se o trabalhador foi sinalizado que um recurso estava disponível, ele pode acumular o tempo de espera do sinal com base na última espera. Se o trabalhador esgotou seu quantum anterior de 4 ms, ele pode acumularSOS_SCHEDULER_YIELD
tempo de espera.Trabalhadores com estado de
SUSPENDED
podem gerar tempo de espera. Considere um trabalhador que está esperando por um bloqueio. Ele irá gerar um tempo de espera até que seja sinalizado que o recurso de bloqueio que ele precisa está disponível. Alguns trabalhadores suspensos não geram tempo de espera, incluindo aqueles não associados a uma tarefa.Minha área de trabalho tem quatro núcleos lógicos, portanto, a contagem máxima de trabalhadores padrão é 512 . É quase certamente impraticável, mas nesta máquina eu poderia teoricamente gerar 512 segundos de tempo de espera por segundo se conseguisse fazer com que todos os trabalhadores esperassem algo de uma só vez. À medida que a contagem de núcleos/trabalhadores aumenta, esse número pode ficar ainda maior.
Você pode ver mais de um segundo de esperas por segundo, mesmo que não esteja executando nenhuma consulta no SQL Server. Na minha máquina, a seguinte consulta parece gerar entre 9 e 14 linhas:
Posso tirar um instantâneo do tempo total de espera desde a última vez que reiniciei o servidor e compará-lo com um novo total depois de esperar dez segundos:
Às vezes a matemática dá certo. A última vez que executei o delta foi de 101339 ms. Em outras palavras, tive mais de 10 segundos de espera por segundo apenas nas tarefas do sistema.