Maximale Anzahl von Benutzerverbindungen


24

In der SQL Server 2012 Standard Edition weiß ich, dass die maximale Anzahl von Benutzerverbindungen 32.767 beträgt. Was soll ich als DBA tun, wenn ich auf diese Nummer zusteuere?

Derzeit gibt es 30.000 Benutzerverbindungen, und diese Zahl wird voraussichtlich zunehmen.

Bildbeschreibung hier eingeben


5
Wenn diese von einer App stammen, sollte die App ihre Verbindung schließen, sobald sie fertig ist. Eine Verbindung offen zu lassen ist ein möglicher Grund, dieses Limit zu überschreiten
Mark Sinkinson,

Antworten:


31

Die maximale Anzahl von Verbindungen zwischen SQL Server-Versionen und -Editionen beträgt 32.767.

Sie können feststellen, über wie viele Verbindungen SQL Server derzeit verfügt:

SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END
    , CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
    INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END;

Wenn das Verhältnis zwischen verwendeten und nicht verwendeten Verbindungen aus der obigen Abfrage betroffen ist, wird das Verbindungspooling wahrscheinlich von Clientanwendungen aktiviert, die mit dem Server verbunden sind, und diese Verbindungen werden nicht effizient genutzt. Möglicherweise möchten Sie, dass Entwickler die Verbindungszeichenfolge für diese Anwendungen ändern, um die Größe des Verbindungspools zu begrenzen und sicherzustellen, dass die Verbindungen ordnungsgemäß verteilt werden. Wenn Verbindungen nicht ordnungsgemäß hergestellt werden, bleiben sie geöffnet, solange die Clientanwendung ausgeführt wird.

Wenn Sie sich besonders tollwütig fühlen und alle Verbindungen entfernen müssen, die in letzter Zeit noch nichts ausgeführt haben (unabhängig davon, ob sie tatsächlich gerade arbeiten), können Sie den folgenden Code ausführen, der eine Liste der Sitzungen generiert, die dies bewirken kann getötet werden. Sie müssen die generierten Befehle kopieren und in ein neues SSMS-Fenster einfügen, um die Befehle tatsächlich auszuführen. Ich würde auch empfehlen, Ihren Lebenslauf für alle Fälle auf dem neuesten Stand zu halten .

DECLARE @cmd NVARCHAR(MAX);
SET @cmd = '';
SELECT @cmd = @cmd + 
    CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END 
    + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';'
FROM sys.dm_exec_connections dec
WHERE dec.most_recent_sql_handle = 0x0;

PRINT @cmd;

Es ist möglich, die Anzahl der Verbindungen über 32.767 hinaus linear zu skalieren, indem die Daten über mehrere SQL Server-Knoten verteilt werden. Meiner Meinung nach ähnelt die Verwendung von Splittern jedoch der Verwendung einer Atombombe, um eine Spinne zu töten. Es wird die Spinne töten, aber Sie könnten am Ende des Tages größere Probleme haben. Ganz zu schweigen davon, dass es verdammt schwer ist, eine Atombombe zu bauen, ganz zu schweigen davon, dass das Scherben von Arbeitsgeräten richtig ist.


1
Können Sie erklären, warum "tötbare" Sitzungen mithilfe von most_recent_sql_handle in sys.dm_exec_- Verbindungen identifiziert werden sollten, anstatt beispielsweise status und last_request_start_time und is_user_process in sys.dm_exec_- Sitzungen zu verwenden ? Es scheint eine seltsame Wahl.
Mike Sherrill 'Cat Recall'

Das ist ein guter Punkt, @Mike - Zu der Zeit habe ich nur über Verbindungen nachgedacht, die durch Verbindungspooling geöffnet wurden und die noch nie verwendet wurden. Es wäre eine gute Idee, das is_user_processQualifikationsmerkmal zu ergänzen , und es würde sicherlich nicht schaden, Sitzungen mit einem last_request_start_timeetwas neueren Wert auszuschließen . Wie aktuell? Noch eine gute Frage.
Max Vernon

Die last_request_start_time sollte wahrscheinlich älter als neu sein. Ich denke, eine sicher "tötbare" Benutzersitzung ist eine, die schläft und seit ein paar Tagen keine Anfrage mehr hat. Ich denke, die Abschaltzeit hängt davon ab, wie gut unsere Anwendungsprogrammierer darin sind, nach sich selbst aufzuräumen.
Mike Sherrill 'Cat Recall'

12

Ich habe in der Vergangenheit seltsames Verhalten beim Verbindungspooling festgestellt, und Ihr Szenario passt gut zu einer dieser Situationen. Wenn in Ihrer Anwendung das Verbindungspooling verwendet wird (und das ist noch Spekulation, bis Sie dies bestätigen oder ablehnen), bleiben viele Verbindungen offen. Dies ist beabsichtigt.

Das Verbindungspooling zielt darauf ab, den Aufwand für das Erstellen einer Datenbankverbindung zu verringern. Nehmen wir zum Beispiel einen Verbindungspool von 3. Soweit ich weiß, läuft der Lebenszyklus ungefähr so ​​ab (ausgehend von einem Cache für kalte Verbindungspools):

  1. Anwendungsbenutzer A fordert eine Verbindung zur Datenbank an
  2. Der Verbindungspool startet den Verbindungsthread 1 zur Datenbank
  3. Anwendungsbenutzer B fordert eine Verbindung zur Datenbank an
  4. Der Verbindungspool startet den Verbindungsthread 2 zur Datenbank
  5. Anwendungsbenutzer A schließt seine Verbindung ... zum Verbindungspool
  6. Anwendungsbenutzer C fordert eine Verbindung zur Datenbank an
  7. Verbindungspoolprobleme sp_reset_connectionauf Thread 1
  8. Der Verbindungspool weist dem Anwendungsbenutzer C Thread 1 zu

Dies ist eine Vereinfachung, aber die wichtigsten Punkte sind:

  • Die Verbindung bleibt zwischen dem Verbindungspool-Threadpool und der Datenbank geöffnet, bis die Datenbank oder der Verbindungspool die Verbindung zwangsweise schließt
  • Die Verbindung bleibt im Ausführungskontext der letzten Sitzung geöffnet, bis dieser Thread von einem anderen Benutzer erneut verwendet und zu diesem Zeitpunkt sp_reset_connectionaufgerufen wird.

Hier ist das Referenzmaterial, aus dem ich diese Schlussfolgerungen gezogen habe.

Verbindungspooling für SQL Server DBA

Der Fall einer verwaisten Transaktion

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.