Na edição do SQL Server 2012 Standard, eu sei que o número máximo de conexões de usuários é 32.767. O que devo fazer como DBA se estiver indo para esse número?
Atualmente, existem 30.000 conexões de usuários e esse número deve aumentar.
Na edição do SQL Server 2012 Standard, eu sei que o número máximo de conexões de usuários é 32.767. O que devo fazer como DBA se estiver indo para esse número?
Atualmente, existem 30.000 conexões de usuários e esse número deve aumentar.
Respostas:
O número máximo de conexões nas versões e edições do SQL Server é 32.767.
Você pode determinar quantas conexões o SQL Server possui atualmente observando:
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 a proporção entre conexões usadas e não utilizadas da consulta acima for preocupante, é provável que o pool de conexões seja ativado pelos aplicativos clientes conectados ao servidor e essas conexões não estejam sendo usadas com eficiência. Convém que os desenvolvedores modifiquem a cadeia de conexão desses aplicativos para limitar o tamanho do pool de conexões e garantir que eles estejam descartando corretamente as conexões. Se as conexões não estiverem sendo descartadas corretamente, elas permanecerão abertas enquanto o aplicativo cliente estiver em execução.
Se você estiver se sentindo particularmente raivosos, e precisa se livrar de todas as conexões que não realizaram nada recentemente (independentemente de se eles são realmente atualmente realizando o trabalho), você pode executar o seguinte código, que irá gerar uma lista de sessões que pode ser morto. Você precisaria copiar e colar os comandos gerados em uma nova janela do SSMS para realmente executar os comandos. Eu também recomendo ter seu currículo up-to-date apenas no caso .
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;
É possível dimensionar linearmente o número de conexões além de 32.767, dividindo os dados em vários nós do SQL Server. No entanto, na minha opinião, usar o sharding como uma maneira de contornar o limite no número de conexões é semelhante a usar uma bomba atômica para matar uma aranha. Ele vai matar a aranha, mas você só pode ter problemas maiores no final do dia. Sem mencionar que é muito difícil construir uma bomba atômica, sem mencionar o sharding de implementação corretamente.
is_user_process
qualificador e certamente não faria mal excluir sessões que tenham last_request_start_time
algo recente. Quão recente? Outra boa pergunta.
Eu tive um comportamento estranho com o pool de conexões no passado e seu cenário se alinha bem a uma dessas situações. Se seu aplicativo estiver usando o pool de conexões (e isso ainda é especulação, até o momento em que você confirmar ou negar isso), você terá muitas conexões que permanecerão abertas. Isso ocorre por design.
O pool de conexões visa reduzir a sobrecarga da criação de uma conexão com o banco de dados. Vamos considerar, por exemplo, um conjunto de conexões de 3. Até onde eu sei, o ciclo de vida é algo assim (a partir de um cache de conjunto de conexões frio):
sp_reset_connection
no encadeamento 1Essa é uma simplificação excessiva, mas os pontos mais importantes incluem:
sp_reset_connection
é chamado.Aqui está o material de referência que eu costumava chegar a essas conclusões.