Como monitorar as conexões do DataServer SQL Server?

Escrito por Marcos Kirchner em 1 de junho de 2009, 14:54h

Em um post anterior verificamos que o DataServer SQL pode criar várias conexões para cada banco de dados utilizado pela aplicação. O número exato varia conforme os parâmetros do DataServer e a complexidade dos programas.

Criar e destruir conexões de banco de dados repetidamente é um processo lento, que gera um grande impacto no desempenho geral da aplicação. Por este motivo, o DataServer SQL utiliza um pool de conexões e mantém algumas conexões sempre abertas. Quando algum programa precisa realizar um acesso a dados através de uma nova conexão, o DataServer localiza uma conexão livre no pool e a utiliza. Se não houverem conexões livres no pool, uma nova conexão será aberta e utilizada.

O DataServer sempre criará uma conexão principal (identificada na documentação e nos logs como Master Connection) e zero ou mais conexões secundárias (identificadas como Firehose Connection). A conexão principal é utilizada para todas as transações que modificam dados (INSERT, UPDATE, DELETE) e para acessos via cursores. As conexões secundárias são utilizadas somente para leitura de dados utilizando default result sets, pois este modo de leitura bloqueia a conexão até a leitura dos dados ser concluída. O número padrão de conexões secundárias criadas pelo DataServer para cada banco de dados é 5. Este número pode representar conexões demais ou de menos, dependendo da aplicação.

Ao final da execução da aplicação, o DataServer grava no arquivo de log dataserv.lg informações sobre quantas conexões secundárias foram utilizadas:

Firehose cursor secondary connection:
Needed Connections: 7, (Needed 2 more than requested)
Peak Connections: 8, (Peaked at 3 more than requested)

O valor Needed Connections é o número de conexões que o DataServer acredita ser o ideal para a aplicação, com base na análise dos programas executados.

O valor Peak Connections é o número máximo de conexões utilizadas durante a sessão. Este valor poderá ser maior que o valor Needed Connections se houver uma demanda extra de conexões em um ponto isolado da aplicação.

Para evitar que o DataServer abra e feche muitas conexões durante a execução da aplicação, deve-se configurar o número inicial de conexões secundárias (o padrão é 5) para o valor mais próximo possível do número Needed Connections. Veremos como ajustar o número inicial de conexões no próximo post.

É possível identificar qual conexão foi utilizada para enviar cada comando ao banco de dados através do arquivo dataserv.lg. Para que os comandos sejam registrados neste log, é necessário ativar a opção SQL do qt_debug. Para ativar a opção, é necessário adicionar -Dsrv qt_debug,SQL no arquivo de parâmetros ou no atalho de conexão:

-db pedidos -RO
-db sql2k8 -ld blog -dt MSS -U teste -P teste
-Dsrv qt_debug,SQL

Em um post futuro abordaremos as várias opções do qt_debug com mais detalhes.

Apesar da possibilidade de monitorar as conexões através do log dataserv.lg, esta análise precisa ser realizada para cada log (normalmente cada estação tem seu próprio dataserv.lg) e dificilmente pode-se analisar enquanto os processos estão em execução (os valores de Needed e Peak Connections são gravados apenas ao final da sessão). Uma forma mais interessante é analisar os dados coletados no próprio SQL Server.

Para monitorar em tempo real a abertura e fechamento de conexões, bem como os comandos enviados ao servidor por cada aplicação pode-se usar o Profiler (ou as APIs do SQL Trace). Esta ferramenta permite capturar muito mais detalhes do que é possível com o dataserv.lg (por exemplo, os locks adquiridos ou os planos de execução das consultas), e também permite realizar filtros por usuário, por banco de dados, por objeto acessado, por tempo de duração de cada comando, etc.

O SQL Server também disponibiliza várias Dynamic Management Views (DMVs) que podem ser consultadas para obter informações sobre as conexões e os processos em execução. As principais DMVs para monitorar conexões são sys.dm_exec_connections e sys.dm_exec_sessions. Com estas DMVs é possível verificar a data/hora que a conexão foi criada, o protocolo de rede utilizado, forma de autenticação, o IP e nome da estação que criou a conexão, a API de conexão (sempre será ODBC para o DataServer), a data/hora da última requisição utilizando esta conexão, nome do usuário e mais uma variedade de detalhes. Abaixo um exemplo utilizando a DMV sys.dm_exec_sessions para gerar uma lista do número de conexões para cada usuário, filtrando apenas conexões geradas pela API ODBC e aplicação com nome 'Datasul EMS 2.06B'. Note que para filtrar na coluna program_name é necessário informar um nome de aplicação no momento da conexão.

SELECT login_name, COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND client_interface_name = 'ODBC'
    AND program_name = 'Datasul EMS 2.06B'
GROUP BY login_name

Outras DMVs úteis são a sys.dm_exec_requests, para monitorar as requisições ativas, e sys.dm_exec_query_memory_grants, para verificar quais requisições estão consumindo uma grande quantidade de memória. Informações sobre estas e dezenas de outras DMVs estão disponíveis na documentação do SQL Server.

Categorias: DataServer | SQL Server

Tags:

Comentários (4) -

em 8 de junho de 2009, 21:59h

Marcos, Boa Noite!

   Estou enviando registros do sql server 2005 para o progress 10.1a através de um Stored Procedure utilizando linked Server e a funçao OpenQuery, mas a performance esta muito alem do desejado.
   Sendo assim, gostaria de saber se voce tem uma ideia de como melhorar um pouco essa performance, pois um registro esta levando aproximadamente 15 minutos.

   Desde já agradeço pela sua atençao

Anderson souza

em 9 de junho de 2009, 09:43h

Anderson,

Você já tentou executar a mesma query diretamente no banco Progress, via ODBC ou JDBC, sem passar pelo Linked Server? Talvez a própria query esteja demorando para gerar o resultado.

Nós já notamos problemas de lentidão em alguns casos, mas não de forma tão acentuada quanto a que você reporta. Em casos de atualização já tivemos problemas. Não temos um posicionamento oficial, mas a suspeita é incompatibilidade do driver ODBC do Progress com o OLEDB, utilizado pelo Linked Server.

Marcos

kirchner

em 29 de julho de 2010, 15:27h

Marcos,

Uma consulta digamos mal elaborada ao banco Progress feita em Microsoft Excel utilizando ODBC pode impactar na performance do banco como um todo a ponto de deixar o próprio produto Datasul EMS lento?

Ari

em 29 de julho de 2010, 17:36h

Ari,

Não é regra geral, mas é possível sim. As ramificações são várias, mas em linhas gerais:

- processamento (CPU): dependendo da query enviada ao banco e do plano de execução utilizado, esta query pode consumir muito tempo de CPU. Não é anormal ver o processo _sqlsrv2.exe usando 100% de 1 processador. Até onde conheço o Progress não processa a mesma query em paralelo, então no máximo 1 processador/núcleo será ocupado; se o servidor tiver vários, o impacto não é tão grande.

- memória: o processo _sqlsrv2.exe consome memória durante a execução, e há alocação dinâmica de memória. Isso quer dizer que ele pode usar muita memória do servidor e causar problemas para outros processos.

- tempo de disco: é muito fácil fazer uma query que faz vários acessos a tabelas. Se a query faz acessos em tabelas grandes, o uso de disco é muito intenso.

- rede: de acordo com os dados retornados. Normalmente não é o problema, pois os dados são processador no servidor e só trafegam na rede os dados do resultado.

- buffer pool: leituras de tabelas grandes fazem com que os dados do buffer pool sejam descartados para dar lugar a outros blocos. Isso pode ter um impacto grande no desempenho dos outros programas.

- sincronização interna (semáforos/latches): fazem com que outro processo tenha que esperar por qualquer motivo. A espera normalmente é pequena, mas se ocorre frequentemente acaba somando ao tempo total.


O fato de esta query consumir recursos ou fazer os outros processos trabalharem mais ou esperarem mais acaba causando a impressão de lentidão.

kirchner

Comentar




biuquote
  • Comentário
  • Pré-visualização
Loading


Acesso LogMeIn

Informe o código PIN: