Temos um aplicativo da Web (desenvolvido por terceiros) que roda no Tomcat. Temos um desempenho muito ruim com o aplicativo. O desenvolvedor de aplicativos está afirmando que é uma prática recomendada do setor reiniciar servidores da Web todas as noites, liberar todo o uso de memória e começar de novo.
Da perspectiva do cliente que alivia o problema do site travar durante o dia, mas da perspectiva do SysAdmin, é uma solução terrível.
Hospedamos 20 desses aplicativos em servidores diferentes para clientes diferentes, e a coordenação de garantir que todos sejam reiniciados todas as noites parece errada.
Respostas:
Essa certamente não é uma prática recomendada. Embora seja bom reiniciar os servidores periodicamente, apenas para garantir que tudo ocorra corretamente, a necessidade de reiniciar todas as noites aponta para um vazamento de memória muito sério no aplicativo.
fonte
Há uma diferença entre "Boas práticas", coisas que muitas pessoas fazem por boas razões, e "Práticas comuns", coisas que muitas pessoas fazem porque são preguiçosas e / ou ignorantes.
Aplicativos e servidores (piores) que precisam ser rotineiramente reiniciados ou reiniciados para continuar funcionando bem são bastante comuns. Mas também é uma indicação clara de que você tem um erro crítico.
Ao fazer com que o SOP reinicie um aplicativo regularmente, sua empresa está escondendo um bug sério debaixo do tapete. Isso é indesculpável, o bug precisa ser enfrentado e esmagado ou voltará a mordê-lo mais tarde.
Idealmente, sua empresa deve encontrar um desenvolvedor melhor. Infelizmente, isso pode levar a muito trabalho para reescrever grandes extensões de seu código. O fato de o desenvolvedor achar que um código mal escrito é aceitável ou não sabe o suficiente para reconhecer os sintomas do código de buggy sugere que a qualidade do código é baixa. Um bom desenvolvedor será constitucionalmente incapaz de deixá-lo nesse estado.
Como você pode não estar em condições de substituir o desenvolvedor, algumas sugestões:
Mesmo sem entrar em ferramentas de criação de perfil orientadas ao desenvolvedor, há muitas ferramentas orientadas a sysadmin para criação de perfil e monitoramento do uso de memória em aplicativos Java. Você deve realmente configurar o monitoramento da memória (principalmente heap) em seus servidores de produção em qualquer caso. Eu recomendo isso mesmo se você estiver executando um código de qualidade. Pode ser avisado com antecedência quando seus aplicativos de buggy estão prestes a tombar.
Porém, melhor ainda, isso deve ajudá-lo a reunir provas de que há um vazamento e pode até indicar onde o problema está no aplicativo. Isso lhe dará uma melhor munição para fazer lobby para que seja consertada.
fonte
É mais provável que o desenvolvedor de aplicativos afirme que é do seu interesse que você cubra a bunda trabalhando no trabalho não profissional que ele fez. Ele pode ter deixado de admitir que escreveu algo com um vazamento de memória enorme, mas não muito longe disso.
fonte
Muitas respostas aqui parecem cair muito longe da marca de soluções práticas. Eles parecem evitar dogmas - os servidores nunca devem ser reiniciados - por que temos cinco noves? tolerância ao erro? Bem, é assim que, quando deveriam estar acordados, ficam acordados.
Além disso, declarar a causa de maus desenvolvedores ou práticas inadequadas de desenvolvimento não está na raiz do problema. Pode ser, mas na maioria das vezes, não é um código de aplicativo ruim. Esses problemas já estão embutidos em grande parte do código do sistema. Pequenos vazamentos de memória, problemas de heap e permgen em Java, se você estiver executando muitos aplicativos pequenos como nós. Servidores modernos e o software que eles executam são muito complexos. Quando você pensa no que um servidor como o tomcat deve fazer - atenda a arquivos, processe solicitações da web, comunicações de rede, comunicações de banco de dados, etc., está fazendo muito. Nessa pilha há um monte de partes móveis.
A reinicialização proativa dos servidores, digamos que uma vez por semana ou mês, seja inteligente e eficiente, na minha opinião. Se você estiver em cluster e rotacionar os servidores, não deverá afetar nem um pouco os clientes. Os clientes ficarão muito mais felizes com o desempenho de seus servidores.
fonte
Os servidores IMO devem ser desligados o mínimo possível. É mais provável que o desenvolvedor de aplicativos tenha construído um aplicativo de má qualidade com um vazamento de memória.
fonte
Eu tenho um script para reiniciar um de nossos servidores da Web todas as noites, mas isso é mais por causa de um aplicativo java mal gravado do que por um padrão da indústria. Eu diria que não é incomum reiniciar os serviços da web. Isso pode fazer a limpeza de memória que você está procurando e colocar menos pressão no servidor, em comparação com uma reinicialização completa.
fonte
Um servidor preferencialmente nunca deve ser reiniciado. Essa é uma das razões pelas quais temos tolerância a falhas . Se você precisar reiniciar o servidor por causa de seus aplicativos, eles estão vazando memória e são mal construídos.
Eu já trabalhei com o Tomcat antes e tive o mesmo problema. Da próxima vez que estiver trabalhando com um contêiner Java, procurarei outro, talvez o JBoss ou o GlassFish.
Edit: Se você precisar reiniciá-lo todas as noites agora, provavelmente precisará reiniciá-lo com mais frequência se / quando a carga aumentar. Certifique-se de ter aplicativos sólidos, essa é a melhor solução.
fonte
O mais frequente que eu já vi é semanal. Onde estou agora, somos uma vitrine, e fazemos isso mensalmente no fim de semana após a Patch Tuesday.
fonte
Embora eu concorde que não é ideal reiniciar um servidor constantemente, há situações em que não é culpa do desenvolvedor nem da coisa errada a fazer. Temos um aplicativo bem comportado que está vazando memória devido a problemas na biblioteca Python Popen. É um aplicativo antigo que será desativado em breve, mas é crítico para os negócios. Temos que mantê-lo funcionando com um mínimo de barulho para nossos clientes. Decidimos reiniciar o servidor todas as noites.
fonte