Est-ce une bonne pratique de l'industrie de redémarrer périodiquement les serveurs Web? [fermé]

28

Nous avons une application Web (développée par un tiers) qui s'exécute sur Tomcat. Nous obtenons de très mauvaises performances de l'application. Le développeur de l'application prétend que c'est une bonne pratique de l'industrie de redémarrer les serveurs Web tous les soirs, de libérer toute la mémoire et de recommencer.

Du point de vue des clients qui atténue leur problème de plantage du site pendant la journée, mais du point de vue de SysAdmin, c'est une terrible solution.

Nous hébergeons 20 de ces applications sur différents serveurs pour différents clients, et la coordination pour s'assurer que tous sont redémarrés chaque nuit semble tout simplement fausse.

Géo
la source
41
Dites-leur que c'est la meilleure pratique de l'industrie pour les développeurs d'applications de trouver et de réparer leurs fuites de mémoire.
Bart Silverstrim
4
@Bart Oh snap !!
mfinni
1
+1 juste pour avoir fait ma journée (PS: je suis moi-même développeur)
RN.
1
A-t-il dit serveurs ou services? Nous avons une application tomcat qui nécessite un redémarrage du service tous les soirs. Si je ne le fais pas, à un moment donné dans le futur, il se bloquera. Je préfère ne pas le faire, mais le service pendant la journée est plus important.
Tubs
1
Démarrez la surveillance des fichiers journaux et téléchargez des outils de surveillance JVM. Si des choses se bloquent pendant la journée, vous devriez voir des exceptions ou quelque chose en cours d'enregistrement - même s'il s'agit d'exceptions par défaut. Cela vous donnera un aperçu de la nature générale de l'erreur. Regardez également l'utilisation de la mémoire JVM. Les chances sont vraiment bonnes, ils ont une fuite de mémoire et vous l'attraperez si vous regardez le tas JVM du serveur. Combattez les mauvais développements avec de bonnes données d'administrateur système. Cela détruit la défense "Vous ne savez tout simplement pas ce que vous faites" et les oblige à répondre pourquoi les choses ont mal tourné.
FloppyDisk

Réponses:

29

Ce n'est certainement pas une meilleure pratique. Bien qu'il soit bon de redémarrer périodiquement vos serveurs juste pour vous assurer que tout fonctionne correctement, le fait de devoir redémarrer tous les soirs indique une fuite de mémoire très grave dans l'application.

EEAA
la source
1
C'est un très bon point. Si vous ne redémarrez jamais vos serveurs comme suggéré ci-dessous, vous ne savez peut-être pas que certains services ne démarrent pas correctement. Ensuite, en cas de panne de courant / redémarrage dur, votre serveur peut ne pas revenir correctement.
einstiien
1
+1. Chaque mois peut avoir plus de sens - non seulement pour un redémarrage, mais pour une procédure de fonctionnement normal pour appliquer des correctifs, etc. redémarrage "programmé, auquel cas tous les correctifs, etc. seront également mis sur les serveurs. Cela donne une certaine stabilité de planification et une procédure d'exploitation standard.
TomTom
12

Il y a une différence entre les «meilleures pratiques», les choses que beaucoup de gens font pour de bonnes raisons, et les «pratiques courantes», les choses que beaucoup de gens font parce qu'ils sont paresseux et / ou ignorants.

Les applications et (pire) les serveurs qui doivent être régulièrement redémarrés ou redémarrés pour continuer à bien fonctionner sont assez courants. Mais c'est aussi une indication claire que vous avez un bug critique.

En le rendant SOP pour redémarrer une application régulièrement, votre entreprise cache un bug sérieux sous le tapis. C'est inexcusable, le bug doit être face cachée et écrasé, ou il reviendra vous mordre plus tard.

Idéalement, votre entreprise devrait trouver un meilleur développeur. Malheureusement, cela peut entraîner beaucoup de travail pour réécrire de grandes parties de votre code. Le fait que le développeur pense que du code mal écrit est acceptable ou n'en sait pas assez pour reconnaître les symptômes du code bogué suggère que la qualité du code est faible. Un bon développeur sera constitutionnellement incapable de le laisser dans cet état.

Étant donné que vous n'êtes peut-être pas en mesure de remplacer le développeur, quelques suggestions:

  • Vérifiez si un meilleur développeur peut réviser le code et signaler son évaluation à quelqu'un qui peut y faire quelque chose,
  • Jetez un œil aux outils de profilage. Si vous avez les compétences et / ou l'inclination, essayez de profiler le code vous-même pour trouver la fuite et la signaler.

Même sans entrer dans les outils de profilage orientés développeur, il existe de nombreux outils orientés sysadmin pour le profilage et la surveillance de l'utilisation de la mémoire sur les applications Java. Vous devez vraiment configurer la surveillance de la mémoire (en particulier le tas) sur vos serveurs de production dans tous les cas. Je recommanderais cela même si vous exécutez un code de qualité. Il peut vous avertir à l'avance lorsque vos applications de buggy sont sur le point de basculer.

Mais mieux encore, ceux-ci devraient vous aider à rassembler des preuves de fuite et peuvent même indiquer où se situe le problème dans l'application. Cela vous donnera de meilleures munitions pour faire pression pour qu'elles soient réparées.

Kief
la source
2
En fait, c'est souvent l'infrastructure qui a le bogue, et non le code du développeur. Nous n'avons eu aucun problème avec les applications J2EE qui vont périodiquement dans l'enfer de la collecte des ordures sur JBoss mais qui fonctionnent bien sur d'autres serveurs d'applications commerciaux. Ce n'est donc peut-être pas la faute du développeur, mais plutôt l'environnement de déploiement.
rmalayter
6

Le développeur de l'application prétend plus probablement qu'il est dans son intérêt de vous couvrir le cul en travaillant autour du travail non professionnel qu'il a fait. Il a peut-être cessé d'admettre qu'il avait écrit quelque chose avec une énorme fuite de mémoire, mais pas très loin.

Maximus Minimus
la source
3

De nombreuses réponses semblent ici bien loin de la marque des solutions pratiques. Ils semblent éviter le dogme - les serveurs ne doivent jamais être redémarrés - pourquoi avons-nous 5 neuf? tolérance aux pannes? Eh bien, alors quand ils sont censés être debout, ils restent debout.

En outre, affirmer que c'est la cause des mauvais développeurs ou des mauvaises pratiques de développement ne va pas à la racine du problème. Il peut être, mais le plus souvent, son code d'application pas mal. Ces problèmes sont déjà intégrés dans une grande partie du code système. Petites fuites de mémoire, problèmes de tas Java et de permgen si vous exécutez beaucoup de petites applications comme nous. Les serveurs modernes et les logiciels qu'ils exécutent sont très complexes. Lorsque vous pensez à ce qu'un serveur comme Tomcat doit faire - servir des fichiers, traiter des requêtes Web, des communications réseau, des communications de base de données, etc., il fait beaucoup. Dans cette pile, il y a beaucoup de pièces mobiles.

Le redémarrage proactif des serveurs permet de dire qu'une fois par semaine ou par mois est intelligent et efficace à mon avis. Si vous êtes en cluster et que vous faites pivoter les serveurs, vous ne devez pas affecter les clients un bit. Les clients seront beaucoup plus satisfaits des performances de vos serveurs.

Claude
la source
2

Les serveurs OMI doivent être arrêtés le moins possible. Il est plus probable que le développeur d'applications ait construit une application de mauvaise qualité avec une fuite de mémoire.

matpie
la source
Absolument - je pense que l'OP doit dire à quelqu'un dont il a besoin pour trouver un meilleur développeur.
Helvick
2
Il y a une raison pour laquelle les grandes entreprises paient beaucoup d'argent pour la disponibilité de plusieurs neuf et pourquoi les entreprises dépensent des milliers en alimentations redondantes, RAID, cages remplaçables à chaud, etc., et ce n'est certainement pas le cas car elles n'ont besoin de redémarrer qu'une fois par jour.
Bart Silverstrim
1

J'ai un script qui redémarre l'un de nos serveurs Web tous les soirs, mais c'est plus à cause d'une application java mal écrite plutôt que d'une norme de l'industrie. Je dirais cependant qu'il n'est pas rare de redémarrer les services Web. Cela pourrait effectuer le nettoyage de la mémoire que vous recherchez et mettre moins de pression sur le serveur par rapport à un redémarrage complet.

einstiien
la source
1

Un serveur ne doit de préférence jamais être redémarré. C'est l'une des raisons pour lesquelles nous avons une tolérance aux pannes . Si vous devez redémarrer votre serveur à cause de vos applications, vos applications perdent de la mémoire et sont mal construites.

J'ai déjà travaillé avec Tomcat, et j'ai eu le même problème, la prochaine fois que je travaillerai avec un conteneur Java, j'en chercherai un autre, peut-être JBoss ou GlassFish.

Edit: Si vous devez le redémarrer tous les soirs maintenant, vous devrez probablement le redémarrer plus souvent si / lorsque la charge augmente. Assurez-vous d'avoir des applications solides, c'est la meilleure solution.

Jonas
la source
4
Je ne pense pas que je sois d'accord lorsque vous dites qu'un serveur ne doit jamais être redémarré. Les serveurs doivent être redémarrés pour appliquer les correctifs de sécurité. Ils ne devraient cependant jamais avoir besoin d'être redémarrés pour d'autres tâches que la maintenance planifiée.
Zoredache
Il est vrai que certains serveurs doivent être redémarrés pour appliquer des correctifs de sécurité. Mais si vous avez un système suffisamment bon, vous n'avez pas besoin de redémarrer le système. Il existe des systèmes qui fonctionnent année après année. Vous devriez viser la haute disponibilité si vous servez un service sur Internet. Si vous avez un système tolérant aux pannes comme un cluster, vous pouvez supprimer les nœuds un par un et les mettre à jour, lorsque le service est toujours en cours d'exécution.
Jonas
1
Si vous ne disposez que d'un seul serveur et / ou d'un seul matériel, la Haute Disponibilité n'existe pas. Vous vous trompez si vous n'avez donné qu'un seul serveur et que votre service est si critique qu'il ne peut pas tolérer 15 minutes d'interruption de temps en temps pour redémarrer le serveur. Si vous avez une application « sans interruption de service », alors vous aurez un véritable système HA avec plusieurs noeuds. Dans ce cas, le redémarrage périodique des correctifs, etc. est assez facile, comme vous l'avez souligné.
EEAA
1
"La prochaine fois ... je chercherai un autre [conteneur Java autre que Tomcat]". Je ne blâmerais pas Tomcat. J'exécute des services de production dessus depuis des années, et chaque fois que j'ai eu ce problème, il s'est avéré que c'était un problème d'application. "Assurez-vous d'avoir des applications solides, c'est la meilleure solution" Exactement. Curieusement, tous les autres serveurs d'applications Java que j'ai utilisés jusqu'à présent souffrent de problèmes similaires lorsque j'exécute du code qui fuit dessus. Cela dit, Tomcat 7 est censé avoir une sorte de détection proactive des fuites de mémoire.
Kief
0

La plus fréquente que j'aie jamais vue est hebdomadaire. Où je suis maintenant, nous sommes un magasin Windows, et nous le faisons tous les mois le week-end suivant le Patch Tuesday.

Joel Coel
la source
Quand j'ai commencé à travailler à un endroit, j'ai constaté qu'ils avaient des redémarrages nocturnes en place ... C'était horrible, d'autant plus que le serveur avait environ 1-2% de chances de ne pas revenir correctement (bug de synchronisation dans le pilote du disque dur ). Il a fallu un certain temps pour corriger les «causes» des redémarrages. Temps bien dépensé.
Brian Knoblauch
0

Bien que je convienne qu'il n'est pas idéal de redémarrer un serveur en permanence, il y a des situations où ce n'est ni la faute du développeur ni la mauvaise chose à faire. Nous avons une application qui se comporte bien et qui fuit de la mémoire en raison de problèmes dans la bibliothèque Python Popen. Il s'agit d'une ancienne application qui sera bientôt supprimée, mais elle est critique pour l'entreprise. Nous devons le faire fonctionner avec un minimum de tracas pour nos clients. Nous avons donc décidé de redémarrer le serveur tous les soirs.

Nick Mellor
la source