Número máximo de conexões do usuário

24

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.

insira a descrição da imagem aqui

sebeid
fonte
5
Se estes são de um aplicativo, o aplicativo deve fechar a conexão assim que terminar. Deixando um aberto conexão é uma possível razão para bater este limite
Mark Sinkinson

Respostas:

31

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.

Max Vernon
fonte
11
Você pode explicar por que devemos identificar sessões " executáveis " usando most_recent_sql_handle nas conexões sys.dm_exec_ em vez de usar, digamos, status e last_request_start_time e is_user_process nas sessões sys.dm_exec_ ? Parece uma escolha estranha.
Mike Sherrill 'Cat Recall'
Esse é um bom ponto, @Mike - Na época, eu pensava apenas nas conexões que foram abertas pelo pool de conexões e que nunca foram usadas. Seria uma boa ideia adicionar o is_user_processqualificador e certamente não faria mal excluir sessões que tenham last_request_start_timealgo recente. Quão recente? Outra boa pergunta.
Max Vernon #
O last_request_start_time provavelmente deve ser mais antigo do que mais novo. Eu acho que uma sessão de usuário "matável" com segurança seria aquela que está dormindo e não recebe uma solicitação há alguns dias. Eu acho que o tempo de corte depende de quão bons são os programadores de aplicativos para se limparem.
Mike Sherrill 'Cat Recall'
12

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):

  1. O usuário do aplicativo A solicita uma conexão com o banco de dados
  2. O conjunto de conexões inicia o encadeamento de conexão 1 no banco de dados
  3. O usuário do aplicativo B solicita uma conexão com o banco de dados
  4. O conjunto de conexões inicia o encadeamento de conexão 2 no banco de dados
  5. O usuário do aplicativo A fecha a conexão ... ao pool de conexões
  6. O usuário do aplicativo C solicita uma conexão com o banco de dados
  7. Problemas do pool de conexão sp_reset_connectionno encadeamento 1
  8. O conjunto de conexões atribui o encadeamento 1 ao usuário do aplicativo C

Essa é uma simplificação excessiva, mas os pontos mais importantes incluem:

  • A conexão permanecerá aberta entre o conjunto de encadeamentos do conjunto de conexões e o banco de dados até que o banco de dados ou o conjunto de conexões feche a conexão à força
  • A conexão permanece aberta com o contexto de execução das últimas sessões até que esse encadeamento seja reutilizado por outro usuário, momento em que sp_reset_connectioné chamado.

Aqui está o material de referência que eu costumava chegar a essas conclusões.

Pool de conexão para DBA do SQL Server

O caso de transação órfã

swasheck
fonte