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