Unsere Anbieteranwendungsdatenbank ist sehr TempDB-intensiv.
Der Server ist virtuell (VMWare) mit 40 Kernen und 768 GB RAM und führt SQL 2012 Enterprise SP3 aus.
Alle Datenbanken einschließlich TempDB befinden sich auf Tier 1 SSD in SAN. Wir haben 10 Tempdb-Datendateien, die jeweils auf 1 GB vorgewachsen sind und niemals automatisch wachsen. Gleiches gilt für 70 GB Protokolldatei. Die Trace-Flags 1117 und 1118 sind bereits gesetzt.
sys.dm_io_virtual_file_stats zeigt über 50 Terabyte an, die im letzten Monat in Tempdb-Daten- und Protokolldateien gelesen / geschrieben wurden, mit einer kumulierten io_stall von 250 Stunden oder 10 Tagen.
Wir haben den Code und die SPs des Anbieters bereits in den letzten 2 Jahren optimiert.
Jetzt denken wir darüber nach, Tempdb-Dateien auf dem RAM-Laufwerk abzulegen, da wir eine Menge Speicher haben. Da Tempdb beim Neustart des Servers zerstört / neu erstellt wird, ist es ein idealer Kandidat für den flüchtigen Speicher, der auch beim Neustart des Servers gelöscht wird.
Ich habe dies in einer niedrigeren Umgebung getestet und es hat zu schnelleren Abfragezeiten, aber einer erhöhten CPU-Auslastung geführt, da die CPU mehr Arbeit leistet, anstatt auf ein langsames Tempdb-Laufwerk zu warten.
Hat jemand anderes seine Tempdb auf RAM in High-Oltp-Produktionssystemen gestellt? Gibt es einen großen Nachteil? Gibt es Anbieter, die speziell ausgewählt oder vermieden werden müssen?
quelle
Antworten:
Patch: Stellen Sie sicher, dass Sie das kumulative Update 10 für Service Pack 1 2012 oder höher verwenden. In SQL 2014 hat Microsoft TempDB so geändert, dass es weniger darauf aus ist, auf die Festplatte zu schreiben , und es wurde auf 2012 SP1 CU10 zurückportiert , sodass der TempDB-Schreibdruck erheblich verringert werden kann.
Zweitens erhalten Sie genaue Zahlen zu Ihrer Latenz. Überprüfen Sie sys.dm_io_virtual_file_stats , um den durchschnittlichen Schreibstillstand für Ihre TempDB-Dateien zu ermitteln. Meine Lieblingsmethode ist entweder:
Schauen Sie sich den Abschnitt mit den Dateistatistiken an und konzentrieren Sie sich auf die physischen Schreibvorgänge. Die SinceStartup-Daten können etwas irreführend sein, da sie auch Zeiten enthalten, in denen CHECKDB ausgeführt wird, und das kann Ihre TempDB wirklich hämmern.
Wenn Ihre durchschnittliche Schreiblatenz über 3 ms liegt, haben Sie möglicherweise Solid-State-Speicher in Ihrem SAN, aber es ist immer noch nicht schnell.
Betrachten Sie zuerst lokale SSDs für TempDB. Gute lokale SSDs (wie Intels PCIe NVMe-Karten, die unter 2.000 USD liegen, insbesondere bei den von Ihnen beschriebenen Größen) weisen eine extrem niedrige Latenz auf, die geringer ist als mit gemeinsam genutztem Speicher. Bei der Virtualisierung hat dies jedoch einen Nachteil: Sie können den Gast nicht von einem Host auf einen anderen verschieben, um auf Lade- oder Hardwareprobleme zu reagieren.
Betrachten Sie zuletzt ein RAM-Laufwerk. Bei diesem Ansatz gibt es zwei große Fallstricke:
Erstens, wenn Sie wirklich eine starke TempDB-Schreibaktivität haben, kann die Änderungsrate im Speicher so hoch sein, dass Sie den Gast nicht von einem Host zum anderen bewegen können, ohne dass es jeder merkt. Während vMotion müssen Sie den RAM-Inhalt von einem Host auf einen anderen kopieren. Wenn sich das wirklich so schnell ändert, als Sie es über Ihr vMotion-Netzwerk kopieren können, können Probleme auftreten (insbesondere, wenn diese Box mit Spiegelung, AGs oder einem Failover-Cluster verbunden ist).
Zweitens sind RAM-Laufwerke Software. Bei den Lasttests, die ich durchgeführt habe, war ich nicht besonders beeindruckt von ihrer Geschwindigkeit unter sehr starken TempDB-Aktivitäten. Wenn es so schwer ist, dass eine SSD für Unternehmen nicht mithalten kann, müssen Sie auch die RAM-Laufwerkssoftware besteuern. Sie sollten diesen Test unbedingt intensiv laden, bevor Sie live gehen. Probieren Sie beispielsweise viele gleichzeitige Indexwiederherstellungen in verschiedenen Indizes aus, die alle sort-in-tempdb verwenden.
quelle
Das Erstellen eines RAM-Laufwerks sollte trivial sein. Viele bootfähige Linux-USB-Sticks und optische Laufwerke erstellen ein RAM-Laufwerk und speichern dort Betriebssystemdateien. Das Root-Dateisystem befindet sich dann im Speicher. In Windows wurde früher ein RAM-Laufwerk als Gerätetreiber in config.sys geladen. Normalerweise wurde der Treiber in einen hohen Speicher geladen. Meiner Meinung nach ist dies eine sehr gute und einfache Lösung. Wenn Sie Ihre Lösung mit einem RAM-Laufwerk erstellt haben, würde ich gerne davon hören. Ich möchte etwas Ähnliches tun, möchte aber Schreibvorgänge in den permanenten Speicher ausführen und eine Datenbank im RAM speichern. In meinem Fall haben wir Maschinen, die mehr RAM installieren können, als das Betriebssystem verwenden kann. Durch das Erstellen einer RAM-Disk vor dem Laden des Betriebssystems kann RAM verwendet werden, das das Betriebssystem sonst nicht sehen würde.
quelle