Ontem recebi uma ligação de um cliente que estava reclamando sobre o alto uso da CPU no SQL Server. Estamos usando o SQL Server 2012 de 64 bits SE. 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 me certificar de que o culpado era de fato o SQL Server, observei as principais esperas da instância usando a consulta DMV aqui . As duas principais esperas foram: (1) PREEMPTIVE_OS_DELETESECURITYCONTEXT
e (2) SOS_SCHEDULER_YIELD
.
Edição : Aqui está o resultado da "consulta superior aguarda" (embora alguém tenha reiniciado o servidor esta manhã contra a minha vontade):
Fazemos muitos cálculos / conversões intensas, para que eu possa entender SOS_SCHEDULER_YIELD
. No entanto, estou muito curioso sobre o PREEMPTIVE_OS_DELETESECURITYCONTEXT
tipo de espera e por que ele pode ser o mais alto.
A melhor descrição / discussão que posso encontrar sobre esse tipo de espera pode ser encontrada aqui . Menciona:
Os tipos de espera PREEMPTIVE_OS_ são chamadas que deixaram o mecanismo de banco de dados, normalmente para uma API Win32, e executam código fora do SQL Server para várias tarefas. Nesse caso, ele 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 recursos externos, como servidores vinculados ou tabelas de arquivos. E não fazemos representação etc. O backup pode ter causado um pico ou talvez um controlador de domínio com defeito?
O que diabos poderia fazer com que este seja o tipo de espera dominante? Como posso acompanhar ainda mais esse tipo de espera?
Edição 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, conforme solicitado, eis os resultados da sua consulta. Um pouco diferente do de Paulo:
Edição 4: Admito que sou o primeiro usuário de Eventos Estendidos. 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?
fonte
Respostas:
Sei que esta pergunta, com base no título, está principalmente preocupada com o tipo de espera PREEMPTIVE_OS_DELETESECURITYCONTEXT, mas acredito que essa é uma indicação incorreta do verdadeiro problema que é " um cliente que estava reclamando sobre o alto uso da CPU no SQL Server ".
A razão pela qual acredito que o foco nesse tipo de espera específico é uma loucura, é porque ele aumenta para todas as conexões feitas. Estou executando a seguinte consulta no meu laptop (o que significa que sou o único usuário):
E, em seguida, execute um dos seguintes procedimentos e execute novamente esta consulta:
SQLCMD -E -Q "select 1"
Agora, sabemos que a CPU está alta, portanto, devemos analisar o que está sendo executado para ver quais sessões têm alta CPU:
Normalmente, eu 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 encontrar consultas de custo mais alto. A primeira consulta abaixo mostrará consultas individuais (mesmo que tenham vários planos) e é ordenada pelo tempo médio da CPU, mas você pode facilmente mudar para leituras lógicas médias. Depois de encontrar uma consulta que parece consumir muitos recursos, copie "sql_handle" e "statement_start_offset" para a condição WHERE da segunda consulta abaixo para ver os planos individuais (pode ser maior que 1). Role para a extrema direita e, assumindo que havia um plano XML, ele será exibido como um link (no modo de grade) que o levará ao visualizador de plano se você clicar nele.
Consulta nº 1: obter informações da consulta
Consulta nº 2: obter informações do plano
fonte
O SecurityContext é usado pelo servidor sql em vários locais. Um exemplo que você nomeou são os servidores e as tabelas de arquivos vinculados. Talvez você esteja usando o cmdexec? Trabalhos do SQL Server Agent com contas proxy? Chamando um serviço da web? Recursos remotos podem ser um monte de coisas engraçadas.
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, convém verificar o gravador de caixa preta, também conhecido como eventos estendidos.
Você verificou se esses tipos de espera são novos (e em conexão com a CPU alta) ou são normais para o seu servidor?
fonte