Warum ist die CPU-Auslastung unserer 8-CPU-SQL Server-Box so asymmetrisch?

7

Ich habe festgestellt, dass die CPU-Auslastung auf unserem 8-CPU-Datenbankserver, auf dem SQL Server 2008 ausgeführt wird, überhaupt nicht ausgeglichen ist.

Hier sind die 1-Tages-Durchschnittswerte für einen zufälligen Tag vor einiger Zeit, die typisch und durchweg asymmetrisch sind:

9, 15, 10, 21, 18, 21, 14, 9

(hier nur eine Miniaturansicht, da das Bild sehr groß ist, aber klicken Sie sich durch, um das Bild in voller Größe zu sehen.)

Im Vergleich mit unserem 4-CPU - Web - Server, die alle sind fast genau und perfekt ausgewogen die ganze Zeit , die mich seltsam geschlagen.

Dies ist ein dedizierter Server. Das einzige, was darauf ausgeführt wird, ist SQL Server 2008 (und die integrierte Volltextindizierung, die wir ziemlich häufig verwenden). Daher bin ich mir nicht sicher, warum die CPU-Auslastung so asymmetrisch ist . Gedanken?

Jeff Atwood
quelle
Ich richte gerade eine SQL Server 2012-Umgebung ein und wundere mich über solche Dinge. Jeff, können Sie uns bitte mitteilen, ob das Ändern Ihrer Dateien / Dateigruppen (gemäß der akzeptierten Antwort) dieses Problem für Sie gelöst hat? Vielen Dank.
Elliveny

Antworten:

9

Wie sind Ihre Dateien / Dateigruppen eingerichtet?

Ich werde mich plagiieren :

Noch ein Gedanke zu IO: Wir haben sorgfältig darauf geachtet, unsere am häufigsten verwendeten Tabellen für Dateigruppen mit mehreren Dateien einzurichten. Eine der Leistungsverbesserungen besteht darin, dass SQL Anforderungen an jede Datei in der Dateigruppe weiterleitet. Wenn sich BigOverUsedTable also in FileGroup1 befindet und FileGroup1 vier Dateien enthält und Ihre Datenbank über 8 Kerne verfügt, werden tatsächlich vier Kerne für die Auswahl verwendet große Zahl knirscht böse Abfrage von BigOverUsedTable "- während sonst nur eine CPU verwendet wird. Wir haben diese Idee aus diesem MSDN-Artikel:

http://msdn.microsoft.com/en-us/library/ms944351.aspx

Von TFA:

"Dateigruppen verwenden parallele Threads, um den Datenzugriff zu verbessern. Wenn nacheinander auf eine Tabelle zugegriffen wird, erstellt das System für jede Datei parallel einen separaten Thread. Wenn das System einen Tabellenscan für eine Tabelle in einer Dateigruppe mit vier Dateien durchführt, werden vier separate verwendet Threads zum parallelen Lesen der Daten. Im Allgemeinen verbessert die Verwendung mehrerer Dateien auf separaten Datenträgern die Leistung. Zu viele Dateien in einer Dateigruppe können zu viele parallele Threads verursachen und Engpässe verursachen. "

Aufgrund dieses Hinweises haben wir vier Dateien in unserer Dateigruppe auf einem 8-Kern-Computer. Es funktioniert gut.

Bearbeiten: Dies hat jetzt eine andere (möglicherweise) bessere Antwort. Die Grafiken waren nicht maßstabsgetreu - wenn Sie genau hinschauen, ist jeder Prozessor tatsächlich zu etwa 20% ausgelastet, wie uzbones hervorhebt.

Bearbeiten: Wir können tatsächlich feststellen, dass die Verwendung mehrerer Dateigruppengruppen hilfreich ist, da wir nicht alle unsere Tabellen mit vier Dateien in die Dateigruppe eingefügt haben. Große Abfragen in der Dateigruppe "Einzeldatei" verwenden nur eine CPU, aber Abfragen in der Tabelle in der Dateigruppe mit vier Dateien treffen 4 CPUs.

Kyle Hodgson
quelle
Es gibt nur eine Datendatei und eine Protokolldatei pro Datenbank. Alles ist in der primären Dateigruppe.
Brent Ozar
Dann ist das definitiv etwas zu ändern. Ich denke nicht, dass es so einfach ist, Dateien zur Hauptdateigruppe hinzuzufügen. Ich glaube nicht, dass SQL Daten von BigOverUsedTable automatisch in die neue Datei migriert. Das habe ich einmal versucht. Wir mussten die Datenbank neu erstellen, als wir dies für die neue Dateigruppe taten.
Kyle Hodgson
1
Ja, Sie erstellen zusätzliche neue Dateien in der Dateigruppe. Wenn Sie beispielsweise 4 Dateien in der primären Dateigruppe haben möchten, erstellen Sie eine weitere 4 und leeren Sie die erste in die andere 4, indem Sie den Befehl DBCC SHRINKFILE mit dem Parameter EMPTYFILE verwenden. Löschen Sie dann diese erste Datei.
Brent Ozar
9

Die Skalen sind bei allen unterschiedlich, abgesehen von einer Spitze in 4 der Diagramme würden Ihre Durchschnittswerte alle etwa 10-25% betragen.

Uzbones
quelle
-1. Ich habe die Durchschnittswerte in den Posts aufgelistet, und unsere Web-Tier-Server befinden sich IMMER innerhalb weniger Prozent voneinander. Zum Beispiel jetzt: web1: 33,33,35,34. web2: 3,2,3,3.
Jeff Atwood
1
UZbones - finden Sie es nicht seltsam, dass einige durchschnittlich höher sind als andere? 9% vs 21% ist eine ziemlich große Varianz. Ich würde mir Sorgen machen, dass wir, wenn die Auslastung des Servers weiter ansteigt, früher auf einen Engpass stoßen, wenn die Auslastung nicht gleichmäßig ist.
Brent Ozar
1
Nein nicht wirklich. Nicht alle Anwendungen sind Multithread-Anwendungen oder können mehrere Prozessoren unterstützen. Außerdem sind nicht alle Prozesse gleich oder verbrauchen dieselbe CPU%. Webserver wären eher symmetrisch IMO, da die meisten Arbeitsprozesse (wahrscheinlich) ähnlich und einfacher sind, aber die Datenbank verfügt über einige Wartungsprozesse, die sich jeweils nur auf einer CPU befinden, und nicht alle SQL-Abfragen
verbrauche
Ich möchte jedoch darauf hinweisen, dass ich kein DBA bin. Es ist sicherlich möglich, dass Sie ein Problem haben, wenn Sie die Gesamtlast aufgrund der unterschiedlichen Durchschnittswerte erhöhen. Bei den niedrigen%, bei denen Sie sich gerade befinden, sehe ich jedoch kein Problem mit der aktuellen Varianz.
Uzbones
1
Wenn Sie es wirklich wissen wollen, habe ich diese Zeile Ihrer Frage wahrscheinlich nicht wirklich registriert, als ich sie las. Ich wollte nur darauf hinweisen, dass das Betrachten der Grafiken irreführend ist, was ich davon ausgehen würde, dass einige Leute dies getan haben, da diese Antwort einige positive Stimmen hat. Es tut mir leid, dass Sie irritiert sind, und die Punkte bedeuten mir nichts. Wenn Sie sich also wirklich darüber aufregen, werde ich es löschen, da ich nicht beabsichtigte, keine weiteren Probleme zu verursachen, die bereits jemand hat.
Uzbones
6

Überprüfen Sie dies heraus:

http://blogs.technet.com/mat_stephen/archive/2005/02/02/365325.aspx

SQL schreibt möglicherweise nur in eine Handvoll Dateien, und jeder Prozessor verwendet jede Datei.

MathewC
quelle
Ich mag diese Idee, aber es sind mehrere Datenbanken beteiligt, von denen jede ihre eigene Datendatei hat. Ich würde erwarten, dass es angesichts der Anzahl der Datenbanken etwas flacher wird. Ich mag es trotzdem.
Brent Ozar
@Brent - Ich denke, Mathew hat etwas vor ... ist es möglich, dass Unterschiede in der Menge der Daten, die aus den verschiedenen Datenbanken gelesen / geschrieben werden, die Varianz erklären, selbst wenn es so viele Datenbanken wie Kerne gibt? Durch Aufteilen dieser DBs in zusätzliche Dateigruppen kann sogar die CPU ausgelastet werden.
Sean Earp
@ Sean - Sie sagen, dass eine bestimmte große Datenbank an einer CPU haften würde? Ernsthaft?
Brent Ozar
3

Das erste, was ich nach solchen Dingen suche, sind Treiber. Ich hatte viele Probleme mit Netzwerk-Teaming und iSCSI MPIO-Treibern, die auf bestimmten Kernen haften. Ich wette, das ist hier nicht das Problem, da es so aussieht, als ob es über 4 Kerne hinweg passiert - ich sehe das normalerweise nur mit 2 Kernen. Ich werde nachfragen, ob jemand es so weit gesehen hat.

Ich habe es auch bei NUMA-Boxen gesehen, bei denen eine Speicherinkongruenz vorliegt - sagen wir, die Hälfte der Kerne ist mit bis zu 16 GB RAM und die anderen mit bis zu 8 GB verbunden. Google für IBM x460 NUMA, wenn Sie lustige Informationen dazu sehen möchten. Mit dem 460 und verwandten Modellen können Sie mehrere Server hintereinander schalten, um ein großes Eisen zu erstellen - ein bisschen relevant für den Blogeintrag "Scale-up vs out". Sie sind großartige Maschinen.

Brent Ozar
quelle
0

Weil das Leeren von CPU-Caches so unglaublich teuer ist, dass der Kernel versucht, dies um jeden Preis zu vermeiden.

(Hinweis: Zumindest Linux; ich wäre überrascht, wenn Windows nicht das gleiche Verhalten hätte)

David Pashley
quelle