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?
quelle
Antworten:
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.
quelle
Die Skalen sind bei allen unterschiedlich, abgesehen von einer Spitze in 4 der Diagramme würden Ihre Durchschnittswerte alle etwa 10-25% betragen.
quelle
Ü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.
quelle
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.
quelle
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)
quelle