SQL Server-Parallelitätsleistung


8

In unserer Produktionsumgebung sind Leistungsprobleme aufgetreten.

Wir haben festgestellt, dass bei einem Anstieg der aktiven Sitzungen über 25 die CPU-Auslastung 100% erreicht und der Ausfall lange dauert.


Die Umwelt, die wir haben:

Produkt Microsoft SQL Server Enterprise Edition 9.3 (sp2)

CPUs 2 (Xeon 2.13)

Speicher 7G

Momentaufnahme des Sitzungsdetails1

Aktive Sitzungen 25

Aktive Transaktionen 496

Leerlaufsitzungen 289

Blockierte Transaktionen 29

Schnappschuss von Sitzungsdetails2

Aktive Sitzungen 59

Aktive Transaktionen 885

Leerlaufsitzungen 267

Blockierte Transaktionen 49


Ich würde gerne wissen:

  1. ob 2CPUs 25 aktive Sitzungen (500 aktive Transaktionen) gut verarbeiten können.PS: Wir haben getestet, dass eine Transaktion, die 5 Tabellen liest / schreibt, ohne Parallelitätsanforderung auf Anwendungsebene etwa 1 Sekunde dauert.

  2. ob die blockierten Transaktionen mehr CPU-Auslastung erfordern.PS: Die blockierten Transaktionen sind hauptsächlich auf Sperren für 2 Tabellen zurückzuführen.

Was ist die Lösung: CPUs hinzufügen oder Anwendung (Java / Ruhezustand) optimieren, um diese Transaktion zu verkürzen und Blöcke in der Tabelle zu verringern?


1
Was ist sonst noch auf dem Server los? Ist es ein dedizierter SQL Server? 7 GB sind nicht großartig, aber ich habe Schlimmeres gesehen.
Thomas Stringer

Antworten:


6

Ihre Optionen, um ein gutes Bild von der Situation zu bekommen, in der alles kriecht:

  • Verwenden Sie serverseitige Traces , um die längsten und schwersten Sitzungen anzuzeigen
  • Verwenden Sie die gespeicherte Prozedur Who is Active von Adam Machanic, um die Informationen der Momente zu speichern, in denen der Server geladen wird - ein fantastisches kostenloses Skript
  • Verwenden Sie den Aktivitätsmonitor von Management Studio, um einen visuellen Blick zu erhalten (CPU und E / A sind diejenigen, die ich am nützlichsten fand) - ein ziemlich gutes Tool, das in Management Studio enthalten ist
  • Verwenden Sie ein kostenloses Tool eines Drittanbieters - Confio Ignite Free - das sehr gut für Momente geeignet ist , in denen alles langsam ist und Details zu den Wartestatistiken, Blockieren usw. angezeigt werden müssen. - fantastisches kostenloses Tool
  • Überprüfen Sie die Statistiken auf den neuesten Stand
  • Überprüfen Sie, ob Indizes fragmentiert sind, und defragmentieren Sie sie gegebenenfalls
  • Befolgen Sie die anderen Hinweise zum Überprüfen fehlender Indizes und des Designs
  • Überprüfen Sie die Möglichkeit, die Snapshot-Isolationsstufe in Ihrer Datenbank zu verwenden (Sie haben eine hohe Blockierung, daher ist es gut zu prüfen , ob Sie Ihre aktuelle Isolationsstufe wirklich benötigen).

Und viel Glück bei der Untersuchung der Probleme :-).


5

Ihr Problem ist höchstwahrscheinlich eine schlechte Abfrageleistung, die durch verursacht wird

  • schlechtes Design
  • schlechte Indizierung

Sperren / Blockierungen sind auf eine schlechte Indizierung zurückzuführen, da die gesamte Zeit damit verbracht wird, Tabellen durchgehend zu scannen. CPU ist hier irrelevant.

Überprüfen Sie als schnelle Lösung anhand der Informationen in diesem Artikel, ob Indizes fehlen: http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing- index-dmvs.aspx


4

Ich stimme GBN und Marian zu.

Um Ihre Frage zu 2-CPUs zu beantworten, die 25 Anforderungen bearbeiten: Ich habe ein 2-CPU-System, das etwa 750 Benutzerverbindungen und einen laufenden Durchschnitt von 4K-Stapelanforderungen pro Sekunde unterstützt. Für mich sind mehrere Punkte wichtig: Design, Management und Tuning. Wenn Sie mit einem schlechten Design Ihrer Anwendung und Datenbank beginnen, schlagen Sie beim Laden fehl (denken Sie an Skalierung).

Eine hohe CPU kann auf Speicherdruck hinweisen. Sie erwähnen, dass SQL Server nur 7 GB Speicher zur Verfügung hat. Wenn Sie schlecht funktionierende Indizes haben (zu viele Indizes, falsche Indizes oder keine Indizes), führt dies dazu, dass das System mehr Daten der Datenbank für verschiedene Anforderungen in den Speicher paginiert, als wenn geeignete Indizes vorhanden sind. Ich würde Sie davor warnen, wild wild zu sein, wenn Sie Indizes erstellen, da die falschen auch Sie verletzen, da jeder das Potenzial hat, im Verlauf einer Zeilenaktualisierung (Erstellen-Aktualisieren-Löschen) eine Aktualisierung erforderlich zu machen.

Für die Verwendung der DMVs mit fehlendem Index müssen Sie außerdem das verwenden, was Sie über Ihre Anwendung und Datenbank wissen, und nicht nur jeden empfohlenen Index implementieren. Ich würde Kimberly Tripps Blogeinträge zu Indizes hier lesen . Nach dem Abschnitt Index kann ein Blick auf die anderen Kategorien für Ihre Situation hilfreich sein.

Wenn Ihre Java / Hibernate-Aktualisierung von 5 Tabellen in einer einzelnen Transaktion die Aktualisierungen über mehrere Roundtrips zur Datenbank durchführt, sind Sie für Konflikte offen (blockierte CRUD-Anforderungen). Das Problem verschlimmert sich, wenn die Anwendung nicht rechtzeitig zur Datenbank zurückkehren kann. In der Anwendung kann die zugehörige aktive Transaktion die Verarbeitung anderer Anforderungen blockieren und Zeitüberschreitungen bei Anforderungen verursachen.

Addieren Sie die beiden oben genannten Probleme und Sie bekommen einen schlimmen Fall von Leistungskopfschmerzen.

Es wäre sehr gut, die Anzahl der Datenbank-Roundtrips im Rahmen einer einzelnen Transaktion zu reduzieren. Vielleicht würde eine gespeicherte Prozedur helfen.

Der Rest erfordert Arbeit, damit Ihre Anwendung skaliert werden kann. Sie können auch Speicher in Betracht ziehen, dies sollte jedoch erfolgen, nachdem eine Entwurfs- und Leistungsüberprüfung durchgeführt wurde und die erforderlichen Änderungen, die durch sofortiges Hinzufügen von Speicher implementiert wurden, Ihre Probleme maskieren.

Befolgen Sie unbedingt die Vorschläge, die Marian skizziert hat.

Ich würde sagen, Sie haben eine wunderbare Herausforderung gefunden und wünschen Ihnen viel Erfolg!


3
  1. Nach meiner Erfahrung haben wir MS SQL Server 2000 mit 2 CPUs und mehr als 30 aktiven Sitzungen und mehr als 1000 Transaktionen. Es war schwer zu bedienen, aber es hat funktioniert.
  2. Ich bin nicht sicher, ob Sperren mehr CPU verbrauchen. Sperren und CPU-Auslastung sind meiner Meinung nach zwei verschiedene Leistungsprobleme.

Als Lösung sollten Sie zunächst sicherstellen, dass Ihr Hauptproblem die CPU ist. Versuchen Sie, dieses Problem zu lesen , um die Ursache Ihrer Probleme zu finden und eine geeignete Lösung zu finden. Finnaly, wenn Sie können, um Ihre Transaktion so klein wie möglich zu machen - tun Sie es.


3

Meine ersten Gedanken sind, die Anzahl der Transaktionen und das Ausmaß der Blockierung zu reduzieren. Können Sie einige der Transaktionen in mehrere Bits aufteilen? Können Sie einige der Abfragen aus den Transaktionen ziehen? Wie Alex_l erwähnt hat, ist hier die kleinstmögliche Transaktion ideal.

Ich stimme gbn zu, das Hinzufügen von Indizes könnte ebenfalls hilfreich sein.

Ein anderer Gedanke ist, dass ich mir auch Ihre Schlösser ansehen würde. Nehmen Sie Sperren auf Tabellenebene auf, wenn Sie nur eine einzelne Zeile aktualisieren? Möglicherweise möchten Sie SQL Server eine Sperre auf Zeilenebene vorschlagen. Das würde viele Probleme lösen. (Zugegeben, wenn Sie 5 Tische haben, ist das wahrscheinlich nicht der Fall, sondern nur ein Gedanke.)

Zum Schluss würde ich mir Ihre Tabellen ansehen, die Sie verwenden. Wenn jeder eine bestimmte Tabelle blockiert, können Sie die Logik für diese Tabelle an das Ende Ihrer Transaktion verschieben? Wenn Sie die Zeit reduzieren können, in der Sie eine Sperre für diese Tabelle mit hoher Nachfrage halten, kann dies hilfreich sein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.