Solução de problemas intermitente de degradação do desempenho do servidor

1

Eu tenho resolvido um problema de desempenho intermitente do servidor por muito tempo e estou ficando sem ideias. Estou à procura de sugestões sobre como posso identificar a causa do problema.

Nós (minha equipe e eu) desenvolvemos um aplicativo Windows Forms cliente / servidor usando um banco de dados do SQL Server para um cliente há alguns anos. O cliente recentemente começou a experimentar alguns problemas de desempenho e decidiu atualizar sua infraestrutura. Eles migraram de uma única máquina SBS física para um ambiente virtual com várias VMs. Nós migramos com êxito e aplicativos e bits SQL para o novo ambiente. O cliente então solicitou atualizações de aplicativos para corrigir alguns vazamentos de memória e outros problemas de desempenho / bugs com os quais eles estavam executando há anos. Fizemos as atualizações e o sistema foi bem marcado em nosso ambiente. Em seguida, implantamos em seu novo ambiente de produção e o sistema parecia funcionar bem.

Um ou dois dias após a implantação, recebemos reclamações sobre a suspensão ou o atraso do sistema ao carregar / salvar dados do formulário ou gerar relatórios. Nós nos conectamos com o cliente remotamente e confirmamos o problema. Analisamos o ambiente do cliente e verificamos possíveis vazamentos de memória e outros problemas que podem causar os sintomas. Nós não encontramos nenhum. Percebemos então que o problema de desempenho estava afetando várias máquinas na rede e deveria ser ambiental. O cliente então teve seus técnicos de suporte de hardware para solucionar problemas de configuração de hardware / rede potencial para uma fonte. Eles não encontraram nenhum.

Durante nossas rodadas de solução de problemas com o cliente, encontramos maneiras de corrigir o problema de desempenho quando ele surge (o que parece aleatório). Uma reinicialização do servidor corrige o problema, mas isso não é uma correção aceitável.

Outra forma, e a razão pela qual estou postando isso, é quando o cliente percebe a degradação do desempenho, eles podem abrir a versão "legada" do aplicativo (que ainda está disponível em algumas máquinas clientes) e o desempenho é restaurado . As reinicializações de instâncias do aplicativo cliente existentes não são necessárias.

O sistema funciona bem entre os incidentes e o problema parece ocorrer a cada 2 a 3 dias em média, mas foi executado sem incidentes por até uma semana e também tem vários incidentes em um único dia (uma da manhã e depois uma da tarde).

Pensamos que o problema pode ser um problema do SQL Server. Então, tenho perfilado, salvando rastreios e também monitorando contadores de desempenho de SQL para procurar pistas. Não sou especialista em desempenho de SQL e, portanto, talvez não esteja procurando contadores adequados, mas o SQL Server não parece ser muito difícil. Não há picos persistentes na CPU, Memória, Lotes / Segundo, Transações / Segundo, Compilações / Segundo, Re-Compilações / Segundo e os contadores de paging e cache são geralmente estáticos.

O aplicativo pode ter de 10 a 20 instâncias ativas em execução por vez. O aplicativo não foi originalmente escrito com as práticas de recuperação de dados mais eficientes, mas a carga produzida não é nada que o servidor não possa manipular.

Eu também tenho monitorado os logs de eventos do Windows em busca de erros e avisos que possam esclarecer o problema, mas não vi nada que seja lançado antes ou durante um incidente que aponte para o problema.

Outra observação estranha que descobrimos foi que o aplicativo funciona sem degradação quando executado diretamente no servidor, independentemente do desempenho geral do sistema. Eu executei o aplicativo diretamente no servidor quando outras máquinas estavam enfrentando o problema e não tive lentidão ou atraso.

Desculpe pelo livro. Vou continuar procurando pistas, mas qualquer sugestão seria muito apreciada.

Servidor: Windows Server 2012 R2 (VM com muitos recursos alocados) SQL: padrão do SQL Server 2014 Clientes: Mistos, mas principalmente Windows 7 Professional

    
por Dusty Lau 17.03.2016 / 21:12

2 respostas

1

No que diz respeito ao banco de dados, eu começaria a registrar a atividade em uma tabela, como então . Você precisaria ajustar o procedimento armazenado para ser executado por um período mais longo, para que os dados continuem sendo registrados (SET @numberOfRuns = 10), ou descartar essa verificação completamente.

Existem ferramentas para facilitar a análise do log de desempenho do servidor. Aqui é um deles. Este é o blog dos autores .

Você pode tentar usar um monitor de rede para ver o que está acontecendo em um cliente quando o problema está acontecendo. Também dê uma olhada nos contadores de tráfego NIC no perfmon no servidor. Verifique as sessões de tcp quando o problema está acontecendo com o netstat, talvez. Eu sei pouco sobre networking, então isso pode ser um caso dos cegos liderando os blinds:)

    
por 17.03.2016 / 21:29
0

Você já descobriu isso? Que tipo de string de conexão seu aplicativo usa? Se funcionar bem no servidor, mas não nos clientes, tenha em mente a conexão de rede. ou seja, se sua string de conexão usar datasource = computername, então, no servidor, ela usaria o loop de volta e, nos clientes, usaria a resolução de nomes e um endereço IP. Talvez tente usar o IP na string de conexão em vez de um nome DNS para eliminar a pesquisa de DNS.

    
por 23.05.2017 / 16:18