¿Es una práctica recomendada en la industria reiniciar los servidores web periódicamente? [cerrado]


28

Tenemos una aplicación web (desarrollada por un tercero) que se ejecuta en Tomcat. Hemos estado obteniendo muy mal rendimiento de la aplicación. El desarrollador de la aplicación afirma que es una buena práctica de la industria reiniciar los servidores web todas las noches, liberar todo el uso de memoria y comenzar de nuevo.

Desde la perspectiva del cliente que alivia su problema de la caída del sitio durante el día, pero desde la perspectiva de SysAdmin es una solución horrible.

Hospedamos 20 de estas aplicaciones en diferentes servidores para diferentes clientes, y la coordinación de asegurarnos de que todas se reinicien todas las noches parece incorrecta.


41
Dígales que es la mejor práctica de la industria para los desarrolladores de aplicaciones encontrar y reparar sus pérdidas de memoria.
Bart Silverstrim

44
@Bart ¡Oh, qué bueno!
mfinni

1
+1 solo por alegrarme el día (PD: yo mismo soy desarrollador)
RN.

1
¿Dijo servidores o servicios? Tenemos una aplicación Tomcat que necesita reiniciar el servicio todas las noches. Si no lo hago, en algún momento en el futuro se bloqueará. Preferiría no hacerlo, pero el servicio durante el día es más importante.
Tinas

1
Obtenga un poco de monitoreo de archivos de registro y descargue algunas herramientas de monitoreo de JVM. Si las cosas se bloquean durante el día, debería ver excepciones o algo que se está registrando, incluso si son excepciones predeterminadas. Eso le dará una idea de la naturaleza general del error. Además, observe el uso de la memoria JVM. Las probabilidades son realmente buenas, tienen una pérdida de memoria y la detectará si observa el montón JVM del servidor. Combate el mal desarrollo con buenos datos de administrador de sistemas. Destruye la defensa "Simplemente no sabes lo que estás haciendo" y hace que realmente tengan que responder por qué las cosas se complicaron.
FloppyDisk

Respuestas:


29

Ciertamente, esta no es una mejor práctica. Si bien es bueno reiniciar sus servidores periódicamente solo para asegurarse de que todo salga correctamente, la necesidad de reiniciar cada noche apunta a una pérdida de memoria muy grave en la aplicación.


1
Este es un muy buen punto. Si nunca reinicia sus servidores como se sugiere a continuación, es posible que no sepa que tiene ciertos servicios que no se inician correctamente. Luego, en el caso de una falla de energía / reinicio completo, es posible que su servidor no regrese correctamente.
Einstiien

1
+1. Mensualmente puede tener más sentido, no solo para un reinicio, sino para un procedimiento de operación normal para aplicar parches, etc. Una vez formé parte de un equipo de administración durante aproximadamente 1500 servidores, 24/7, y cada mes hubo un "rollo de 3 noches" reiniciar "programado, en cuyo punto todos los parches, etc., también se colocarán en los servidores. Esto proporciona cierta estabilidad de planificación y un procedimiento operativo estándar.
TomTom

12

Hay una diferencia entre "Mejores prácticas", cosas que muchas personas hacen por buenas razones, y "Prácticas comunes", cosas que muchas personas hacen porque son flojas y / o ignorantes.

Las aplicaciones y (peor) los servidores que necesitan reiniciarse o reiniciarse de manera rutinaria para seguir funcionando bien son bastante comunes. Pero también es una clara indicación de que tiene un error crítico.

Al hacer que SOP reinicie una aplicación regularmente, su empresa está ocultando un error grave debajo de la alfombra. Esto es inexcusable, el error debe ser enfrentado y aplastado, o volverá a picarte más tarde.

Idealmente, su empresa debería encontrar un mejor desarrollador. Desafortunadamente, esto puede llevar a bastante trabajo para reescribir grandes extensiones de su código. El hecho de que el desarrollador piense que un código mal escrito es aceptable, o no sabe lo suficiente como para reconocer los síntomas del código defectuoso, sugiere que la calidad del código es baja. Un buen desarrollador será constitucionalmente incapaz de dejarlo en ese estado.

Dado que es posible que no esté en condiciones de reemplazar al desarrollador, algunas sugerencias:

  • Vea si puede hacer que un desarrollador mejor revise el código e informe su evaluación a alguien que pueda hacer algo al respecto,
  • Echa un vistazo a las herramientas de creación de perfiles. Si tiene las habilidades y / o inclinación, intente perfilar el código usted mismo para encontrar la fuga e informarlo.

Incluso sin entrar en las herramientas de creación de perfiles orientadas al desarrollador, hay muchas herramientas orientadas a los administradores de sistemas para crear perfiles y monitorear el uso de memoria en aplicaciones Java. En cualquier caso, debería configurar la supervisión de la memoria (especialmente el almacenamiento dinámico) en sus servidores de producción. Lo recomendaría incluso si estuviera ejecutando un código de calidad. Puede darle una advertencia anticipada cuando sus aplicaciones con errores están a punto de caerse.

Pero mejor aún, esto debería ayudarlo a reunir pruebas de que hay una fuga, e incluso puede indicar dónde está el problema en la aplicación. Esto le dará mejores municiones para presionar para que se repare.


2
En realidad, muchas veces es la infraestructura la que tiene el error, y no el código del desarrollador. No hemos tenido problemas con las aplicaciones J2EE que entran en el infierno de recolección de basura periódicamente en JBoss pero funcionan bien en otros servidores de aplicaciones commercail. Por lo tanto, podría no ser culpa del desarrollador, sino más bien el entorno de implementación.
rmalayter

6

Es más probable que el desarrollador de la aplicación afirme que le conviene cubrir su trasero trabajando en el trabajo no profesional que hizo. Es posible que haya dejado de admitir que escribió algo con una fuga de memoria enorme, pero no muy lejos de eso.


3

Muchas respuestas aquí parecen estar muy lejos de las soluciones prácticas. Parecen evitar el dogma: los servidores nunca deben reiniciarse, ¿por qué tenemos 5 nueves? ¿Tolerancia a fallos? Bueno, eso es así cuando se supone que deben estar despiertos, se quedan despiertos.

Además, afirmar que es la causa de los malos desarrolladores o las malas prácticas de desarrollo no va a la raíz del problema. Puede ser, pero la mayoría de las veces no es un mal código de aplicación. Estos problemas ya están integrados en gran parte del código del sistema. Pequeñas pérdidas de memoria, problemas de almacenamiento dinámico de Java y permgen si está ejecutando muchas aplicaciones pequeñas como lo hacemos nosotros. Los servidores modernos y el software que ejecutan son muy complejos. Cuando piensa en lo que un servidor como Tomcat tiene que hacer: servir archivos, procesar solicitudes web, comunicaciones de red, comunicaciones de bases de datos, etc., está haciendo mucho. EN esa pila hay muchas partes móviles.

Reiniciar proactivamente los servidores, digamos, una vez a la semana o al mes, es inteligente y eficiente en mi opinión. Si está agrupado y rota los servidores, no debería afectar a los clientes ni un bit. Los clientes estarán mucho más felices con el rendimiento de sus servidores.


2

Los servidores IMO deben cerrarse lo menos posible. Es más probable que el desarrollador de aplicaciones haya creado una aplicación de mala calidad con una pérdida de memoria.


Absolutamente: creo que el OP necesita decirle a alguien que necesita encontrar un mejor desarrollador.
Helvick

2
Hay una razón por la cual las grandes compañías pagan mucho dinero por múltiples tiempos de actividad y por qué las compañías gastan miles en fuentes de alimentación redundantes, RAID, jaulas de intercambio en caliente, etc., y ciertamente no es así, solo necesitan reiniciar una vez al día.
Bart Silverstrim

1

Tengo un script que reinicia uno de nuestros servidores web todas las noches, pero eso se debe más a una aplicación de Java mal escrita que a un estándar de la industria. Sin embargo, diría que no es raro reiniciar los servicios web. Esto podría hacer la limpieza de memoria que está buscando y ejercer menos presión sobre el servidor en comparación con un reinicio completo.


1

Un servidor preferiblemente nunca debe reiniciarse. Esa es una de las razones por las que tenemos tolerancia a fallas . Si tiene que reiniciar su servidor debido a sus aplicaciones, sus aplicaciones pierden memoria y están mal construidas.

He estado trabajando con Tomcat antes, y tuve el mismo problema, la próxima vez que trabaje con un contenedor Java buscaré otro, tal vez JBoss o GlassFish.

Editar: si tiene que reiniciarlo todas las noches ahora, entonces probablemente tenga que reiniciarlo con más frecuencia si / cuando la carga aumenta. Asegúrese de tener aplicaciones sólidas, esa es la mejor solución.


44
No creo estar de acuerdo cuando dices que un servidor nunca debe reiniciarse. Los servidores deben reiniciarse para aplicar correcciones de seguridad. Sin embargo, nunca deberían necesitar reiniciarse para otras cosas además del mantenimiento planificado.
Zoredache

Es cierto que algunos servidores deben reiniciarse para aplicar correcciones de seguridad. Pero si tiene un sistema lo suficientemente bueno, entonces no tiene que reiniciar el sistema. Existen sistemas que se ejecutan año tras año. Debe apuntar a la alta disponibilidad si está prestando un servicio en Internet. Si tiene un sistema tolerante a fallas como un clúster, puede eliminar los nodos uno por uno y actualizarlos, cuando el servicio aún se esté ejecutando.
Jonas

1
Si solo tiene un único servidor y / o pieza de hardware, no existe la Alta disponibilidad. Lo está haciendo mal si solo dio un servidor y su servicio es tan crítico que no puede tolerar 15 minutos de tiempo de inactividad de vez en cuando para reiniciar el servidor. Si tiene una aplicación de "tiempo de inactividad cero", tendrá un verdadero sistema de alta disponibilidad con múltiples nodos. En este caso, reiniciar periódicamente los parches, etc., es bastante fácil, como señaló.
EEAA

1
"La próxima vez ... buscaré otro [contenedor Java distinto de Tomcat]". No culparía a Tomcat. He estado ejecutando servicios de producción durante años, y cada vez que tuve este problema resultó ser un problema de aplicación. "Asegúrese de tener aplicaciones sólidas, esa es la mejor solución" Exactamente. Curiosamente, todos los demás servidores de aplicaciones Java que he usado hasta ahora sufren problemas similares cuando ejecuto código con fugas. Dicho esto, se supone que Tomcat 7 tiene algún tipo de detección de pérdida de memoria proactiva.
Kief

0

El más frecuente que he visto es semanal. Donde estoy ahora somos una tienda de escaparates, y lo hacemos mensualmente durante el fin de semana siguiente a Patch Tuesday.


Cuando comencé a trabajar en un lugar, descubrí que tenían reinicios nocturnos ... Eso fue horrible, especialmente porque el servidor tenía alrededor de un 1-2% de posibilidades de no volver a funcionar correctamente (error de sincronización en el controlador del disco duro ) Tomó algún tiempo para arreglar las "causas" de los reinicios. Tiempo bien gastado.
Brian Knoblauch

0

Si bien estoy de acuerdo en que no es ideal reiniciar un servidor constantemente, hay situaciones en las que no es culpa del desarrollador ni algo incorrecto. Tenemos una aplicación con buen comportamiento que pierde memoria debido a problemas en la biblioteca Python Popen. Es una aplicación antigua que se retirará pronto, pero es crítica para el negocio. Tenemos que mantenerlo funcionando con un mínimo de alboroto para nuestros clientes. Así que hemos decidido reiniciar el servidor todas las noches.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.