É uma prática recomendada do setor reiniciar servidores da web periodicamente? [fechadas]

28

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.

Geo
fonte
41
Diga a eles que é uma boa prática do setor para os desenvolvedores de aplicativos encontrar e corrigir seus vazamentos de memória.
Bart Silverstrim
4
@Bart Oh snap !!
Mfni #
1
+1 apenas para fazer o meu dia (PS: eu também sou desenvolvedor)
RN.
1
Ele disse servidores ou serviços? Temos um aplicativo tomcat que precisa que o serviço seja reiniciado todas as noites. Se não o fizer, em algum momento no futuro ele falhará. Prefiro não fazê-lo, mas o serviço durante o dia é mais importante.
Tubs
1
Obtenha algum monitoramento de arquivo de log e faça o download de algumas ferramentas de monitoramento da JVM. Se algo estiver falhando durante o dia, você verá exceções ou algo sendo registrado - mesmo que sejam exceções padrão. Isso lhe dará algumas dicas sobre a natureza geral do erro. Além disso, observe o uso da memória da JVM. As probabilidades são realmente boas: eles têm um vazamento de memória e você o capturará se observar o heap da JVM do servidor. Lute contra o mau desenvolvimento com bons dados do administrador de sistemas. Destrói a defesa "Você simplesmente não sabe o que está fazendo" e faz com que eles realmente respondam por que as coisas estragaram.
FloppyDisk 31/10/12

Respostas:

29

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.

EEAA
fonte
1
Este é um ponto muito bom. Se você nunca reiniciar seus servidores, conforme sugerido abaixo, talvez não saiba que possui certos serviços que não iniciam corretamente. Em seguida, no caso de uma falha de energia / reinicialização forçada, o servidor pode não voltar à direita.
einstiien
1
+1. Mensalmente pode fazer mais sentido - não apenas para uma reinicialização, mas para um procedimento normal de operação para aplicar patches, etc. Eu já fazia parte de uma equipe administrativa para cerca de 1500 servidores, 24 horas por dia, 7 dias por semana, e todos os meses havia três noites "rolando" reiniciar "agendado, momento em que todos os patches etc. seriam colocados nos servidores também. Isso fornece alguma estabilidade de planejamento e um procedimento operacional padrão.
TomTom
12

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:

  • Veja se um desenvolvedor melhor pode revisar o código e relatar sua avaliação a alguém que possa fazer algo a respeito,
  • Dê uma olhada nas ferramentas de criação de perfil. Se você possui as habilidades e / ou inclinação, tente criar o perfil do código para encontrar o vazamento e denunciá-lo.

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.

Kief
fonte
2
Na verdade, muitas vezes é a infraestrutura que possui o bug, e não o código do desenvolvedor. Não tivemos problemas com os aplicativos J2EE que entram no inferno da coleta de lixo periodicamente no JBoss, mas funcionam bem em outros servidores de aplicativos de comércio eletrônico. Portanto, pode não ser culpa do desenvolvedor, mas sim do ambiente de implantação.
rmalayter
6

É 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.

Maximus Minimus
fonte
3

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.

Claude
fonte
2

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.

matpie
fonte
Absolutamente - acho que o OP precisa dizer a alguém que precisa encontrar um desenvolvedor melhor.
Helvick 03/03
2
Há uma razão pela qual as grandes empresas pagam muito dinheiro por vários períodos de atividade inativos e por que as empresas gastam milhares em fontes de alimentação redundantes, RAID, gaiolas hot swap etc. etc.
Bart Silverstrim
1

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.

einstiien
fonte
1

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.

Jonas
fonte
4
Acho que não concordo quando você diz que um servidor nunca deve ser reiniciado. Os servidores devem ser reiniciados para aplicar correções de segurança. Eles nunca precisam ser reiniciados para outras coisas além da manutenção planejada.
Zoredache
É verdade que alguns servidores precisam ser reiniciados para aplicar correções de segurança. Mas se você tiver um sistema bom o suficiente, não precisará reiniciar o sistema. Existem sistemas que estão sendo executados ano após ano. Você deve procurar alta disponibilidade se estiver servindo um serviço na Internet. Se você tiver um sistema tolerante a falhas como um cluster, poderá derrubar os nós um por um e atualizá-los quando o serviço ainda estiver em execução.
Jonas
1
Se você possui apenas um único servidor e / ou hardware, não existe alta disponibilidade. Você está fazendo errado se você deu apenas um servidor e seu serviço é tão crítico que ele não pode tolerar 15 minutos de tempo de inatividade de vez em quando para reiniciar o servidor. Se você tiver um aplicativo "zero tempo de inatividade", terá um verdadeiro sistema de alta disponibilidade com vários nós. Nesse caso, reiniciar periodicamente para patches, etc, é bastante fácil, como você apontou.
EEAA
1
"Da próxima vez ... procurarei outro [contêiner Java que não seja o Tomcat]". Eu não culpo o Tomcat. Eu venho executando serviços de produção há anos e, toda vez que tenho esse problema, é um problema de aplicativo. "Certifique-se de ter aplicativos sólidos, essa é a melhor solução" exatamente. Curiosamente, todos os outros servidores de aplicativos Java que usei até agora sofrem problemas semelhantes quando executo código com vazamento. Dito isto, o Tomcat 7 deve ter algum tipo de detecção proativa de vazamento de memória.
Kief
0

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.

Joel Coel
fonte
Quando comecei a trabalhar em um local, descobri que havia reinicializações noturnas no local ... Isso foi horrível, principalmente porque o servidor tinha cerca de 1-2% de chance de não voltar à posição correta (erro de tempo no driver do disco rígido) ) Demorou algum tempo para corrigir as "causas" das reinicializações. Tempo bem gasto.
precisa
0

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.

Nick Mellor
fonte