2 Stimmen

Das Abrufen einer neuen Verbindung aus dem Verbindungspool wird in einer ASP.Net-Anwendung verzögert. Ich brauche Vorschläge für die Milderung

Bei einer bestimmten Datenbank tritt gelegentlich unter mäßiger Last der folgende Fehler auf.

"System.InvalidOperationException: Die Zeitüberschreitung ist abgelaufen. Die Timeout-Periode ist abgelaufen, bevor eine Verbindung aus dem Pool hergestellt werden konnte. Dies kann aufgetreten sein, weil alle gepoolten Verbindungen in Gebrauch waren und die maximale Poolgröße erreicht wurde."

Ich habe den Code durchkämmt, und wir schließen die Verbindungen in finally-Blöcken, wie es sein sollte, außer in einigen wenigen Fällen, die wir festgestellt haben, dass sie sehr selten aufgerufen werden. Wir werden diese Teile des Codes in unserer nächsten Version beheben, aber um das aktuelle Produktionsproblem zu lösen, schlage ich vor, die maximale Poolgröße auf 300 zu erhöhen. Die maximale Anzahl der gleichzeitigen Benutzer, die wir derzeit erleben, liegt bei 110, was offensichtlich über der Standard-Poolgröße (100) liegt.

Ich schlage auch vor, sicherzustellen, dass alle unsere Verbindungszeichenfolgen zu einer bestimmten SQL Server-Instanz identisch sind, um die unnötige Erstellung mehrerer Verbindungspools zu vermeiden. Ich hoffe, wir können die USE [Datenbank] Anweisung vor unseren eigentlichen SQL-Abfragen, wenn wir innerhalb einer einzelnen SQL Server-Instanz die Datenbank wechseln müssen.

Habt ihr irgendwelche Ideen, Hinweise, Vorschläge oder Probleme, auf die wir achten sollten?

4voto

Remus Rusanu Punkte 280155

Sie müssen die Verbindungslecks beseitigen . Wenn die Ursache für die Erschöpfung des Pools undichte Stellen sind, wird eine Erhöhung auf 300 das Unvermeidliche nur hinauszögern. Wenn eine Verbindung bei 10000 Aufrufen ausläuft (d.h. "sehr selten") und Sie 110 gleichzeitige Anfragen bei, sagen wir, 5 Sekunden pro Aufruf haben, ist eine Verbindung alle 8 Minuten undicht, so dass der Pool in 13 Stunden erschöpft sein wird. Die Zeitüberschreitungen werden jedoch schon viel früher auftreten, da die verfügbare Poolgröße schrumpft.

Wenn Sie harte Beweise dafür haben, dass nicht die Lecks die Ursache sind, sondern die Häufigkeit der Anrufe im Verhältnis zur Beckengröße, dann sollten Sie die Beckengröße erhöhen. Unabhängig von der Poolgröße, für die Sie sich entscheiden, müssen Sie, wenn Ihre Anfragen eine 1:1-Verbindung für die gesamte Dauer der Anfragen erfordern, die HTTP-Akzeptanz drosseln, damit sie die Poolgröße nicht überschreitet. Andernfalls kann es immer noch zu Spitzen kommen, die den Pool erschöpfen.

Auch Sie Mai Erwägen Sie die Verwendung einer stabileren Verbindungsfabrik, die eine nicht gepoolte Verbindung erneut versucht, wenn der Pool erschöpft ist. Natürlich geht dies Hand in Hand mit meinem vorherigen Punkt, dass, wenn Sie Ihre maximale HTTP-Akzeptanzzahl kalibrieren, um die Pool-Größe entsprechen, dann kann der Pool nicht erschöpft werden (es sei denn, Sie Leck, zurück auf Platz eins). Ich würde dies jedoch nicht empfehlen, ich denke, es ist viel besser, Anfragen im http.sys-Gebiet als im Anwendungsressourcenzuweisungsgebiet in eine Warteschlange zu stellen (d. h. die maximal akzeptierten HTTP-Aufrufe zu drosseln).

Und nicht zuletzt sollten Sie die Dauer der einzelnen Anrufe verkürzen. Wenn Ihr Anruf im Durchschnitt 5 Sekunden dauert, dann sehen Sie 110 gleichzeitige Verbindungen mit nur 22 Anfragen pro Sekunde. Wenn Sie die Dauer des Aufrufs durch Beseitigung von SQL-Engpässen auf 1 Sekunde verkürzen, können Sie 110 Anfragen pro Sekunde bedienen, um die gleiche Ressourcenobergrenze zu erreichen (110 gleichzeitige Anfragen), d. h. eine fünffache Zunahme des Datenverkehrs. Der größte Übeltäter sind in der Regel Tabellenscans. Stellen Sie sicher, dass alle Ihre Abfragen vernünftiges SQL verwenden und einen optimalen Datenzugriffspfad haben. Wie David sagt, ist der SQL Profiler Ihr Freund.

Sie können auch Folgendes verwenden SqlConnection.ChangeDatabase um die Datenbank zu ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X