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:
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.
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?
Antworten:
Ihre Optionen, um ein gutes Bild von der Situation zu bekommen, in der alles kriecht:
Und viel Glück bei der Untersuchung der Probleme :-).
quelle
Ihr Problem ist höchstwahrscheinlich eine schlechte Abfrageleistung, die durch verursacht wird
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
quelle
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!
quelle
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.
quelle
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.
quelle