como posso ver o que o SQL Server está fazendo?

1

como eu sou um dev eu sou um usuário do SqlServer na minha máquina dev, e eu raramente consigo ver o que está acontecendo no servidor.

Mas, neste projeto, o cliente também gerencia seu próprio SqlServer de produção e, às vezes, vemos que a máquina está "ocupada".

E com ocupado, quero dizer que é mais de 30 segundos a 100% da CPU. Então, primeiro de tudo, é esse comportamento normal, que quando um servidor está funcionando normalmente, às vezes, ele configura todos os núcleos em 100%?

Como nós (como especialistas não-sql) concluímos que não, nós queríamos verificar 'o que o sql server está fazendo?'

Existem talvez 6 aplicativos rodando no mesmo servidor, alguns rodando a cada 5 minutos, um é um site que está conectado continuamente, um está calculando dados a cada minuto, etc.

Então, quando a cpu está em 100%, como podemos verificar quais aplicativos estão causando isso?

Podemos, é claro, usar o sql profiler para verificar o que é enviado para o sql server, mas isso contém muitas linhas que não sabemos onde começar a analisar.

Existe uma maneira de começar?

(é como a coisa que você às vezes tem em seu destino em casa: você não está fazendo nada, o cpu está em 50% e você ouve o disco rígido sacudindo e pensa: o que você está fazendo!?)

o servidor é um de um cluster de 2 máquinas (um é usado, um é failover), ambos quad core com 16GB de RAM.

    
por Michel 23.09.2010 / 12:26

4 respostas

3

So first of all, is that normal behaviour, that when a server is running normally, it sometimes sets all cores at 100%?

Como desenvolvedor, você deve saber que a única resposta para isso é "depende". é possível que um processo use toda a CPU por um período de tempo significativo - adivinhe, a resposta é sim.

Então, a questão é principalmente - o que o SQL Server faz aqui (e existem ferramentas para descobrir isso). Conecte-se, veja o que SQL Statements são executados por quanto tempo.

So when the cpu is at 100%, how can we check which app's are causing this?

Conecte-se usando a conta SA, examine as exibições dinâmicas para descobrir o que o SQL Server está ocupado processando no momento. Possivelmente anexar um traço.

Mas primeiro verifique se é o SQL Server. É muito raro que um SQL Server seja ligado à CPU. O primeiro gargalo é normalmente o subsistema de disco.

    
por 23.09.2010 / 12:41
3

Com o SQL Profiler, pode ser útil filtrar o ruído - adicione um filtro para mostrar apenas instruções que demoram mais de x segundos para serem executadas. Dessa forma, você pode identificar as coisas mais longas e perder todas as transações que são concluídas com bastante satisfação.

Uma abordagem ainda mais simples em muitos casos é dar uma olhada no SQL Activity Monitor (ou executar sp_who2) quando você estiver em um desses períodos de 100% do tempo de CPU. Procure as conexões listadas para ver o que está ativo. Você está vendo coisas esperando? Há itens lá bloqueados e, em caso afirmativo, o que está fazendo o bloqueio?

Se você não puder resumir o problema em um aplicativo específico ou em um conjunto de instruções, poderá começar a investigar o monitor de desempenho para verificar alguns contadores para tentar identificar um gargalo de hardware ou possivelmente uma falha na fabricação.

As visualizações dinâmicas também oferecem uma rota útil para consultar o que está acontecendo.

Então, talvez veja algumas das dicas aqui .

    
por 23.09.2010 / 13:14
2

Se você estiver usando o SQL Server 2005 ou ótimo (o que suponho que seja baseado em sua tag), poderá usar as Visualizações de Gerenciamento de Dados do SQL Server (geralmente chamadas de DMVs). Isso lhe dará uma ampla gama de visões sobre o que está acontecendo em seu sistema. Em seu caso particular, você pode querer executar a seguinte consulta (ou algum desdobramento):

SELECT total_physical_reads         , total_logical_reads         , total_logical_writes         , execution_count         , total_worker_time         , total_elapsed_time         , total_elapsed_time / execution_count avg_elapsed_time         , creation_time         , last_execution_time         , st.text
FROM sys.dm_exec_query_stats COMO qs     APLICAÇÃO CRUZADA sys.dm_exec_sql_text (qs.sql_handle) st ORDER BY total_elapsed_time / execution_count DESC;

- a ordem por cláusula será ordenada pelo maior tempo médio decorrido primeiro.

HTH, Dan

    
por 24.09.2010 / 00:22
1

Talvez um longo caminho, mas o MySQL tem um recurso chamado log de consultas lentas, que registra todas as consultas que levam mais de 1 segundo (configuráveis) para serem executadas. Provavelmente SqlServer tem o mesmo recurso?

Usando o log de consultas lentas, você pode determinar se tem alguma dúvida que esteja atrasada no seu sistema ou, pelo menos, pode verificar se não tem.

    
por 23.09.2010 / 12:56