E / S de disco alta do servidor sql ou a E / S de disco alta está desacelerando o servidor sql?

18

Eu tenho discutido com um DBA e alguns caras de hardware sobre problemas de desempenho em nosso servidor SQL. Normalmente está tudo bem, no entanto, nas últimas semanas, temos tido grandes picos de atraso no servidor sql. É claro que o SQL Server está aguardando na E / S do disco. Mas eu continuo sendo informado de que é porque o SQL Server está solicitando uma E / S anormalmente alta. O que não é o caso. Percebo pelo que está sendo executado que não há nada fora do normal, e tudo o que o DBA se importa é o que está causando o bloqueio e assim por diante, o que é inútil. Por exemplo, a principal coisa que vemos como backup é a operação no banco de dados ASPState, que estamos usando para gerenciar o estado da sessão ASP nos servidores da web. Essas operações normalmente nunca são vistas nos resultados ativos do Sp_who2 porque ocorrem muito rapidamente. O banco de dados está no modo de recuperação simples e o log é miminal. No entanto, durante esses picos de atraso, podemos ver muitas operações de seleção e atualização no banco de dados bloqueadas ou em espera. Tenho certeza de que o que está acontecendo é que alguém ou algum trabalho está executando algo que está causando o uso de disco heavey nas matrizes de ataque usadas para o log e os arquivos de dados dos bancos de dados. O problema está provando isso, já que ninguém quer admitir que está fazendo algo que está matando nosso site.

Minha pergunta é: quais contadores de desempenho ou o que eu posso registrar, ajudará a mostrar que o SQL Server está aguardando E / S, mas não porque está pedindo mais do que normalmente, em vez disso, porque o disco está ocupado para responder às solicitações do sql server tão rapidamente quanto normalmente?

Edgey
fonte
3
Que estado de espera você realmente vê, E / S de rede? ou seja, você está usando uma SAN?
11118 Eric Higgins
Verifique se você tem alguma dúvida que esteja dominando o uso de recursos no servidor DB. Se houver, tente ajustá-los. Se você não tiver nenhuma consulta de mau comportamento, as altas esperas de PAGEIOLATCH geralmente indicarão que seu sistema está vinculado à E / S. Além disso, como diz @EricHiggins, as SANs geralmente são lentas e causam problemas de desempenho nos bancos de dados.
ConcernedOfTunbridgeWells
É uma matriz NETAPP conectada ao servidor sql com HBAs de fibra Qlogic.
Edgey
Sei que essa é uma pergunta relativamente antiga, e isso não resolverá o problema diretamente ... mas mudamos para aspnet_state.exe para o estado da sessão e vimos uma grande carga do nosso SQL Server. Não está bem documentado, mas é muito fácil de configurar.
MattGWagner
Então, o que você / o DBA acabou fazendo e qual foi o problema?
Mukus

Respostas:

19

Dê uma olhada nos seguintes contadores de perfmon:

O SQL Server que administra um grande número de solicitações de E / S seria corroborado com um número elevado de verificações, aumento nas pesquisas e leituras de página e aguarda a trava de E / S alta da página. Vale a pena tentar examinar sys.dm_exec_query_statsentradas com altas contagens de leituras físicas. Eles poderiam identificar rapidamente o culpado.

Em geral, abordando o problema como um problema de solução de problemas de desempenho, seguir um método como o Waits and Queues é a abordagem correta. Você DBA parece estar fazendo a coisa certa, então você deve ouvi-lo.

Remus Rusanu
fonte
Não tenho nenhum problema com o DBA, ele é um dos melhores DBAs com os quais trabalhei. E ele me deu uma lista de procedimentos armazenados com alto bloqueio. Mas, como mencionei, um dos procs que está causando muitos bloqueios é "TempUpdateStateItemLong", que é um proc usado pelo armazenamento de estado da Sessão SQL do hte. É um processo MS e atualiza apenas uma única tabela pelo sessionID, que é a chave primária indexada na tabela. Também, no máximo, esta tabela possui 2000-3000 registros, portanto, as atualizações não devem demorar muito.
Edgey
Esse é um bom lugar para começar. Ainda estamos executando o SQL Server 2000, estamos em processo de atualização, mas isso não acontecerá por mais alguns meses, portanto, não tenho o contador de espera do PAge IO Latch para ver. Obrigado novamente.
Edgey
Observe que o bloqueio em si não implica IO alto. Pode ser uma contenção de bloqueio e isso afetaria a tabela, independentemente do tamanho, especialmente se o otimizador escolher um plano baseado na varredura de tabela.
Remus Rusanu
E também verificar o processo para IO Data Bytes/secver se algum outro processo está destruindo o disco.
Remus Rusanu
12

Para começar, use as consultas de diagnóstico de Glenn Berry e SP_Whoisactive de Adam Machanic para descobrir o que realmente está acontecendo.

Primeiro, veja quais arquivos de banco de dados têm mais gargalo de E / S executando esta consulta (consulta por Glenn Berry)

SELECT  DB_NAME(fs.database_id) AS [Database Name] ,
        mf.physical_name ,
        io_stall_read_ms ,
        num_of_reads ,
        CAST(io_stall_read_ms / ( 1.0 + num_of_reads ) AS NUMERIC(10, 1)) AS [avg_read_stall_ms] ,
        io_stall_write_ms ,
        num_of_writes ,
        CAST(io_stall_write_ms / ( 1.0 + num_of_writes ) AS NUMERIC(10, 1)) AS [avg_write_stall_ms] ,
        io_stall_read_ms + io_stall_write_ms AS [io_stalls] ,
        num_of_reads + num_of_writes AS [total_io] ,
        CAST(( io_stall_read_ms + io_stall_write_ms ) / ( 1.0 + num_of_reads
                                                          + num_of_writes ) AS NUMERIC(10,
                                                              1)) AS [avg_io_stall_ms]
FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
        INNER JOIN sys.master_files AS mf WITH ( NOLOCK ) ON fs.database_id = mf.database_id
                                                             AND fs.[file_id] = mf.[file_id]
ORDER BY avg_io_stall_ms DESC
OPTION  ( RECOMPILE );

Em seguida, execute esta consulta para ver os dez principais eventos em que seu servidor está aguardando (consulta por Jonathan Kehayias ). Você também encontrará consultas semelhantes nas consultas de diagnóstico da Glenn Berry.

SELECT TOP 10
        wait_type ,
        max_wait_time_ms wait_time_ms ,
        signal_wait_time_ms ,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms ,
        100.0 * wait_time_ms / SUM(wait_time_ms) OVER ( ) AS percent_total_waits ,
        100.0 * signal_wait_time_ms / SUM(signal_wait_time_ms) OVER ( ) AS percent_total_signal_waits ,
        100.0 * ( wait_time_ms - signal_wait_time_ms )
        / SUM(wait_time_ms) OVER ( ) AS percent_total_resource_waits
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0 -- remove zero wait_time
        AND wait_type NOT IN -- filter out additional irrelevant waits
( 'SLEEP_TASK', 'BROKER_TASK_STOP', 'BROKER_TO_FLUSH', 'SQLTRACE_BUFFER_FLUSH',
  'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP', 'SLEEP_SYSTEMTASK',
  'SLEEP_BPOOL_FLUSH', 'BROKER_EVENTHANDLER', 'XE_DISPATCHER_WAIT',
  'FT_IFTSHC_MUTEX', 'CHECKPOINT_QUEUE', 'FT_IFTS_SCHEDULER_IDLE_WAIT',
  'BROKER_TRANSMITTER', 'FT_IFTSHC_MUTEX', 'KSOURCE_WAKEUP',
  'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', 'ONDEMAND_TASK_QUEUE',
  'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BAD_PAGE_PROCESS',
  'DBMIRROR_EVENTS_QUEUE', 'BROKER_RECEIVE_WAITFOR',
  'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'WAITFOR',
  'DISPATCHER_QUEUE_SEMAPHORE', 'XE_DISPATCHER_JOIN', 'RESOURCE_QUEUE' )
ORDER BY wait_time_ms DESC

Depois de ter essas informações em mãos, será muito mais fácil solucionar o problema.

BTW, você pode encontrar muitas postagens sobre como usar sp_whoisactive na solução de problemas aqui.

DaniSQL
fonte
11
Acabei de usar o script final desta lista - o seu pontapé inicial.
the_good_pony