AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 244068
Accepted
Ian Boyd
Ian Boyd
Asked: 2019-07-30 10:48:55 +0800 CST2019-07-30 10:48:55 +0800 CST 2019-07-30 10:48:55 +0800 CST

Isso é um sintoma de um servidor sobrecarregado?

  • 772

Eu tenho tentado diagnosticar lentidão em um aplicativo. Para isso, registrei os eventos estendidos do SQL Server .

  • Para esta pergunta, estou olhando para um procedimento armazenado específico.
  • Mas há um conjunto básico de uma dúzia de procedimentos armazenados que igualmente podem ser usados ​​como uma investigação completa
  • e sempre que executo manualmente um dos procedimentos armazenados, ele sempre é executado rapidamente
  • e se um usuário tentar novamente: ele será executado rapidamente.

Os tempos de execução do procedimento armazenado variam muito. Muitas das execuções deste procedimento armazenado retornam em < 1s:

insira a descrição da imagem aqui

E para esse balde "rápido" , é muito menos que 1s. Na verdade, é em torno de 90 ms:

insira a descrição da imagem aqui

Mas há uma longa cauda de usuários que precisam esperar 2s, 3s, 4s segundos. Alguns têm que esperar 12s, 13s, 14s. Depois, há as almas realmente pobres que têm que esperar 22s, 23s, 24s.

E após 30s, o aplicativo cliente desiste, aborta a consulta e o usuário teve que esperar 30 segundos .

Correlação para encontrar a causa

Então tentei correlacionar:

  • duração vs leituras lógicas
  • duração vs leituras físicas
  • duração vs tempo de CPU

E nenhum parece dar qualquer correlação; nenhum parece ser a causa

  • duração vs leituras lógicas : seja um pouco ou muitas leituras lógicas, a duração ainda flutua muito :

    insira a descrição da imagem aqui

  • duração vs leituras físicas : mesmo que a consulta não tenha sido atendida pelo cache e muitas leituras físicas sejam necessárias, isso não afeta a duração:

    insira a descrição da imagem aqui

  • duração vs tempo de CPU : se a consulta levou 0s de tempo de CPU ou 2,5s completos de tempo de CPU, as durações têm a mesma variabilidade:

    insira a descrição da imagem aqui

Bônus : notei que a duração v leituras físicas e duração v tempo de CPU são muito semelhantes. Isso é comprovado se eu tentar correlacionar o tempo de CPU com leituras físicas:

insira a descrição da imagem aqui

Acontece que muito uso da CPU vem de E/S. Quem sabia!

Então, se não há nada no ato de executar a consulta que possa explicar as diferenças no tempo de execução, isso significa que é algo não relacionado à CPU ou disco rígido?

Se a CPU ou o disco rígido fossem o gargalo; não seria o gargalo?

Se levantarmos a hipótese de que foi a CPU que foi o gargalo; que a CPU está com pouca energia para este servidor:

  • então as execuções usando mais tempo de CPU não levariam mais tempo?
  • uma vez que eles têm que completar com os outros usando a CPU sobrecarregada?

Da mesma forma para os discos rígidos. Se levantarmos a hipótese de que o disco rígido era um gargalo; que os discos rígidos não têm taxa de transferência aleatória suficiente para este servidor:

  • então as execuções usando mais leituras físicas não levariam mais tempo?
  • uma vez que eles têm que completar com outros usando a E/S sobrecarregada do disco rígido?

O procedimento armazenado em si não executa nem requer nenhuma gravação.

  • Geralmente retorna 0 linhas (90%).
  • Ocasionalmente, retornará 1 linha (7%).
  • Raramente retornará 2 linhas (1,4%).
  • E nos piores casos, ele retornou mais de 2 linhas (uma vez retornando 12 linhas)

Portanto, não é como se estivesse retornando um volume insano de dados.

Uso da CPU do servidor

A média de uso do processador do servidor é de cerca de 1,8%, com um pico ocasional de até 18% - portanto, não parece que a carga da CPU seja um problema:

insira a descrição da imagem aqui

Portanto, a CPU do servidor não parece sobrecarregada.

Mas o servidor é virtual...

Algo fora do universo?

A única coisa que posso imaginar é algo que existe fora do universo do servidor.

  • se não for lógico lê
  • e não são leituras físicas
  • e não é uso de CPU
  • e não é carga da CPU

E não é como se fossem os parâmetros do procedimento armazenado (porque emitindo a mesma consulta manualmente e não leva 27 segundos - leva ~ 0 segundos).

O que mais poderia explicar o servidor às vezes levando 30 segundos, em vez de 0 segundos, para executar o mesmo procedimento armazenado compilado.

  • postos de controle?

É um servidor virtual

  • o host sobrecarregado?
  • outra VM no mesmo host?

Passando pelos eventos estendidos do servidor; não há mais nada acontecendo quando uma consulta de repente leva 20 segundos. Ele roda bem, então decide não rodar bem:

  • 2 segundos
  • 1 segundo
  • 30 segundos
  • 3 segundos
  • 2 segundos

E não há outros itens particularmente extenuantes que eu possa encontrar. Não é durante o backup do log de transações a cada 2 horas.

O que mais poderia ser?

Existe algo que eu possa dizer além de: "o servidor" ?

Edit : Correlacione por hora do dia

Percebi que correlacionei as durações a tudo:

  • leituras lógicas
  • leituras físicas
  • utilização do CPU

Mas a única coisa que eu não correlacionava era com a hora do dia . Talvez o backup do log de transações a cada 2 horas seja um problema.

Ou talvez as lentidão ocorram nos mandris durante os pontos de verificação?

Não:

insira a descrição da imagem aqui

Intel Xeon Gold Quad-core 6142.

Editar - As pessoas estão hipotetizando o plano de execução da consulta

As pessoas estão supondo que os planos de execução de consultas devem ser diferentes entre "rápido" e "lento". Eles não são.

E podemos ver isso imediatamente a partir da inspeção.

Sabemos que a duração mais longa da pergunta não se deve a um plano de execução "ruim":

  • um que levou mais leituras lógicas
  • um que consumiu mais CPU de mais junções e pesquisas de chave

Because if an increase in reads, or increase in CPU, was a cause of increased query duration, then we would have already seen that above. There is no correlation.

But lets try to correlate duration against the CPU-reads area product metric:

insira a descrição da imagem aqui

There becomes even less of a correlation - which is a paradox.


Edit: Updated the scatter diagrams to workaround a bug in Excel scatter plots with large numbers of values.

Next Steps

My next steps will be to get someone to have to server generate events for blocked queries - after 5 seconds:

EXEC sp_configure 'blocked process threshold', '5';
RECONFIGURE

It won't explain if queries are blocked for 4 seconds. But perhaps anything that's blocking a query for 5 seconds also blocks some for 4 seconds.

The slowplans

Here's the slowplan of the two stored procedures being executed:

  • `EXECUTE FindFrob @CustomerID = 7383, @StartDate = '20190725 04:00:00.000', @EndDate = '20190726 04:00:00.000'
  • `EXECUTE FindFrob @CustomerID = 7383, @StartDate = '20190725 04:00:00.000', @EndDate = '20190726 04:00:00.000'

The same stored procedure, with the same parameters, run back to back:

| Duration (us) | CPU time (us) | Logical reads | Physical reads | 
|---------------|---------------|---------------|----------------|
|    13,984,446 |        47,000 |         5,110 |            771 |
|     4,603,566 |        47,000 |         5,126 |            740 |

Call 1:

|--Nested Loops(Left Semi Join, OUTER REFERENCES:([Contoso2].[dbo].[Frobs].[FrobGUID]) OPTIMIZED)
    |--Nested Loops(Inner Join, OUTER REFERENCES:([Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]))
    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([Contoso2].[dbo].[FrobTransactions].[RowNumber]) OPTIMIZED)
    |    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([tpi].[TransactionGUID]) OPTIMIZED)
    |    |    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([tpi].[TransactionGUID]) OPTIMIZED)
    |    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[TransactionPatronInfo].[IX_TransactionPatronInfo_CustomerID_TransactionGUID] AS [tpi]), SEEK:([tpi].[CustomerID]=[@CustomerID]) ORDERED FORWARD)
    |    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[Transactions].[IX_Transactions_TransactionGUIDTransactionDate]), SEEK:([Contoso2].[dbo].[Transactions].[TransactionGUID]=[Contoso2].[dbo
    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactions2_MoneyAppearsOncePerTransaction]), SEEK:([Contoso2].[dbo].[FrobTransactions].[TransactionGUID]=[Contos
    |    |    |--Clustered Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactions_RowNumber]), SEEK:([Contoso2].[dbo].[FrobTransactions].[RowNumber]=[Contoso2].[dbo].[Fin
    |    |--Clustered Index Seek(OBJECT:([Contoso2].[dbo].[Frobs].[PK_Frobs_FrobGUID]), SEEK:([Contoso2].[dbo].[Frobs].[FrobGUID]=[Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]),  WHERE:([Contos
    |--Filter(WHERE:([Expr1009]>(1)))
     |--Compute Scalar(DEFINE:([Expr1009]=CONVERT_IMPLICIT(int,[Expr1012],0)))
          |--Stream Aggregate(DEFINE:([Expr1012]=Count(*)))
           |--Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactins_OnFrobGUID]), SEEK:([Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]=[Contoso2].[dbo].[Frobs].[LC

Call 2

|--Nested Loops(Left Semi Join, OUTER REFERENCES:([Contoso2].[dbo].[Frobs].[FrobGUID]) OPTIMIZED)
    |--Nested Loops(Inner Join, OUTER REFERENCES:([Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]))
    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([Contoso2].[dbo].[FrobTransactions].[RowNumber]) OPTIMIZED)
    |    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([tpi].[TransactionGUID]) OPTIMIZED)
    |    |    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([tpi].[TransactionGUID]) OPTIMIZED)
    |    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[TransactionPatronInfo].[IX_TransactionPatronInfo_CustomerID_TransactionGUID] AS [tpi]), SEEK:([tpi].[CustomerID]=[@CustomerID]) ORDERED FORWARD)
    |    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[Transactions].[IX_Transactions_TransactionGUIDTransactionDate]), SEEK:([Contoso2].[dbo].[Transactions].[TransactionGUID]=[Contoso2].[dbo
    |    |    |    |--Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactions2_MoneyAppearsOncePerTransaction]), SEEK:([Contoso2].[dbo].[FrobTransactions].[TransactionGUID]=[Contos
    |    |    |--Clustered Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactions_RowNumber]), SEEK:([Contoso2].[dbo].[FrobTransactions].[RowNumber]=[Contoso2].[dbo].[Fin
    |    |--Clustered Index Seek(OBJECT:([Contoso2].[dbo].[Frobs].[PK_Frobs_FrobGUID]), SEEK:([Contoso2].[dbo].[Frobs].[FrobGUID]=[Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]),  WHERE:([Contos
    |--Filter(WHERE:([Expr1009]>(1)))
     |--Compute Scalar(DEFINE:([Expr1009]=CONVERT_IMPLICIT(int,[Expr1012],0)))
          |--Stream Aggregate(DEFINE:([Expr1012]=Count(*)))
           |--Index Seek(OBJECT:([Contoso2].[dbo].[FrobTransactions].[IX_FrobTransactins_OnFrobGUID]), SEEK:([Contoso2].[dbo].[FrobTransactions].[OnFrobGUID]=[Contoso2].[dbo].[Frobs].[LC

It makes sense for the plans to be identical; it's executing the same stored procedure, with the same parameters.

sql-server sql-server-2012
  • 1 1 respostas
  • 563 Views

1 respostas

  • Voted
  1. Best Answer
    KevH
    2019-08-07T14:44:38+08:002019-08-07T14:44:38+08:00

    Have a look at the wait_stats and it will show what the biggest bottlenecks are on your SQL server.

    I recently experienced a problem where an external application was intermittently slow. Running stored procedures on the server itself was always fast though.

    Performance monitoring showed nothing to be concerned about at all with SQL Caches or the RAM usage and IO on the server.

    What helped narrow down the investigation was querying the wait stats that are collected by SQL in sys.dm_os_wait_stats

    O excelente script no site SQLSkills mostrará os que você mais está experimentando. Você pode então restringir sua pesquisa para identificar as causas.

    Depois de saber quais esperas são os grandes problemas, este script ajudará a restringir qual sessão/banco de dados está enfrentando as esperas:

    SELECT OSW.session_id,
           OSW.wait_duration_ms,
           OSW.wait_type,
           DB_NAME(EXR.database_id) AS DatabaseName
    FROM sys.dm_os_waiting_tasks OSW
    INNER JOIN sys.dm_exec_sessions EXS ON OSW.session_id = EXS.session_id
    INNER JOIN sys.dm_exec_requests EXR ON EXR.session_id = OSW.session_id
    OPTION(Recompile);
    

    A consulta acima e mais detalhes são do site MSSQLTips .

    O script do sitesp_BlitzFirst de Brent Ozar também mostrará o que está causando lentidão.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve