È una buona pratica del settore riavviare periodicamente i server Web? [chiuso]


28

Abbiamo un'applicazione web (sviluppata da una terza parte) che gira su Tomcat. Abbiamo ottenuto prestazioni pessime dall'applicazione. Lo sviluppatore dell'applicazione afferma che è una best practice del settore riavviare i server Web ogni notte, liberare tutto l'utilizzo della memoria e ricominciare da capo.

Dal punto di vista del cliente che allevia il problema del crash del sito durante il giorno, ma dal punto di vista di SysAdmin è una soluzione terribile.

Ospitiamo 20 di queste applicazioni in server diversi per client diversi e il coordinamento per assicurarsi che tutti vengano riavviati ogni notte sembra sbagliato.


41
Dì loro che è la migliore pratica del settore per gli sviluppatori di applicazioni trovare e correggere le perdite di memoria.
Bart Silverstrim,

4
@Bart Oh snap !!
mfinni,

1
+1 solo per aver reso la mia giornata (PS: io stesso sono uno sviluppatore)
RN.

1
Ha detto server o servizi? Abbiamo un'applicazione Tomcat che necessita del riavvio del servizio ogni notte. Se non lo faccio, ad un certo punto in futuro andrà in crash. Preferirei non farlo, ma il servizio durante il giorno è più importante.
Vasche

1
Avvia il monitoraggio dei file di registro e scarica alcuni strumenti di monitoraggio JVM. Se durante il giorno si verificano arresti anomali, dovresti vedere eccezioni o qualcosa che viene registrato, anche se sono eccezioni predefinite. Questo ti darà un'idea della natura generale dell'errore. Inoltre, guarda l'utilizzo della memoria JVM. Le probabilità sono davvero buone, hanno una perdita di memoria e la prenderai se guardi l'heap del server JVM. Combattere il cattivo sviluppo con buoni dati di amministratore di sistema. Distrugge la difesa "Semplicemente non sai cosa stai facendo" e fa sì che debbano effettivamente rispondere al perché le cose sono incasinate.
FloppyDisk,

Risposte:


29

Questa non è certamente una buona pratica. Mentre è bene riavviare periodicamente i server solo per assicurarsi che tutto vada per il verso giusto, la necessità di riavviare di notte indica una grave perdita di memoria nell'applicazione.


1
Questo è un ottimo punto. Se non riavvii mai i server come suggerito di seguito, potresti non sapere che hai determinati servizi che non si avviano correttamente. Quindi, in caso di interruzione di corrente / riavvio forzato, il server potrebbe non tornare correttamente.
einstiien,

1
+1. Il mensile può avere più senso - non solo per un riavvio, ma per una normale procedura operativa per applicare patch, ecc. Facevo parte di un team di amministrazione per circa 1500 server, 24 ore su 24, 7 giorni su 7 e ogni mese c'era un "rolling" di 3 notti riavvio "programmato, a quel punto tutte le patch ecc. verrebbero inserite anche nei server. Ciò garantisce una certa stabilità di pianificazione e una procedura operativa standard.
TomTom,

12

C'è una differenza tra "Best Practice", cose che molte persone fanno per buone ragioni e "Common Practice", cose che molte persone fanno perché sono pigre e / o ignoranti.

Le applicazioni e i server (peggio) che devono essere regolarmente riavviati o riavviati per funzionare correttamente sono abbastanza comuni. Ma è anche una chiara indicazione che hai un bug critico.

Facendo in modo che SOP riavvii regolarmente un'applicazione, la tua azienda nasconde un grave bug sotto il tappeto. Questo è ingiustificabile, il bug deve essere coperto e schiacciato, o tornerà a morderti più tardi.

Idealmente, la tua azienda dovrebbe trovare uno sviluppatore migliore. Sfortunatamente, questo può portare a un sacco di lavoro per riscrivere grandi tratti del codice. Il fatto che lo sviluppatore o pensi che il codice scritto male sia accettabile o che non conosca abbastanza per riconoscere i sintomi del codice errato, suggerisce che la qualità del codice è bassa. Un buon sviluppatore sarà costituzionalmente incapace di lasciarlo in quello stato.

Dato che potresti non essere in grado di sostituire lo sviluppatore, alcuni suggerimenti:

  • Verifica se riesci a far esaminare meglio il codice dallo sviluppatore e segnalare la sua valutazione a qualcuno che può fare qualcosa al riguardo,
  • Dai un'occhiata agli strumenti di profilazione. Se hai le competenze e / o l'inclinazione, prova a profilare tu stesso il codice per trovare la perdita e segnalarla.

Anche senza entrare negli strumenti di profilazione orientati agli sviluppatori, ci sono molti strumenti orientati al sysadmin per la profilazione e il monitoraggio dell'utilizzo della memoria nelle applicazioni Java. In ogni caso, dovresti davvero impostare il monitoraggio della memoria (in particolare heap) sui tuoi server di produzione. Lo consiglierei anche se stavi eseguendo un codice di qualità. Potrebbe avvisarti in anticipo quando le tue app buggy stanno per cadere.

Ma meglio ancora, questi dovrebbero aiutarti a raccogliere prove che ci sia una perdita e potrebbero anche indicare dove si trova il problema nell'applicazione. Questo ti darà munizioni migliori per fare pressione affinché possa essere riparato.


2
In realtà, molte volte è l'infrastruttura che ha il bug e non il codice dello sviluppatore. Non abbiamo mai avuto problemi con le app J2EE che vanno periodicamente all'inferno su JBoss ma funzionano bene su altri server di applicazioni commerciali. Quindi potrebbe non essere colpa dello sviluppatore, ma piuttosto dell'ambiente di distribuzione.
rmalayter

6

È più probabile che lo sviluppatore dell'applicazione sostenga che è nel suo interesse per te coprirti il ​​culo lavorando intorno al lavoro non professionale che ha svolto. Potrebbe aver smesso di ammettere di aver scritto qualcosa con un'enorme perdita di memoria, ma non molto lontano.


3

Molte risposte qui sembrano cadere lontano dal segno delle soluzioni pratiche. Sembrano evitare il dogma - i server non dovrebbero mai essere riavviati - perché abbiamo 5 nove? tolleranza agli errori? Bene, è così che quando dovrebbero essere in piedi, stanno in piedi.

Inoltre, affermare che è la causa di cattivi sviluppatori o cattive pratiche di sviluppo non va alla radice del problema. Può essere, ma il più delle volte non è un codice applicativo non male. Questi problemi sono già integrati in gran parte del codice di sistema. Piccole perdite di memoria, problemi di heap Java e permgen se si eseguono molte piccole app mentre lo facciamo. I server moderni e il software che eseguono sono molto complessi. Quando pensi a cosa deve fare un server come Tomcat: servire file, elaborare richieste Web, comunicazioni di rete, comunicazioni di database, ecc., Sta facendo molto. IN quella pila c'è un diavolo di molte parti in movimento.

Il riavvio proattivo dei server consente di dire che una volta alla settimana o al mese è intelligente ed efficiente a mio avviso. Se si è raggruppati e si ruotano i server, non si dovrebbe influire sui client un po '. I clienti saranno molto più felici con le prestazioni dei tuoi server.


2

I server IMO dovrebbero essere chiusi il meno possibile. È più probabile che lo sviluppatore di app abbia creato un'applicazione scadente con una perdita di memoria.


Assolutamente - Penso che l'OP debba dire a qualcuno che deve trovare uno sviluppatore migliore.
Helvick,

2
C'è un motivo per cui le grandi aziende pagano un sacco di soldi per uptime di più nove e perché le aziende spendono migliaia per alimentatori ridondanti, RAID, gabbie hot swap, ecc., E certamente non è così che devono riavviare solo una volta al giorno.
Bart Silverstrim,

1

Ho uno script che riavvia uno dei nostri server web ogni notte, ma è più a causa di un'applicazione java scritta male che di uno standard industriale. Direi che non è raro riavviare i servizi Web. Ciò potrebbe comportare la pulizia della memoria che stai cercando e mettere a dura prova il server rispetto a un riavvio completo.


1

Preferibilmente un server non dovrebbe mai essere riavviato. Questo è uno dei motivi per cui abbiamo tolleranza d'errore . Se devi riavviare il server a causa delle tue applicazioni, allora le tue applicazioni perdono memoria e sono mal costruite.

Ho lavorato con Tomcat in precedenza e ho avuto lo stesso problema, la prossima volta che lavorerò con un contenitore Java ne cercherò un altro, forse JBoss o GlassFish.

Modifica: se devi riavviarlo ogni notte, probabilmente dovrai riavviarlo più spesso se / quando il carico aumenta. Assicurati di avere applicazioni solide, questa è la soluzione migliore.


4
Non credo di essere d'accordo quando dici che un server non dovrebbe mai essere riavviato. I server devono essere riavviati per applicare le correzioni di sicurezza. Non dovrebbero mai aver bisogno di essere riavviati per cose diverse dalla manutenzione programmata.
Zoredache,

È vero che alcuni server devono essere riavviati per applicare le correzioni di sicurezza. Ma se hai un sistema abbastanza buono, non devi riavviare il sistema. Esistono sistemi che funzionano anno dopo anno. Dovresti puntare all'alta disponibilità se stai offrendo un servizio su Internet. Se si dispone di un sistema a tolleranza d'errore come un cluster, è possibile rimuovere i nodi uno per uno e aggiornarli, quando il servizio è ancora in esecuzione.
Jonas,

1
Se hai solo un singolo server e / o hardware, non esiste l'alta disponibilità. Stai sbagliando se hai dato un solo server e il tuo servizio è così critico che non può tollerare 15 minuti di inattività ogni tanto per riavviare il server. Se si dispone di un'applicazione "zero downtime", si avrà un vero sistema HA con più nodi. In questo caso, riavviare periodicamente per patch, ecc. È abbastanza facile come hai sottolineato.
SEE

1
"La prossima volta ... cercherò un altro [contenitore Java diverso da Tomcat]". Non darei la colpa a Tomcat. Ho utilizzato i servizi di produzione per anni e ogni volta che ho avuto questo problema si è rivelato essere un problema di applicazione. "Assicurati di avere solide applicazioni, questa è la soluzione migliore" Esatto. Stranamente, ogni altro server di applicazioni Java che ho usato finora soffre di problemi simili quando eseguo il codice che perde su di esso. Detto questo, Tomcat 7 dovrebbe avere un qualche tipo di rilevamento proattivo della perdita di memoria.
Kief,

0

Il più frequente che abbia mai visto è settimanale. Dove sono ora siamo un negozio di windows e lo facciamo mensilmente nel fine settimana successivo a Patch Martedì.


Quando ho iniziato a lavorare in un posto, ho scoperto che avevano riavvii notturni in atto ... È stato orribile, soprattutto perché il server aveva circa l'1-2% di probabilità di non tornare correttamente (bug di temporizzazione nel driver del disco rigido ). Ci sono voluti del tempo per correggere le "cause" per i riavvii. Tempo ben trascorso.
Brian Knoblauch,

0

Anche se concordo sul fatto che non è ideale riavviare costantemente un server, ci sono situazioni in cui non è né colpa dello sviluppatore né la cosa sbagliata da fare. Abbiamo un'applicazione ben educata che perde memoria a causa di problemi nella libreria Python Popen. È una vecchia applicazione che verrà presto ritirata, ma è fondamentale per il business. Dobbiamo continuare a funzionare con un minimo sforzo per i nostri clienti. Quindi abbiamo appena deciso di riavviare il server ogni notte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.