En SQL Server 2012 Standard edition, sé que el número máximo de conexiones de usuario es 32,767. ¿Qué debo hacer como DBA si me dirijo a este número?
Actualmente hay 30,000 conexiones de usuarios, y se espera que este número aumente.
En SQL Server 2012 Standard edition, sé que el número máximo de conexiones de usuario es 32,767. ¿Qué debo hacer como DBA si me dirijo a este número?
Actualmente hay 30,000 conexiones de usuarios, y se espera que este número aumente.
Respuestas:
El número máximo de conexiones en las versiones y ediciones de SQL Server es 32,767.
Puede determinar cuántas conexiones tiene actualmente SQL Server mirando:
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;
Si la relación entre las conexiones usadas y no usadas de la consulta anterior es preocupante, es probable que las aplicaciones cliente conectadas al servidor habiliten la agrupación de conexiones, y esas conexiones no se usan de manera eficiente. Es posible que desee que los desarrolladores modifiquen la cadena de conexión para estas aplicaciones para limitar el tamaño del grupo de conexiones y asegurarse de que están eliminando las conexiones correctamente. Si las conexiones no se eliminan correctamente, permanecerán abiertas mientras se ejecute la aplicación cliente.
Si se siente particularmente rabioso y necesita deshacerse de todas las conexiones que no han realizado nada recientemente (independientemente de si actualmente están realizando un trabajo), puede ejecutar el siguiente código, que generará una lista de sesiones que puede ser asesinado Debería copiar y pegar los comandos generados en una nueva ventana SSMS para ejecutar los comandos. También recomiendo tener su currículum actualizado por si acaso .
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 posible escalar linealmente el número de conexiones más allá de 32,767 al dividir los datos en múltiples nodos de SQL Server. Sin embargo, en mi opinión, usar fragmentos como una forma de superar el límite en el número de conexiones es similar a usar una bomba atómica para matar una araña. Se va a matar a la araña, pero sólo podría tener problemas mayores al final del día. Sin mencionar que es bastante difícil construir una bomba atómica, sin mencionar implementar el fragmentación correctamente.
is_user_process
calificador, y ciertamente no estaría de más excluir las sesiones que tienen algo last_request_start_time
que es algo reciente. ¿Qué tan reciente? Otra buena pregunta.
Me he encontrado con un comportamiento extraño con la agrupación de conexiones en el pasado, y su escenario se alinea bien con una de esas situaciones. Si su aplicación está usando la agrupación de conexiones (y eso sigue siendo una especulación, en este punto, hasta que confirme o niegue eso), entonces tendrá muchas conexiones que permanecerán abiertas. Esto es por diseño.
La agrupación de conexiones tiene como objetivo reducir la sobrecarga de crear una conexión de base de datos. Tomemos, por ejemplo, un grupo de conexiones de 3. Por lo que puedo decir, el ciclo de vida es algo como esto (comenzando desde un caché de grupo de conexiones en frío):
sp_reset_connection
en el subproceso 1Esto es una simplificación excesiva, pero los puntos más destacados incluyen:
sp_reset_connection
se llama.Aquí está el material de referencia que solía llegar a estas conclusiones.