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.
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.
Risposte:
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.
is_user_process
qualificatore e certamente non farebbe male escludere sessioni che hanno un risultato un last_request_start_time
po 'recente. Quanto è recente? Un'altra buona domanda.
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):
sp_reset_connection
sul thread 1Questa è una semplificazione eccessiva, ma i punti salienti includono:
sp_reset_connection
viene chiamato.Ecco il materiale di riferimento che ho usato per giungere a queste conclusioni.