Dans l'édition standard de SQL Server 2012, je sais que le nombre maximum de connexions utilisateur est de 32 767. Que dois-je faire en tant que DBA si je me dirige vers ce numéro?
Il existe actuellement 30 000 connexions d'utilisateurs et ce nombre devrait augmenter.
Le nombre maximal de connexions pour les versions et éditions de SQL Server est de 32 767.
Vous pouvez déterminer le nombre de connexions que SQL Server possède actuellement en consultant:
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 le rapport entre les connexions utilisées et inutilisées de la requête ci-dessus est préoccupant, il est probable que le regroupement de connexions est activé par les applications clientes connectées au serveur, et ces connexions ne sont pas utilisées efficacement. Vous souhaiterez peut-être demander aux développeurs de modifier la chaîne de connexion pour ces applications afin de limiter la taille du pool de connexions et de s'assurer qu'ils éliminent correctement les connexions. Si les connexions ne sont pas supprimées correctement, elles resteront ouvertes tant que l'application cliente s'exécutera.
Si vous vous sentez particulièrement enragé et que vous devez vous débarrasser de toutes les connexions qui n'ont rien fait récemment (indépendamment du fait qu'elles soient réellement en cours ) travail), vous pouvez exécuter le code suivant, qui générera une liste de sessions pouvant être supprimées. Vous devez copier-coller les commandes générées dans une nouvelle fenêtre SSMS pour exécuter réellement les commandes. Je recommanderais également d'avoir votre CV à jour au cas où .
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;
Il est possible de mettre à l'échelle le nombre de connexions de manière linéaire au-delà de 32 767 en partageant les données sur plusieurs nœuds SQL Server. Cependant, à mon avis, l'utilisation du sharding comme moyen de contourner la limite du nombre de connexions est similaire à l'utilisation d'une bombe atom pour tuer une araignée. Elle va tuer l'araignée, mais vous pourriez avoir de plus gros problèmes à la fin de la journée. mentionner qu'il est très difficile de construire une bombe atom, sans parler de l'implémentation du sharding correctement.
J'ai rencontré un comportement étrange avec la mise en commun de connexions dans le passé, et votre scénario correspond bien à l'une de ces situations. Si votre application utilise le pool de connexions (et c'est toujours de la spéculation, à ce stade, jusqu'à ce que vous le confirmiez ou le niez), vous aurez de nombreuses connexions qui restent ouvertes. C'est par conception.
Le regroupement de connexions vise à réduire la surcharge de création d'une connexion à une base de données. Prenons, par exemple, un pool de connexions de 3. Pour autant que je sache, le cycle de vie va quelque chose comme ça (à partir d'un cache de pool de connexions froid):
sp_reset_connection
sur le fil 1Il s'agit d'une simplification excessive, mais les points saillants comprennent:
sp_reset_connection
est appelé.Voici le matériel de référence que j'ai utilisé pour arriver à ces conclusions.