Wir haben SQL Server 2008 R2 (10.50.1600) auf einem virtuellen Windows 2008 R2-Server ausgeführt. Nach dem Upgrade der CPU von 1 auf 4 und des Arbeitsspeichers von 4 auf 10 GB haben wir festgestellt, dass die Leistung schlechter ist.
Einige Beobachtungen, die ich sehe:
- Eine Abfrage, deren Ausführung <5 Sekunden dauerte, dauert jetzt> 200 Sekunden.
- Die CPU ist mit sqlservr.exe als Schuldigen auf 100 festgelegt.
- Eine ausgewählte Anzahl (*) in einer Tabelle mit 4,6 Millionen Zeilen dauerte über 90 Sekunden.
- Die Prozesse, die auf dem Server ausgeführt werden, haben sich nicht geändert. Die einzige Änderung bestand darin, die CPU und den RAM zu erhöhen.
- Andere SQL-Server verfügen über eine statische Auslagerungsdatei, in der dieser Server so eingestellt ist, dass er sie selbst verwaltet.
Ist schon jemand auf dieses Problem gestoßen?
Per sp_BlitzErik bin ich gelaufen
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Gib mir diese Ergebnisse.
Antworten:
Hier ist viel los, und das meiste ist ziemlich breit und vage.
2008R2 RTM wurde am 21. April 2010 veröffentlicht. Sie sollten vorrangig auf das neueste Service Pack zugreifen, das vor etwa drei Jahren auf den Markt kam. Auf diese Weise werden Sie abgedeckt, wenn Sie einen seltsamen Fehler oder etwas treffen. Gehen Sie hierher, um herauszufinden, was Sie herunterladen müssen.
Da Sie vCPUs (von 1 bis 4) hinzugefügt und keine Einstellungen geändert haben, können Ihre Abfragen jetzt parallel ausgeführt werden. Ich weiß, das hört sich so an, als wären sie alle schneller, aber warte!
Möglicherweise haben Sie RAM hinzugefügt, aber möglicherweise nicht den maximalen Serverspeicher geändert, damit Ihr Server davon Gebrauch machen kann.
Finden Sie heraus, worauf Ihr Server wartet. Ein Open-Source-Projekt, an dem ich arbeite, stellt kostenlose Skripte zur Verfügung, mit denen Sie Ihren SQL Server messen können. Kommen Sie hierher, wenn Sie es versuchen wollen.
Greifen Sie zu sp_BlitzFirst, um die Wartestatistiken Ihres Servers zu überprüfen. Sie können es auf verschiedene Arten ausführen.
Dies zeigt Ihnen, worauf Ihr Server seit dem Start gewartet hat.
EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Dies zeigt Ihnen in einem 30-Sekunden-Fenster, worauf Abfragen jetzt warten.
EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;
Sobald Sie herausgefunden haben, worauf Abfragen warten (es gibt eine Menge Informationen zu Wartestatistiken), können Sie Änderungen vornehmen, um die Dinge unter Kontrolle zu bringen.
Wenn Sie sehen
CXPACKET
, dass sie warten , bedeutet dies, dass Ihre Abfragen parallel verlaufen und sich möglicherweise überschlagen. Wenn Sie diese Option auswählen, sollten Sie den Kostengrenzwert für Parallelität möglicherweise auf 50 erhöhen und MAXDOP möglicherweise auf 2 senken.Nach diesem Schritt können Sie beispielsweise sp_WhoIsActive oder sp_BlitzWho (letzteres ist im GitHub-Repo von früher enthalten) zum Erfassen von Abfrageplänen verwenden. Abgesehen von Wartestatistiken sind sie eines der wichtigsten Dinge, die Sie sich ansehen können, um herauszufinden, was falsch läuft.
Vielleicht möchten Sie auch diesen Artikel von Jonathan Kehayias über VMWare-Zähler lesen , um ihn in Bezug auf SQL Server zu lesen .
Aktualisieren
Das Überprüfen der Wartestatistiken und des Jungen sind sie sonderbar. Bei den CPUs ist definitiv etwas los. Ihr Server sitzt meistens gelangweilt herum, aber wenn es heiß hergeht, wird es schlimm. Ich werde versuchen, dies leicht zu brechen.
Sie treffen eine Giftwartezeit genannt
THREADPOOL
. Sie haben nicht viel davon, aber das macht Sinn, weil Ihr Server nicht besonders aktiv ist. Ich erkläre gleich warum.Sie haben wirklich lange durchschnittliche Wartezeiten auf
SOS_SCHEDULER_YIELD
undCXPACKET
. Sie befinden sich auf einer VM und möchten sicherstellen, dass der SQL Server Reservierungen hat oder dass die Box nicht schrecklich überzeichnet ist. Ein lauter Nachbar kann Ihren Tag hier wirklich ruinieren. Sie sollten auch sicherstellen, dass der Server / VM-Gast / VM-Host nicht im ausgeglichenen Stromversorgungsmodus ausgeführt wird. Dadurch werden Ihre CPUs auf unnötig niedrige Geschwindigkeiten heruntergefahren und nicht sofort wieder auf die volle Geschwindigkeit hochgefahren.Wie binden sie ein? Mit 4 CPUs haben Sie 512 Worker-Threads. Denken Sie daran, Sie hatten dieselbe Menge mit einer einzelnen CPU, aber jetzt, da Ihre Abfragen parallel ausgeführt werden können, können sie viel mehr Arbeitsthreads verbrauchen. In Ihrem Fall 4 Threads pro parallelem Zweig einer parallelen Abfrage.
Was läuft parallel? Höchstwahrscheinlich alles. Die Standardkostenschwelle für Parallelism ist 5. Diese Zahl die Standardirgendwann in den späten 90er Jahren gemacht wurde auf einem Desktop arbeiten , dass sah wie folgt aus .
Zugegeben, Ihre Hardware ist kleiner als die der meisten Laptops, aber Sie sind der Sache immer noch ein Stück voraus.
Wenn viele parallele Abfragen gestartet werden, gehen Ihnen diese Arbeitsthreads aus. In diesem Fall warten Abfragen nur darauf, dass die Threads gestartet werden. Das ist auch der
SOS_SCHEDULER_YIELD
Punkt, an dem Abfragen die CPUs verlassen und lange nicht mehr weiterarbeiten. Ich sehe keine blockierenden Wartezeiten, daher sind Sie höchstwahrscheinlich nur überlastet, wenn es um abfrageinterne Parallelitätswarten geht.Was kannst du tun?
sp_BlitzIndex
, um nach fehlenden Indexanforderungen zu suchen.Weitere Informationen zur Fehlerbehebung finden Sie in dem Whitepaper, das ich für Google zum Thema Hardwaredimensionierung in der Cloud geschrieben habe.
Hoffe das hilft!
quelle
Ja! Ich habe diese Art von Situation auf SQL Server VMS in unserer Serverfarm erlebt. Sehen Sie sich die CPU-Bereitschaftszeit des virtuellen Computers und die Indikatoren für die Speicherballontreiber an. CPU READY TIME - BLOG TEIL I und Verständnis von VMware Ballooning Die Arbeit mit meinem Systemadministrator war der Schlüssel, aber nicht einfach ...
quelle
Eine Sache, auf die ich nicht hingewiesen habe, ist, dass das Hinzufügen von vCPUs zu einer VM aufgrund der Zeitplanung sehr häufig verlangsamt werden kann.
Die Grundidee ist, dass der Hypervisor bei einer VM mit 4 vCPUs darauf warten muss, dass 4 physische Kerne verfügbar sind, damit alle vCPUs geplant werden können, auch wenn drei davon inaktiv sind.
Wenn auf Ihrem Host nicht viele Kerne vorhanden sind und Ihre anderen Workloads ausgelastet sind, kann dies zu zusätzlichen Wartezeiten und einem erheblichen Leistungseinbruch führen.
In VMware ESXi können Sie es in den erweiterten Diagrammen über CPU Ready sehen.
Hier ist einer von vielen Artikeln mit einem realen Beispiel für dieses Ereignis und wie es diagnostiziert wurde .
Das Hinzufügen von mehr RAM kann auch zu einem plötzlichen Leistungseinbruch führen, wenn die RAM-Zuweisung der VM größer als ein NUMA-Knoten ist.
Darüber hinaus kann sich die Konfiguration Ihrer vCPUs (vSockets vs. vCores) auf einige Anwendungen wie SQL Server auswirken. Dies liegt daran, dass SQL Server selbst NUMA-fähig ist (um den gleichen NUMA-übergreifenden Leistungseinbruch zu vermeiden) und dass VMware virtuelle NUMA-Knoten möglicherweise unterschiedlich darstellt.
Dies wird in einem Blogbeitrag auf der VMware-eigenen Website behandelt .
Vor diesem Hintergrund bin ich froh, dass Sie die Probleme mit Eriks Hilfe gelöst haben, aber Sie möchten sich vielleicht auch diese Dinge ansehen und überlegen.
quelle
Nur eine kleine Hilfe (kann nicht als Kommentar gepostet werden) weiter @ sp_BlitzEriks Antwort, ich habe einige Fragen bei Pinal und Max Vernon (kann mich nicht erinnern, wo), die besagen, wie viel MAXDOP Sie verwenden sollten:
-------------------------------------------------- -------
quelle
MAXDOP = 2
der mit @sp_BlitzErik übereinstimmt. Vielen Dank!