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

18

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 riesige Verzögerungsspitzen im SQL Server. Es ist klar, dass SQL Server auf Datenträger-E / A wartet. Aber mir wird immer wieder gesagt, dass SQL Server ungewöhnlich hohe E / A fordert. Welches ist nicht der Fall. Ich kann an dem, was läuft, sehen, dass nichts vom Normalen abweicht, und der DBA kümmert sich nur darum, was die Blockierung verursacht und so weiter, was nutzlos ist. Zum Beispiel sehen wir als Hauptsache die Operation auf der ASPState-Datenbank, mit der wir den ASP-Sitzungsstatus auf den Webservern verwalten. Diese Operationen werden normalerweise bei aktiven Ergebnissen von Sp_who2 nicht angezeigt, da sie so schnell ausgeführt werden. Die Datenbank befindet sich im einfachen Wiederherstellungsmodus und die Protokollierung ist strafbar. Während dieser Verzögerungsspitzen können wir jedoch feststellen, dass viele Auswahl- und Aktualisierungsvorgänge in der Datenbank blockiert werden oder warten. Ich bin mir sicher, dass jemand oder ein anderer Job etwas ausführt, das die Festplattennutzung in den RAID-Arrays verursacht, die für die Datenbankprotokolle und Datendateien verwendet werden. Das Problem beweist es, da niemand zugeben will, dass er etwas tut, das unsere Website zerstört.

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

Edgey
quelle
3
Welchen Wartezustand sehen Sie tatsächlich, Network I / O? Verwenden Sie ein SAN?
Eric Higgins
Überprüfen Sie, ob Sie Abfragen haben, die die Ressourcennutzung auf dem DB-Server dominieren. Wenn ja, versuchen Sie diese zu optimieren. Wenn Sie keine schlecht verhaltenen Abfragen haben, weisen hohe PAGEIOLATCH-Wartezeiten in der Regel darauf hin, dass Ihr System E / A-gebunden ist. Wie @EricHiggins angibt, sind SANs häufig langsam und verursachen Leistungsprobleme bei Datenbanken.
ConcernedOfTunbridgeWells
Es ist ein NETAPP-Array, das über Qlogic Fibre-HBAs mit dem SQL-Server verbunden ist.
Edgey
Ich weiß, dass dies eine relativ alte Frage ist, und das wird Ihr Problem nicht direkt beheben ... aber wir haben für den Sitzungsstatus auf aspnet_state.exe gewechselt und festgestellt, dass unser SQL Server stark ausgelastet ist. Es ist nicht gut dokumentiert, aber ziemlich einfach einzurichten.
MattGWagner
Was haben Sie / der DBA am Ende getan und was war das Problem?
Mukus

Antworten:

19

Schauen Sie sich folgende Leistungsindikatoren an:

SQL Server, der eine hohe Anzahl von E / A-Anforderungen ausführt, würde mit einer hohen Anzahl von Scans, einer erhöhten Anzahl von Seitensuchen und Seitenlesevorgängen und Wartezeiten bei E / A-Latches für hohe Seiten bestätigt. Es lohnt sich, einen Blick auf sys.dm_exec_query_statsEinträge mit hohen physischen Lesezahlen zu werfen . Sie konnten den Täter schnell lokalisieren.

Im Allgemeinen ist es der richtige Ansatz, das Problem als Problem bei der Leistungsbehebung zu betrachten, wenn Sie eine Methode wie Waits and Queues verwenden . Sie DBA scheint das Richtige zu tun, also sollten Sie auf ihn hören.

Remus Rusanu
quelle
Ich habe kein Problem mit dem DBA. Er ist einer der besten DBAs, mit denen ich gearbeitet habe. Und er hat mir eine Liste mit gespeicherten Prozeduren mit hoher Blockierung gegeben. Aber wie ich bereits erwähnt habe, ist "TempUpdateStateItemLong" eine der Prozeduren, die viel Blockieren verursachen. Diese Prozedur wird vom SQL-Sitzungszustandsspeicher verwendet. Es ist ein MS-Prozess und aktualisiert nur eine einzelne Tabelle anhand der Sitzungs-ID, die der indizierte Primärschlüssel für die Tabelle ist. Außerdem enthält diese Tabelle höchstens 2000-3000 Datensätze, sodass Aktualisierungen keine Zeit in Anspruch nehmen sollten.
Edgey
Dies ist ein guter Anfang. Wir führen noch SQL Server 2000 aus. Wir sind dabei, ein Upgrade durchzuführen, aber das wird erst in ein paar Monaten geschehen. Daher muss ich den Zähler für PAge IO-Latch nicht mehr anzeigen. Danke noch einmal.
Edgey
Beachten Sie, dass das Blockieren per se kein hohes E / A impliziert. Es könnte sich um einen Sperrenkonflikt handeln, der sich unabhängig von der Größe auf die Tabelle auswirkt, insbesondere wenn das Optimierungsprogramm einen tabellensuchbasierten Plan auswählt.
Remus Rusanu
Überprüfen Sie auch den Prozess auf IO Data Bytes/secund prüfen Sie, ob ein anderer Prozess die Festplatte zerstört.
Remus Rusanu
12

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

Sehen Sie zuerst, welche Datenbankdateien den meisten E / A-Engpass aufweisen, 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 auch ähnliche Abfragen bei 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 hier viele Beiträge zur Verwendung von sp_whoisactive zur Fehlerbehebung .

DaniSQL
quelle
1
Ich habe gerade das letzte Skript in dieser Liste verwendet - seinen Kick Ass.
the_good_pony