Kurze Antwort: Höhere IO-Stalls zu sehen, kann an sich ein Problem sein oder auch nicht. Sie müssen sich weitere Informationen ansehen, um herauszufinden, ob Sie ein Problem haben. Es scheint ein bisschen hoch, ja, aber leidest du? Wenn ja, liegt es wahrscheinlich daran, dass Ihr E / A-System die Last nicht richtig verarbeitet (weil dies nicht möglich ist, weil Sie alles auf einem Laufwerk haben oder aus einem anderen Grund), oder dass Sie zu viel in TempDB tun (Änderung des ersten Problems - die IO-Leistung - ist wahrscheinlich eine einfachere und effizientere Lösung, aber stellen Sie zuerst fest, ob Sie ein Problem haben.)
Die längere Diskussion / Antwort:
Hier spielen zwei Fragen eine Rolle:
1.) Was mache ich, wenn ich hohe IO-Stalls sehe?
Zunächst einmal ist "hoch" im Auge des Betrachters. Wenn Sie 10 Datenbankadministratoren fragen, was "zu hoch" für E / A-Stände ist, erhalten Sie wahrscheinlich 2-3 verschiedene Antworten mit Zahlen, 5-6 "Es hängt davon ab" -Antworten und einen leeren Blick. Ich gehe davon aus, dass der Durchschnitt von 400 ms hier möglicherweise zu hoch ist, insbesondere wenn die anderen DBs für die durchschnittliche Stillstandszeit 2 ms oder weniger betragen.
Unabhängig davon, in welcher Datenbank die hohen Stände angezeigt werden, sollten Sie auf die gleiche Weise vorgehen. Ein E / A-Stillstand ist das, wonach es sich anhört ... Eine E / A-Anforderung dauert länger als erwartet .. Stillstand. Diese passieren. Sie passieren die ganze Zeit in einem System mit gemeinsam genutzten Ressourcen und begrenzten Ressourcen (wirklich alle unsere Systeme). Sie werden zu einem Problem, wenn die Stände zu Leistungsproblemen werden oder zu diesen führen. Ich vertraue daher darauf, dass Sie hier einen proaktiven Teil der Überwachung betrachten oder Leistungsprobleme haben, die Sie beheben. Wir wollen uns auch nicht nur in IO-Ständen verlieren. Wir betrachten ein Puzzleteil und nicht das Gesamtbild. Es kann mühsam sein, nur Wartestatistiken oder Dateistatistiken seit dem letzten Neustart von SQL zu betrachten, da Sie immer auf der Suche sind und einige Wartungsfenster oder Fenster mit hoher Auslastung die Zähler verzerren können. Achten Sie also darauf, dass Sie das ganze Bild sehen.
Wenn ich jedoch den Verdacht habe, dass ich ein Leistungsproblem mit der Festplatte habe oder bei einer Abfrage wie dieser ein Problem auftreten kann, befolge ich normalerweise einen Vorgang, der wie folgt aussieht:
- Sehen Sie sich die Wartestatistik auf dem Server an. @swasheck hat einen tollen Link als Kommentar in der folgenden Antwort geteilt. Hiermit gelangen Sie zu Paul Randals Beitrag zum Anzeigen und Analysieren von Wartestatistiken in SQL Server. Geh dorthin. Welche Wartezeiten sehen Sie? Sehen Sie warten auf IO - Leistung bezogen (
PAGEIOLATCH_*
, IO_COMPLETION
, WRITELOG
, usw.?). Wenn Sie dies tun, ist dies ein weiterer Hinweis darauf, dass Sie einige E / A-bezogene Leistungsprobleme haben, genau wie die E / A-Blockierungen. Aber es gibt Ihnen hier eine andere Form der Vereinbarung.
- Schauen Sie sich die IO-Leistung an. Sehen Sie sich insbesondere die
Physical Disk:Avg Disk Sec/Read
und -Zähler von perfmon an Avg Sec Disk Sec/Write
. Diese messen Ihre Latenz. Überwachen Sie diese Leistungsindikatoren über einen Zeitraum, der in einer Leistungsprotokolldatei gespeichert ist. Was haben Sie durchschnittlich gesehen? Wenn Sie Zahlen über 0,020 Sekunden (20 ms) sehen, kann dies ein Problem sein. Wenn Zahlen über 40-50 ms oder höher angezeigt werden, deutet dies eher auf ein Problem hin. Sehen Sie sich auch Ihre Spikes an? Wie hoch gehen sie und wie lange dauern sie? Wenn Sie Spitzen in den Hunderten von ms sehen und diese Dutzende oder Dutzende von Sekunden oder länger andauern und / oder häufig auftreten, ist die Wahrscheinlichkeit höher, dass Sie ein Problem mit Ihrer E / A-Leistung für Ihre Arbeitslast haben.
- Schauen Sie sich Ihr IO-Setup an. Was ist es? Lokale Festplatten? SAN? Speicherarray? Welche Art von Durchgängigkeit und IOPs sollten Sie davon sehen? Reicht es für das, was Sie versuchen, zu tun? Möglicherweise haben Sie Ihre E / A für Ihre Arbeitslast unterschritten. Schauen Sie sich nicht nur Ihre physischen Spindeln, RAID-Einstellungen usw. an. Schauen Sie sich Ihre Pfade zu Ihren Festplatten an. Übertragen Sie alles über einen einzelnen 1-GB-Link, den Sie mit vielen anderen Zugriffen gemeinsam nutzen? Können Sie sich die Datenträgerleistungsmetriken aus Sicht des Speichers ansehen?
( Hinweis: Sehen Sie sich für diese Wartestatistik- und Perfmon-Analyse verschiedene Zeiträume und Nutzungsarten an. Haben Sie nachts andere Nutzungsstatistiken als tagsüber? Stapelverarbeitungsfenster? Wartungsfenster, in denen Sie viele Indizes neu erstellen? Schauen Sie sich diese Tools in jedem dieser Zeiträume an und verstehen Sie, was Sie jeweils sehen.
Eine weitere Überlegung zur IO-Leistung hier -
- Sie sagten, dass System-DBs und Benutzer-DBs gemeinsam genutzt werden. Ist das Produktion? Wenn ja, ist das nicht immer das beste Szenario. Teilen Sie auch Protokolldateien und Datendateien auf denselben Laufwerken? Das ist auch nicht das beste Szenario. Was teilt dieser Speicher sonst noch? In einer Welt, in der Sie sich Sorgen um Spindeln und RAID-Gruppen und -Datenträger machen und entscheiden müssen, wer die leistungsstärksten Datenträger erhält, neige ich dazu (als Faustregel), was in der DB-Welt nicht besonders gut zu haben ist Aber diesmal trifft es eher zu. Ich arbeite am schnellsten und engagiertesten mit TempDB (mehr dazu weiter unten), dann mit den Protokolldateien und dann mit den Datendateien. In einer Welt, in der sich auf einem Gerät wie NetApp, Dell Equal Logic oder EMC VNX usw. ein großer Haufen Festplatten befindet,
2.) Aus welchen Gründen könnte TempDB höher sein?
TempDB ist also eine Datenbank und kann wie jede andere Datenbank, die ich gerade besprochen habe, IO-Stalls haben. Aber aus welchen Gründen kann TempDB höhere Lesezugriffe haben? (Nicht erschöpfend, ich freue mich über Ergänzungen oder Überlegungen zu Änderungen, anderen Antworten oder Kommentaren.) -
- Aufgrund Ihres Codes - Verwenden Sie TempDB häufig und gezielt in Ihrem Code? Viele temporäre Tabellen und Tabellenvariablen erstellt und zerstört? Eine Menge Dinge in TempDB wie diese tun? Das ist nicht unbedingt schlecht oder gut, aber Sie könnten sich das ansehen und Ihr beabsichtigtes TempDB-Verwendungsmuster verstehen.
- TempDB ist ein gemeinsames Arbeitspferd - TempDB ist eine Datenbank, die als temporärer Bereich für benutzerdefinierte temporäre Objekte und verschiedene Arbeitstabellen und Operationen verwendet wird, die von Ihrer gesamten SQL-Instanz verwendet werden. Wie viele Benutzer-DBs gibt es? Welche Art von Arbeitsbelastung sehen Sie im Allgemeinen? TempDB ist eine Ressource, die alle Dinge gemeinsam nutzen können.
- Ineffiziente Abfragen und unzureichender Arbeitsspeicher - Möglicherweise gibt es Abfragen, bei denen die Indizes nicht genau genug verwendet werden oder große Scan- und Sortiervorgänge ausgeführt werden. Große Hash-Operationen, und der Speicher auf dem Server reicht für diese nicht aus. Diese Vorgänge werden als Arbeitstabellen hinter den Kulissen auf TempDB übertragen. Manchmal kann dies vermieden werden, indem Sie Ihre Abfragepläne überprüfen und indizieren oder die Abfrage optimieren. Manchmal passiert es (mehr noch bei Lagerarbeitslasten). Wenn Sie über genügend Arbeitsspeicher verfügen, kann dies Abhilfe schaffen, diese Abfragen können jedoch gelegentlich weiterhin auftreten. Schau dir das auch an.
- Verwenden Sie die Read Committed Snapshot Isolation-Stufe mit einer angemessenen Anzahl von Aktualisierungen in Ihrem System? Dies kann auch zu einer erhöhten TempDB-Aktivität führen.
Der springende Punkt ist: TempDB wird auf vielfältige Weise verwendet, und es überrascht mich überhaupt nicht, wenn ich es als eine Ihrer am stärksten ausgelasteten, wenn nicht sogar am stärksten ausgelasteten Datenbanken betrachte. Es überrascht mich auch nicht, wenn ich sehe, dass es die höchste Anzahl und den höchsten Durchschnittsstand aller Datenbanken bei einem Kunden gibt. Manchmal liegt es an der Art der Arbeitsbelastung. Wenn Sie sich einige der hier erwähnten Punkte ansehen, können Sie mit Sicherheit feststellen, ob diese Zahlen auf ein Problem hinweisen, und wenn ja, wie Sie es genauer lösen können.