Fabio Gentile
Premier Field Engineer
Microsoft
Fabricio Catae
Premier Field Engineer
Microsoft
SQL Server com Foco em
Diagnóstico de Desempenho
CÓDIGO DA SESSÃO: SUP-403
4
Premier Field Engineering
Premier
Field
Engineering
Serviços
Proativos
Serviços
Reativos
Workshop
Plus
Health
Checks &
Risk
Assessment
Programs
Situações
Críticas
5
Agenda
100% CPU
Waits Statistics
6
Definindo Performance
Performance (Desempenho)
Tempo de Resposta ao Usuário
Sintomas de Baixo Desempenho
Alta Utilização de Recursos
7
Cenário: Alto Consumo de CPU
Utilizar o Task Manager
Identificar o processo
Usar DMV para identificar a causa do problema
Custo em CPU
Query rodando
Plano de execução
8
Alto Consumo de CPU
9
Metodologia: Alto consumo de CPU
Confirmar alto consumo de CPU
Task Manager
Performance Monitor
Rodar a query sys.dm_exec_requests
Ordenar o resultado de acordo com cpu_time
Consultar o SQL Text usando o (sql) handle
Consultar o Query Plan usando o (plan) handle
10
Desafio: Como Otimizar?
set @str = CAST(@i as CHAR(10))
insert tbInfo (info) values ( @str )
11
Redefinindo Performance
Performance (Desempenho)
Tempo de Resposta ao Usuário
Tamanho da Fila de Processamento
Utilização de Recursos
Sintomas de Baixo Desempenho
Alta Utilização de Recursos
Presença constante de 100% CPU
Alto consumo de Memória
Bloqueios e Locks entre Queries
12
Análise do Consumo de CPU
Baseia-se no fato de que a THREAD possui dois
estados:
Rodando
Suspensa (Em Espera) CPU
CPU
Wait
13
Metodologia: ?
Recursos
CPU
Disco
Rede
Memoria
CPU
CPU
Wait
14
Wait Statistics
O que são Wait Statistics?
Sempre que uma query inicia a espera por algum
recurso (Disco, Locks, Rede), o SQL Server registra o
tipo e a duração desta espera
Estas informações sobre esperas são retidas e
permitem determinar porque a execução das queries é
mais lenta do que o esperado
15
Wait Statistics
Por que usar Wait Statistics?
Abordagem inicial antes de aprofundar a análise de
performance usando outras ferramentas
Permite encontrar gargalos de performance que não
são óbvios e evita tentativas de eliminação de falsos
gargalos de performance
Permite identificar o maior retorno para os esforços de
ajuste de performance
16
Wait Statistics
Onde encontrar Wait Statistics?
SQL Server DMV:
sys.dm_os_wait_stats
Wait Statistics são acumuladas desde o último restart
da instância do SQL Server, ou do último reset:
DBCC SQLPERF (‘sys.dm_os_wait_stats’, CLEAR)
17
Wait Statistics
sys.dm_os_wait_stats
wait_type:
Tipo da espera
waiting_tasks_count:
Número de esperas deste tipo
wait_time_ms:
Tempo total de espera para este tipo em milissegundos
max_wait_time_ms:
Tempo máximo de espera para este tipo
signal_wait_time:
Diferença entre o tempo em que a espera teminou e o início da execução
18
Wait Statistics
sys.dm_os_wait_stats
19
Wait Statistics
Interpretando Wait Types
Nem todos os wait types indicam problemas ou exigem
ações para serem corrigidos (como esperas associadas
a tarefas em background)
Concentre a análise em esperas por recursos que
podem indicar gargalos:
Disco
CPU
Memória
Locking
Rede
20
Tarefas em Background e Esperas
Determinadas esperas (Wait Types) estão
relacionadas com tarefas que rodam em
background
Exemplo de tarefas de sistema:
FT_IFTS_SCHEDULER_IDLE_WAIT
REQUEST_FOR_DEADLOCK_SEARCH
SQLTRACE_BUFFER_FLUSH
LAZYWRITER_SLEEP
XE_TIMER_EVENT
CHECKPOINT_QUEUE
BROKER_TO_FLUSH
LOGMGR_QUEUE
21
Inserção de Dados
ProcInsertInfo
22
Cenário: Latência na Gravação do Log
Quando a thread espera por uma escrita no
arquivo de LOG, ela fica no modo de espera
Wait type: WRITELOG
Essa espera pode ser observada Online nas DMV
sys.dm_exec_requests
sys.dm_os_tasks
sys.dm_os_waiting_tasks
23
WRITELOG
Gravação do LOG: 1ms
Escrita sequencial
Commit Transaction = 1 escrita em LOG
Limite de Transações/sec
24
Recomendação
Garantir o tempo de acesso ao disco adequado
Ideal: < 1 ms (cache)
Bom: < 5 ms (normal)
...
Desastre Total: > 100 ms
Agrupar as transações excessivamente curtas
dentro de um contexto transacional
BEGIN TRANSACTION / COMMIT
25
Otimizando: Inserção de Dados
26
Cenário: Latência no Acesso aos Discos
Ocorre quando uma thread aguarda por uma
requisição de I/O num arquivo de dados
Wait type: PAGEIOLATCH_*
Esta espera pode ser observada nas DMVs:
sys.dm_os_wait_stats
sys.dm_exec_requests
sys.dm_os_tasks / sys.dm_os_waiting_tasks
sys.dm_io_pending_io_requests
27
Monitoração de I/O pendentes
sys.dm_io_pending_io_requests
28
Latência no Acesso aos Discos
29
Recomendação
Garantir tempos de acesso adequados aos discos
(Physical Disk, Avg. Disk sec/Read e Avg. Disk
sec/Write)
Ideal: < 10 ms
Bom: < 20 ms
...
Ruim: > 100 ms
Diminuir a quantidade de leituras lógicas,
melhorando a estratégia de indexação
Database Engine Tuning Advisor (DTA)
sys.dm_db_missing_index_*
Plano de execução: Missing Index Details
30
Outros Wait Types
31
Breve Resumo
Wait Type Possível significado
PAGELATCH 2:*:* Contenção no TEMPDB em memória
PAGELATCH dbid:*:* Hot-spot em memória (page-split)
PAGEIOLATCH Leitura excessiva de disco
WRITELOG Escrita em disco de log
NETWORKIO Esperando recebimento de pacotes do cliente
SOS_SCHEDULER_YIELD Alto consumo de CPU
RESOURCE_SEMAPHORE Esperando por memória para Workspace
LCK_M_* Bloqueios
32
Problema de Travamento
33
Cenário: Locks
Tipos de Lock
LCK_M_X = Exclusive (Escrita)
LCK_M_S = Shared (Leitura)
LCK_M_U = Update
LCK_M_IX = Intent-Exclusive
LCK_M_IS = Intent-Shared
Diferentes Recursos
Tabela
Página
Linha
Identificador
LCK_M_X sobre o recurso 5:1234567 (dbid=5, objid=1234567)
34
Matriz de Compatiblidade (COMPLETA)
Conflitos = (C)
35
Compatibilidade de Lock
S = Shared/Leitura ( múltiplas leituras )
X = Exclusivo ( bloqueia TODOS )
Intent Lock (IS, IX) – Compatíveis entre si
36
Hierarquia de Locks
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
37
Hierarquia de Locks (2)
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Leitura da Tabela Inteira
TABLE LOCK S
PAGE LOCK -
ROW LOCK -
38
Hierarquia de Locks (3)
Escrita de Linha
TABLE LOCK IX
PAGE LOCK IX
ROW LOCK X
Leitura de Linha
TABLE LOCK IS
PAGE LOCK IS
ROW LOCK S
39
Recomendação
Matriz de Compatibilidade
Range Locks (LCK_M_R*)
Transação em Serializable
Utilize o NOLOCK se necessário
Melhor alternativa: Read Committed Snapshot
SQL tem lock de linha? (ROWLOCK)
Como usar um lock de linha se a query faz TABLE
SCAN?
40
Referências – Wait Stats
SQL Server 2005 Waits and Queues:
http://technet.microsoft.com/en-us/library/cc966413.aspx
Troubleshooting Performance Problems in SQL Server 2005
http://technet.microsoft.com/en-us/library/cc966540.aspx
Troubleshooting Performance Problems in SQL Server 2008
http://technet.microsoft.com/en-us/library/dd672789(SQL.100).aspx
Description of the waittype and lastwaittype columns in the
master.dbo.sysprocesses table in SQL Server 2000 and SQL
Server 2005
http://support.microsoft.com/kb/822101
The SQL Server Wait Type Repository
http://blogs.msdn.com/b/psssql/archive/2009/11/03/the-sql-server-
wait-type-repository.aspx
41
42
Contatos
Fabricio Catae
fcatae@microsoft.com
Fabio Gentile
fgentile@microsoft.com
Blog / Twitter
http://blogs.msdn.com/fcatae
Twitter: @fcatae
© 2008 Microsoft Corporation. Todos os direitos reservados. Microsoft, Windows, Windows Vista e outros nomes de produtos são ou podem ser marcas registradas e/ou marcas comerciais nos EUA e/ou outros países.
Este documento é meramente informativo e representa a visão atual da Microsoft Corporation a partir da data desta apresentação. Como a Microsoft deve atender a condições de mercado em constante alteração, este
documento não deve ser interpretado como um compromisso por parte da Microsoft, e a Microsoft não pode garantir a precisão de qualquer informação fornecida após a data desta apresentação. A MICROSOFT NÃO DÁ
QUALQUER GARANTIA, SEJA ELA EXPRESSA, IMPLÍCITA OU ESTATUTÁRIA, REFERENTE ÀS INFORMAÇÕES DESTA APRESENTAÇÃO.
Por favor preencha a
avaliação
45
Query Plan
46
Monitorando Deadlock
Habilitar o Trace Flag 1222 no Startup
Utilize o Profiler para obter uma versão gráfica
47
Evite Table Scan

TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho

  • 1.
    Fabio Gentile Premier FieldEngineer Microsoft Fabricio Catae Premier Field Engineer Microsoft SQL Server com Foco em Diagnóstico de Desempenho CÓDIGO DA SESSÃO: SUP-403
  • 2.
  • 3.
  • 4.
    6 Definindo Performance Performance (Desempenho) Tempode Resposta ao Usuário Sintomas de Baixo Desempenho Alta Utilização de Recursos
  • 5.
    7 Cenário: Alto Consumode CPU Utilizar o Task Manager Identificar o processo Usar DMV para identificar a causa do problema Custo em CPU Query rodando Plano de execução
  • 6.
  • 7.
    9 Metodologia: Alto consumode CPU Confirmar alto consumo de CPU Task Manager Performance Monitor Rodar a query sys.dm_exec_requests Ordenar o resultado de acordo com cpu_time Consultar o SQL Text usando o (sql) handle Consultar o Query Plan usando o (plan) handle
  • 8.
    10 Desafio: Como Otimizar? set@str = CAST(@i as CHAR(10)) insert tbInfo (info) values ( @str )
  • 9.
    11 Redefinindo Performance Performance (Desempenho) Tempode Resposta ao Usuário Tamanho da Fila de Processamento Utilização de Recursos Sintomas de Baixo Desempenho Alta Utilização de Recursos Presença constante de 100% CPU Alto consumo de Memória Bloqueios e Locks entre Queries
  • 10.
    12 Análise do Consumode CPU Baseia-se no fato de que a THREAD possui dois estados: Rodando Suspensa (Em Espera) CPU CPU Wait
  • 11.
  • 12.
    14 Wait Statistics O quesão Wait Statistics? Sempre que uma query inicia a espera por algum recurso (Disco, Locks, Rede), o SQL Server registra o tipo e a duração desta espera Estas informações sobre esperas são retidas e permitem determinar porque a execução das queries é mais lenta do que o esperado
  • 13.
    15 Wait Statistics Por queusar Wait Statistics? Abordagem inicial antes de aprofundar a análise de performance usando outras ferramentas Permite encontrar gargalos de performance que não são óbvios e evita tentativas de eliminação de falsos gargalos de performance Permite identificar o maior retorno para os esforços de ajuste de performance
  • 14.
    16 Wait Statistics Onde encontrarWait Statistics? SQL Server DMV: sys.dm_os_wait_stats Wait Statistics são acumuladas desde o último restart da instância do SQL Server, ou do último reset: DBCC SQLPERF (‘sys.dm_os_wait_stats’, CLEAR)
  • 15.
    17 Wait Statistics sys.dm_os_wait_stats wait_type: Tipo daespera waiting_tasks_count: Número de esperas deste tipo wait_time_ms: Tempo total de espera para este tipo em milissegundos max_wait_time_ms: Tempo máximo de espera para este tipo signal_wait_time: Diferença entre o tempo em que a espera teminou e o início da execução
  • 16.
  • 17.
    19 Wait Statistics Interpretando WaitTypes Nem todos os wait types indicam problemas ou exigem ações para serem corrigidos (como esperas associadas a tarefas em background) Concentre a análise em esperas por recursos que podem indicar gargalos: Disco CPU Memória Locking Rede
  • 18.
    20 Tarefas em Backgrounde Esperas Determinadas esperas (Wait Types) estão relacionadas com tarefas que rodam em background Exemplo de tarefas de sistema: FT_IFTS_SCHEDULER_IDLE_WAIT REQUEST_FOR_DEADLOCK_SEARCH SQLTRACE_BUFFER_FLUSH LAZYWRITER_SLEEP XE_TIMER_EVENT CHECKPOINT_QUEUE BROKER_TO_FLUSH LOGMGR_QUEUE
  • 19.
  • 20.
    22 Cenário: Latência naGravação do Log Quando a thread espera por uma escrita no arquivo de LOG, ela fica no modo de espera Wait type: WRITELOG Essa espera pode ser observada Online nas DMV sys.dm_exec_requests sys.dm_os_tasks sys.dm_os_waiting_tasks
  • 21.
    23 WRITELOG Gravação do LOG:1ms Escrita sequencial Commit Transaction = 1 escrita em LOG Limite de Transações/sec
  • 22.
    24 Recomendação Garantir o tempode acesso ao disco adequado Ideal: < 1 ms (cache) Bom: < 5 ms (normal) ... Desastre Total: > 100 ms Agrupar as transações excessivamente curtas dentro de um contexto transacional BEGIN TRANSACTION / COMMIT
  • 23.
  • 24.
    26 Cenário: Latência noAcesso aos Discos Ocorre quando uma thread aguarda por uma requisição de I/O num arquivo de dados Wait type: PAGEIOLATCH_* Esta espera pode ser observada nas DMVs: sys.dm_os_wait_stats sys.dm_exec_requests sys.dm_os_tasks / sys.dm_os_waiting_tasks sys.dm_io_pending_io_requests
  • 25.
    27 Monitoração de I/Opendentes sys.dm_io_pending_io_requests
  • 26.
  • 27.
    29 Recomendação Garantir tempos deacesso adequados aos discos (Physical Disk, Avg. Disk sec/Read e Avg. Disk sec/Write) Ideal: < 10 ms Bom: < 20 ms ... Ruim: > 100 ms Diminuir a quantidade de leituras lógicas, melhorando a estratégia de indexação Database Engine Tuning Advisor (DTA) sys.dm_db_missing_index_* Plano de execução: Missing Index Details
  • 28.
  • 29.
    31 Breve Resumo Wait TypePossível significado PAGELATCH 2:*:* Contenção no TEMPDB em memória PAGELATCH dbid:*:* Hot-spot em memória (page-split) PAGEIOLATCH Leitura excessiva de disco WRITELOG Escrita em disco de log NETWORKIO Esperando recebimento de pacotes do cliente SOS_SCHEDULER_YIELD Alto consumo de CPU RESOURCE_SEMAPHORE Esperando por memória para Workspace LCK_M_* Bloqueios
  • 30.
  • 31.
    33 Cenário: Locks Tipos deLock LCK_M_X = Exclusive (Escrita) LCK_M_S = Shared (Leitura) LCK_M_U = Update LCK_M_IX = Intent-Exclusive LCK_M_IS = Intent-Shared Diferentes Recursos Tabela Página Linha Identificador LCK_M_X sobre o recurso 5:1234567 (dbid=5, objid=1234567)
  • 32.
    34 Matriz de Compatiblidade(COMPLETA) Conflitos = (C)
  • 33.
    35 Compatibilidade de Lock S= Shared/Leitura ( múltiplas leituras ) X = Exclusivo ( bloqueia TODOS ) Intent Lock (IS, IX) – Compatíveis entre si
  • 34.
    36 Hierarquia de Locks Escritade Linha TABLE LOCK IX PAGE LOCK IX ROW LOCK X Escrita de Linha TABLE LOCK IX PAGE LOCK IX ROW LOCK X
  • 35.
    37 Hierarquia de Locks(2) Escrita de Linha TABLE LOCK IX PAGE LOCK IX ROW LOCK X Leitura da Tabela Inteira TABLE LOCK S PAGE LOCK - ROW LOCK -
  • 36.
    38 Hierarquia de Locks(3) Escrita de Linha TABLE LOCK IX PAGE LOCK IX ROW LOCK X Leitura de Linha TABLE LOCK IS PAGE LOCK IS ROW LOCK S
  • 37.
    39 Recomendação Matriz de Compatibilidade RangeLocks (LCK_M_R*) Transação em Serializable Utilize o NOLOCK se necessário Melhor alternativa: Read Committed Snapshot SQL tem lock de linha? (ROWLOCK) Como usar um lock de linha se a query faz TABLE SCAN?
  • 38.
    40 Referências – WaitStats SQL Server 2005 Waits and Queues: http://technet.microsoft.com/en-us/library/cc966413.aspx Troubleshooting Performance Problems in SQL Server 2005 http://technet.microsoft.com/en-us/library/cc966540.aspx Troubleshooting Performance Problems in SQL Server 2008 http://technet.microsoft.com/en-us/library/dd672789(SQL.100).aspx Description of the waittype and lastwaittype columns in the master.dbo.sysprocesses table in SQL Server 2000 and SQL Server 2005 http://support.microsoft.com/kb/822101 The SQL Server Wait Type Repository http://blogs.msdn.com/b/psssql/archive/2009/11/03/the-sql-server- wait-type-repository.aspx
  • 39.
  • 40.
  • 41.
    © 2008 MicrosoftCorporation. Todos os direitos reservados. Microsoft, Windows, Windows Vista e outros nomes de produtos são ou podem ser marcas registradas e/ou marcas comerciais nos EUA e/ou outros países. Este documento é meramente informativo e representa a visão atual da Microsoft Corporation a partir da data desta apresentação. Como a Microsoft deve atender a condições de mercado em constante alteração, este documento não deve ser interpretado como um compromisso por parte da Microsoft, e a Microsoft não pode garantir a precisão de qualquer informação fornecida após a data desta apresentação. A MICROSOFT NÃO DÁ QUALQUER GARANTIA, SEJA ELA EXPRESSA, IMPLÍCITA OU ESTATUTÁRIA, REFERENTE ÀS INFORMAÇÕES DESTA APRESENTAÇÃO.
  • 42.
    Por favor preenchaa avaliação
  • 43.
  • 44.
    46 Monitorando Deadlock Habilitar oTrace Flag 1222 no Startup Utilize o Profiler para obter uma versão gráfica
  • 45.

Notas do Editor

  • #2 14/07/2010 4:47 PM
  • #4 14/07/2010 4:47 PM
  • #6 14/07/2010 4:47 PM
  • #9 select cpu = cpu_time, * from sys.dm_exec_requests where group_id > 1 order by cpu_time desc select text from sys.dm_exec_sql_text(0x02000000D328C61BD9377ECCC7A5C6E40A461B64C26643F2) select * from sys.dm_exec_query_plan(0x06000D00D328C61B40C16D0F010000000000000000000000) create index idxId on tbInfoRelation (id) create index idxNextId on tbInfoRelation (nextid)
  • #15 14/07/2010 4:47 PM
  • #16 14/07/2010 4:47 PM
  • #17 14/07/2010 4:47 PM
  • #18 14/07/2010 4:47 PM
  • #20 14/07/2010 4:47 PM
  • #22 CREATE PROCEDURE procInsertInfo AS set nocount on declare @i int = 0 declare @str char(10) while @i<100000 begin set @str = CAST(@i as CHAR(10)) insert tbInfo (info) values ( @str ) set @i = @i + 1 end
  • #41 14/07/2010 4:47 PM
  • #44 14/07/2010 4:47 PM
  • #46 Analisar ConsultProximoIdRecentes select * from ( select c1=t1.id, c2=t2.id from tbInfoRelation t1 inner join tbInfoRelation t2 on (t1.id = t2.nextid) ) tab where c1+c2<10