Numero massimo di connessioni utente


24

In SQL Server 2012 Standard Edition, so che il numero massimo di connessioni utente è 32.767. Cosa devo fare come DBA se mi sto dirigendo verso questo numero?

Attualmente ci sono 30.000 connessioni utente e questo numero dovrebbe aumentare.

inserisci qui la descrizione dell'immagine


5
Se provengono da un'app, l'app dovrebbe chiudere la connessione una volta terminata. Lasciare una connessione aperta è una possibile ragione per colpire questo limite
Mark Sinkinson

Risposte:


31

Il numero massimo di connessioni tra versioni ed edizioni di SQL Server è 32.767.

È possibile determinare quante connessioni SQL Server attualmente ha guardando:

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;

Se si tratta del rapporto tra connessioni utilizzate e non utilizzate dalla query precedente, è probabile che il pool di connessioni sia abilitato dalle applicazioni client connesse al server e che tali connessioni non vengano utilizzate in modo efficiente. È possibile che gli sviluppatori modifichino la stringa di connessione per queste applicazioni per limitare le dimensioni del pool di connessioni e assicurarsi che dispongano correttamente delle connessioni. Se le connessioni non vengono disposte correttamente, rimarranno aperte fino a quando l'applicazione client è in esecuzione.

Se vi sentite particolarmente rabbioso, e la necessità di sbarazzarsi di tutti i collegamenti che non hanno eseguito niente di recente (a prescindere se essi sono in realtà attualmente eseguendo il lavoro), è possibile eseguire il seguente codice, che genererà un elenco di sessioni può essere ucciso. Dovresti copiare e incollare i comandi generati in una nuova finestra SSMS per eseguire effettivamente i comandi. Consiglierei anche di avere il tuo curriculum aggiornato per ogni evenienza .

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;

È possibile ridimensionare linearmente il numero di connessioni oltre 32.767 suddividendo i dati tra più nodi di SQL Server. Tuttavia, secondo me, usare lo sharding come un modo per aggirare il limite sul numero di connessioni è simile all'uso di una bomba atomica per uccidere un ragno. Esso sarà uccidere il ragno, ma basta potrebbe avere problemi più grandi, alla fine della giornata. Per non parlare del fatto che è davvero difficile costruire una bomba atomica, per non parlare dell'attrezzatura che si frammenta correttamente.


1
Puoi spiegare perché dovremmo identificare le sessioni "killable" usando most_recent_sql_handle nelle connessioni sys.dm_exec_ piuttosto che usando, diciamo, status e last_request_start_time e is_user_process nelle sessioni sys.dm_exec_ ? Sembra una scelta strana.
Mike Sherrill "Cat Recall",

Questo è un buon punto, @Mike - All'epoca pensavo esclusivamente alle connessioni che sono state aperte dal pool di connessioni e che non sono mai state utilizzate. Sarebbe una buona idea aggiungere il is_user_processqualificatore e certamente non farebbe male escludere sessioni che hanno un risultato un last_request_start_timepo 'recente. Quanto è recente? Un'altra buona domanda.
Max Vernon,

Il last_request_start_time dovrebbe probabilmente essere più vecchio piuttosto che più recente. Penso che una sessione utente "killable" in sicurezza sia quella che dorme e non ha una richiesta da un paio di giorni. Immagino che il tempo di interruzione dipenda dalla capacità dei nostri programmatori di applicazioni di ripulire da soli.
Mike Sherrill "Cat Recall",

12

Ho incontrato comportamenti strani con il pool di connessioni in passato e il tuo scenario si allinea bene con una di quelle situazioni. Se l'applicazione utilizza il pool di connessioni (e questa è ancora una speculazione, a questo punto, fino a quando non lo confermi o lo neghi), avrai molte connessioni che rimangono aperte. Questo è di progettazione.

Il pool di connessioni mira a ridurre il sovraccarico della creazione di una connessione al database. Prendiamo, ad esempio, un pool di connessioni di 3. Per quanto ne so, il ciclo di vita va in questo modo (a partire da una cache del pool di connessioni cold):

  1. L'utente dell'applicazione A richiede una connessione al database
  2. Il pool di connessioni avvia il thread di connessione 1 nel database
  3. L'utente dell'applicazione B richiede una connessione al database
  4. Il pool di connessioni avvia il thread di connessione 2 nel database
  5. L'utente dell'applicazione A chiude la connessione ... al pool di connessioni
  6. L'utente dell'applicazione C richiede una connessione al database
  7. Problemi del pool di connessioni sp_reset_connectionsul thread 1
  8. Il pool di connessioni assegna il thread 1 all'utente dell'applicazione C

Questa è una semplificazione eccessiva, ma i punti salienti includono:

  • La connessione rimarrà aperta tra il pool di thread del pool di connessioni e il database fino a quando il database o il pool di connessioni non chiuderà forzatamente la connessione
  • La connessione rimane aperta con il contesto di esecuzione dell'ultima sessione fino a quando quel thread non viene riutilizzato da un altro utente, a quel punto sp_reset_connectionviene chiamato.

Ecco il materiale di riferimento che ho usato per giungere a queste conclusioni.

Pool di connessioni per DBA di SQL Server

Il caso della transazione orfana

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.