SQL Server usando 100% de CPU

1

Existe alguma maneira rápida de descobrir qual site em um servidor estaria usando toda a CPU com uma consulta SQL? Como aleatoriamente a CPU está apenas sentada como 100% e não sei por quê?

    
por leen3o 22.08.2009 / 17:25

4 respostas

6

Ajudaria definitivamente a conhecer a versão do SQL Server que você está usando.

Eu considerarei você usar o SQL Server 2005 como é mais comum nos dias de hoje. Para identificar a causa do problema, recomendamos o download do Relatórios do Painel de Desempenho . Depois de instalar os relatórios personalizados e executar o script de implantação conforme detalhado na seção Informações Adicionais da página de download, abra o relatório performance_dashboard_mail.rdl personalizado no SQL Server Management Studio. A partir daí, há links para relatórios sobre a utilização da CPU que mostram o tempo total consumido por cada consulta em seu sistema. As consultas mais importantes nesses relatórios são as mais propensas a direcionar o sistema para 100% da CPU. Você terá que analisar o plano de execução dessas consultas e identificar por que elas são tão caras. O visualizador de planos do SSMS ajuda muito a isso, basta seguir as linhas thick no plano porque elas representam grandes fluxos de dados. Ao final desses fluxos de dados caros, você provavelmente encontrará operadores de varredura de índice em cluster que retornam todas as linhas da tabela. Você precisará entender a consulta e a estrutura da tabela para decidir por que uma varredura de índice de cluster é escolhida, e você provavelmente terá que decidir sobre a adição de um índice ou dois. O Painel de Desempenho pode ajudar novamente, pois ele tem relatórios que aproveitam as informações esotéricas de sys.dm_db_missing_index_details e apresentá-lo em um formato de fácil leitura, mais precisamente mostra a declaração CREATE INDEX sugerida.

Outros recursos de interesse são:

  • sys.dm_exec_query_stats coleta informações sobre a execução da consulta. as consultas com valores principais em total_worker_time são as que mais consomem CPU. Cruzar, aplique sys.dm_exec_sql_text para recuperar o texto da consulta.
  • sys.dm_exec_procedure_stats semelhante às estatísticas de consulta, mas para procedimentos. Apenas no SQL Server 2008.
  • sys.dm_db_index_usage_stats coleta informações sobre como as tabelas e índices são acessados. Observe o user_seeks , user_scans , user_lookups para ver com que frequência e de que maneira a tabela é lida. Veja user_updates para ver com que frequência está escrito.
  • sys.dm_db_index_operational_stats coleta informações sobre contenção de acesso a índices, entre outras coisas. Observe as várias colunas xxx_wait_ms e xxx_wait_count para entender onde ocorre a contenção. Desde que você tem a CPU em 100% é improvável, embora o problema seja contenção, mas eu tenho que apresentar esta informação de qualquer maneira para outros leitores analisando isso.

Com essas investigações concluídas, você deve identificar o problema:

  • Verificações de tabela. Isso apareceria como consultas no Painel de Desempenho que são executadas relativamente poucas vezes, mas duram muito tempo a cada execução. Outros sintomas são altos user_scans contam com sys.dm_db_index_usage_stats para índices com muitos registros, grandes números para total_physical_reads em sys.dm_exec_query_stats .
  • Table Value Funções que são chamadas com muita frequência na execução. Isso pode ser identificado com execution_count muito grande na visualização de estatísticas e nos Painéis de Desempenho. Exemplos típicos são funções para dividir uma cadeia delimitada por vírgula em uma representação relacional (se eu tivesse um centavo para cada vez ...).
  • Spool e classificação. Não entrarei em detalhes, primeiro faça o dever de casa e investigue os cenários simples acima.

Sucesso!

    
por 22.08.2009 / 19:59
4

Há um Activity Monitor no Microsoft SQL Management Studio que mostrará as consultas mais caras e seu tempo de CPU. Basta clicar com o botão direito do mouse no servidor na janela do explorador de servidores e clicar em "Activity Monitor"

    
por 22.08.2009 / 17:43
1

Você deve executar o SQL Server Profiler para ajudá-lo a determinar onde há algumas consultas ineficientes estão causando grandes tempos de leitura / gravação.

Quanto a rapidez ... Bem, você pode executá-lo por um minuto ou dois, e isso deve dar uma indicação de que existem alguns SPs / consultas que estão sendo executados mais do que o esperado.

Leia também esta questão e sua resposta aceita.

    
por 22.08.2009 / 17:34
0

Se o SQL Server Profiler não ajudar, você poderá começar a pensar em qualquer possível ataque de worm.

    
por 22.08.2009 / 19:58