Recebi uma ligação ontem de um cliente reclamando do alto uso da CPU em seu SQL Server. Estamos usando o SQL Server 2012 SE de 64 bits. O servidor está executando o Windows Server 2008 R2 Standard, Intel Xeon de 2,20 GHz (4 núcleos), 16 GB de RAM.
Depois de ter certeza de que o culpado era de fato o SQL Server, dei uma olhada nas principais esperas da instância usando a consulta DMV aqui . As duas primeiras esperas foram: (1) PREEMPTIVE_OS_DELETESECURITYCONTEXT
e (2) SOS_SCHEDULER_YIELD
.
EDIT : Aqui está o resultado da "consulta de espera superior" (embora alguém tenha reiniciado o servidor esta manhã contra minha vontade):
Fazemos muitos cálculos/conversões intensos, para que eu possa entender SOS_SCHEDULER_YIELD
. No entanto, estou muito curioso sobre o PREEMPTIVE_OS_DELETESECURITYCONTEXT
tipo de espera e por que pode ser o mais alto.
A melhor descrição/discussão que posso encontrar sobre esse tipo de espera pode ser encontrada aqui . Ele menciona:
Os tipos de espera PREEMPTIVE_OS_ são chamadas que deixaram o mecanismo de banco de dados, geralmente para uma API Win32, e executam código fora do SQL Server para várias tarefas. Neste caso, está excluindo um contexto de segurança usado anteriormente para acesso remoto a recursos. A API relacionada é, na verdade, chamada DeleteSecurityContext()
Que eu saiba, não temos nenhum recurso externo, como servidores vinculados ou tabelas de arquivos. E não fazemos nenhuma representação, etc. Um backup pode ter causado esse pico ou talvez um controlador de domínio com defeito?
O que diabos poderia fazer com que esse seja o tipo de espera dominante? Como posso rastrear esse tipo de espera ainda mais?
Editar 2: verifiquei o conteúdo do log de segurança do Windows. Vejo algumas entradas que podem ser interessantes, mas não tenho certeza se são normais:
Special privileges assigned to new logon.
Subject:
Security ID: NT SERVICE\MSSQLServerOLAPService
Account Name: MSSQLServerOLAPService
Account Domain: NT Service
Logon ID: 0x3143c
Privileges: SeImpersonatePrivilege
Special privileges assigned to new logon.
Subject:
Security ID: NT SERVICE\MSSQLSERVER
Account Name: MSSQLSERVER
Account Domain: NT Service
Logon ID: 0x2f872
Privileges: SeAssignPrimaryTokenPrivilege
SeImpersonatePrivilege
Editar 3 : @Jon Seigel, como você solicitou, aqui estão os resultados de sua consulta. Um pouco diferente do de Paulo:
Edit 4: Admito que sou um usuário de eventos estendidos pela primeira vez. Adicionei esse tipo de espera ao evento wait_info_external e vi centenas de entradas. Não há texto sql ou identificador de plano, apenas uma pilha de chamadas. Como posso rastrear ainda mais a fonte?
Eu sei que esta questão, com base no título, está principalmente preocupada com o tipo de espera PREEMPTIVE_OS_DELETESECURITYCONTEXT, mas acredito que seja um desvio do verdadeiro problema que é " um cliente que estava reclamando de alto uso de CPU em seu SQL Server ".
A razão pela qual acredito que o foco nesse tipo de espera específico é uma busca inútil é porque ele aumenta a cada conexão feita. Estou executando a seguinte consulta no meu laptop (o que significa que sou o único usuário):
E então eu faço qualquer um dos seguintes e executo novamente esta consulta:
SQLCMD -E -Q "select 1"
Agora, sabemos que a CPU está alta, então devemos olhar o que está rodando para ver quais sessões têm CPU alta:
Normalmente, executo a consulta acima como está, mas você também pode alternar qual cláusula ORDER BY é comentada para ver se isso fornece resultados mais interessantes/úteis.
Como alternativa, você pode executar o seguinte, com base em dm_exec_query_stats, para localizar as consultas de custo mais alto. A primeira consulta abaixo mostrará consultas individuais (mesmo que tenham vários planos) e é ordenada por Average CPU Time, mas você pode facilmente alterar isso para Average Logical Reads. Depois de encontrar uma consulta que parece estar consumindo muitos recursos, copie "sql_handle" e "statement_start_offset" na condição WHERE da segunda consulta abaixo para ver os planos individuais (pode ser mais de 1). Role para a extrema direita e supondo que haja um plano XML, ele será exibido como um link (no modo de grade) que o levará ao visualizador do plano se você clicar nele.
Consulta nº 1: obter informações da consulta
Consulta nº 2: obter informações do plano
O SecurityContext é usado pelo servidor SQL em vários lugares. Um exemplo que você nomeou são os servidores vinculados e as tabelas de arquivos. Talvez você esteja usando cmdexec? Trabalhos do SQL Server Agent com contas proxy? Chamando um webservice? Recursos remotos podem ser muitas coisas engraçadas.
Os eventos de representação podem ser registrados no evento de segurança do Windows. Pode ser que você esteja encontrando uma pista lá. Além disso, você pode querer verificar o gravador de caixa preta, também conhecido como eventos estendidos.
Você verificou se esses Wait-Types são novos (e em conexão com a alta CPU) ou apenas normais para o seu servidor?