it-swarm-eu.dev

High Disk I / O vom SQL Server oder verlangsamt High Disk I / O den SQL Server?

Ich habe mit einem DBA und ein paar Hardware-Leuten über Leistungsprobleme auf unserem SQL Server gestritten. Normalerweise ist alles in Ordnung, aber in den letzten Wochen gab es im SQL Server große Verzögerungsspitzen. Es ist klar, dass SQL Server auf der Festplatten-E/A wartet. Aber mir wird immer wieder gesagt, dass es sich um SQL Server handelt, der nach ungewöhnlich hohen E/A fragt. Welches ist nicht der Fall. Ich kann an dem, was läuft, sehen, dass es nichts Außergewöhnliches gibt, und der DBA kümmert sich nur darum, was die Blockierung verursacht und so weiter, was nutzlos ist. Das Wichtigste, was wir beim Sichern sehen, ist beispielsweise die Operation in der ASPState-Datenbank, mit der wir den Sitzungsstatus ASP] auf den Webservern verwalten. Diese Operationen werden normalerweise nie in aktiven Sp_who2-Ergebnissen angezeigt Die Datenbank befindet sich im einfachen Wiederherstellungsmodus und die Protokollierung ist kriminell. Während dieser Verzögerungsspitzen können wir jedoch viele Auswahl- und Aktualisierungsvorgänge in der Datenbank sehen, die blockiert werden oder warten. Ich bin sicher, dass gerade jemand da ist oder ein Job führt etwas aus, das die Verwendung von Heavey-Datenträgern auf den RAID-Arrays verursacht, die für das Datenbankprotokoll und die Datendateien verwendet werden. Das Problem beweist dies, da niemand zugeben möchte, dass sie etwas tun, das unsere Website zerstört.

Meine Frage ist, welche Leistungsindikatoren oder was auch immer ich protokollieren kann, um zu zeigen, dass der SQL Server auf E/A wartet, aber nicht, weil er mehr als normal verlangt, sondern weil die Festplatte zu beschäftigt ist, um auf die Anforderungen vom SQL Server zu antworten so schnell wie sonst?

18
Edgey

Schauen Sie sich die folgenden Perfmon-Zähler an:

SQL Server, der eine hohe Anzahl von IO -Anforderungen) ausführt, wird durch eine hohe Anzahl von Scans, eine Zunahme der Seitensuche und Seitenlesevorgänge sowie eine hohe Anzahl von Seiten IO Latch-Wartezeiten) bestätigt. Lohnt sich ein Blick auf sys.dm_exec_query_stats für Einträge mit hohen physischen Lesezahlen. Sie konnten den Täter schnell lokalisieren.

Im Allgemeinen ist es der richtige Ansatz, das Problem als Problem bei der Fehlerbehebung bei der Leistung zu betrachten, indem Sie einer Methodik wie Waits and Queues folgen. Ihr DBA scheint das Richtige zu tun, also sollten Sie ihm zuhören.

19
Remus Rusanu

Verwenden Sie zunächst Glenn Berrys Diagnoseabfragen und Adam Machanics SP_Whoisactive , um herauszufinden, was wirklich passiert.

Sehen Sie zuerst, welche Datenbankdateien den größten Engpass haben IO Engpass, indem Sie diese Abfrage ausführen (Abfrage von 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 );

Führen Sie dann diese Abfrage aus, um die zehn wichtigsten Ereignisse anzuzeigen, auf die Ihr Server wartet (Abfrage von Jonathan Kehayias ). Sie finden ähnliche Abfragen auch in Glenn Berry-Diagnoseabfragen.

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

Sobald Sie diese Informationen zur Hand haben, ist es viel einfacher, das Problem zu beheben.

Übrigens finden Sie viele Beiträge zur Verwendung von sp_whoisactive zur Fehlerbehebung hier.

12
DaniSQL

"Das Problem beweist es", sagte zu Recht. Schauen Sie sich SQL Server: Minimize Disk I/O an

Es geht darum, DMV zu folgen

sys.dm_io_virtual_file_stats
sys.dm_io_pending_io_requests

Referenzen:

  1. So überprüfen Sie IO Subsystem-Latenzen in SQL Server
  2. Glenn Berrys SQL Server-Leistung - sys.dm_io_pending_io_requests
1
LCJ