warum ist io_stall_writes_ms für tempdb so viel höher?

11

Wir haben die Benutzer- und Systemdatendateien auf demselben Laufwerk. Das (io_stall_write_ms / (1.0 + num_of_writes)) liegt unter 2 für die Benutzerdateien, aber die Tempdb-Dateien liegen normalerweise über 400. Ich sehe das auf einigen Servern und bin gespannt, ob es einen Grund gibt, warum das Schreiben in Tempdb länger dauert als eine reguläre Datenbank-Datendatei.

SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result, 
io_stall_write_ms, num_of_writes, 
fs.database_id, 
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]

Vielen Dank,


quelle
1
Verwenden Sie Snapshot oder RCSI? tempdb auf denselben Arrays / Laufwerken wie Daten- / Protokolldateien? Wie viele Schreibvorgänge in Tempdb im Vergleich zu den anderen Dateien? Die Statistik an sich ist ohne den Kontext, in dem sie auftritt, etwas bedeutungslos.
Mark Storey-Smith

Antworten:

17

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:

  1. 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.
  2. Schauen Sie sich die IO-Leistung an. Sehen Sie sich insbesondere die Physical Disk:Avg Disk Sec/Readund -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.
  3. 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.) -

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Mike Walsh
quelle
-4

TempDB wird von allen Datenbanken in der Instanz gemeinsam genutzt. Daher kann es in TempDB manchmal zu Konflikten mit bestimmten Seiten kommen: SGAM , GAM und PFS . Kurz gesagt, auf diesen Seiten wird nachverfolgt, was in TempDB bisher verwendet wurde und wo Speicherplatz für eine neue Verwendung verfügbar ist.

In der Regel wird dies durch Hinzufügen mehrerer Datendateien zu TempDB behoben. Es gibt ein paar verschiedene Philosophien bezüglich der richtigen Anzahl, aber alle sind sich einig, dass Sie mehr als eine haben sollten.

Hier sind ein paar Fragen zum Ausführen ...

Dieser zeigt Ihnen, wie viele Dateien TempDB hat und wo sie sich befinden.

-- tempdb layout
use tempdb
go
exec sp_helpfile
go

Dieser zeigt Ihnen, wie viele CPUs und Kerne Sie haben.

-- cores and hyperthreading
select cpu_count, hyperthread_ratio 
from sys.dm_os_sys_info
go

Dieser zeigt Ihnen, wie viele NUMA-Knoten und Kerne pro NUMA-Knoten Sie haben.

-- numa nodes and schedulers
select node_id, online_scheduler_count
from sys.dm_os_nodes
order by node_id
go

Dieser zeigt Ihnen, auf welchen Seiten in TempDB gewartet wird.

-- see if anything is waiting on tempdb
select * 
from sys.dm_os_waiting_tasks
where resource_description like '2:%'
go

Hier ist ein Artikel, der das Problem der Seitenkonflikte etwas ausführlicher behandelt.

OK, also jetzt der Philosophieteil ... :-)

Wenn ich mich auf einem SMP- System befinde , möchte ich nur so viele Dateien wie die Hälfte aller Kerne .

Wenn ich auf einem NUMA- System bin, möchte ich nur so viele Dateien wie Kerne pro NUMA-Knoten .

Ich sehe jedoch selten eine Verbesserung, wenn ich mehr als vier Dateien für TempDB habe. Daher beginne ich normalerweise mit vier und überwache die Konflikte, wie in dem Artikel, auf den ich verlinkt habe, erläutert.

Wenn ich weiterhin Probleme sehe, würde ich zwei weitere hinzufügen. Überprüfen Sie erneut, fügen Sie weitere hinzu, und wiederholen Sie den Vorgang, bis der Konflikt verschwindet.

Steven
quelle
5
-1 Es tut uns leid, aber auch hier gibt es eine ganze Menge FUD. GAM- / SGAM- / PFS-Konflikte manifestieren sich als Latch-Konflikte. Sie führen nicht zu längeren E / A-Wartezeiten, die im Mittelpunkt der OPs-Frage stehen.
Mark Storey-Smith
3
Das klingt nach viel Blog-Regurg. Das größte Problem an dieser Stelle ist, dass alles auf die gleiche Spindel trifft. E / A ist fast immer der größte Engpass in einem Datenbanksystem. Wenn Sie alles auf derselben Festplatte (vermutlich auf derselben Spindel) speichern, werden Ihre gesamten Wartezeiten in die Höhe schnellen. Eigentlich würde ich eine Google / Bing-Suche nach "Waits and Queues" empfehlen, damit dieser E / A-Engpass überprüft und quantifiziert werden kann. Auf diese Weise kann OP zu den Service-Eigentümern zurückkehren und auf die Verwendung von $$ für Festplatten und Ausfallzeiten drängen.
Swasheck
2
beginnen hier
swasheck
2
@Mark - Danke für die Klarstellung. Ich freue mich über das Feedback.
Steven